【发布时间】:2020-04-06 09:39:36
【问题描述】:
我正在使用 sklearn cross_val_score 得到如下结果。
import numpy as np
my_results = cross_val_score(clf, X, y, cv=10, scoring = 'accuracy')
print(np.mean(my_results))
因此,这使我的交叉验证更加准确。要获得我的其他分数,我必须再次执行分类才能获得结果。
precision = cross_val_score(clf, X, y, cv=k_fold, scoring = 'precision_weighted')
#print(precision.mean())
recall = cross_val_score(clf, X, y, cv=k_fold, scoring = 'recall_weighted')
#print(recall.mean())
f1 = cross_val_score(clf, X, y, cv=k_fold, scoring = 'f1_weighted')
#print(f1.mean())
我只对accuracy, weighted average precision, weighted average recall, weighted avareage f-measure and auc 感兴趣,想通过只执行一次cross_val_score 来获得这些分数。
我遇到了sklearn的classification_report:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html。
但是,它不支持cross_val_score。我想知道在 sklearn 中是否有办法做到这一点。
如果需要,我很乐意提供更多详细信息。
编辑:
我尝试按照@t_e_o 的建议执行此操作。但是,它产生的结果是错误的。例如,考虑 iris 数据集。
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features.
y = iris.target
from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(random_state = 0, class_weight="balanced")
from sklearn.model_selection cross_val_score, cross_validate
cross_val_score(clf, X, y, cv=10, scoring = 'accuracy')
cross_validate(clf, X, y, cv=10, scoring = ('accuracy'))
我得到的结果如下。
#cross_val_score
array([0.53333333, 0.73333333, 0.66666667, 0.8 , 0.73333333,
0.6 , 0.86666667, 0.86666667, 0.6 , 0.8 ])
#cross_validate
{'fit_time': array([0.01695228, 0.01396275, 0.01296329, 0.01496124, 0.0149579 ,
0.01097107, 0.01395988, 0.01495957, 0.01396394, 0.0149579 ]),
'score_time': array([0.00199723, 0.00199652, 0.00199461, 0.00199294, 0.00199652,
0.00199389, 0.00199485, 0.00199366, 0.00099611, 0.00099897]),
'test_score': array([0.53333333, 0.73333333, 0.66666667, 0.8 , 0.73333333,
0.6 , 0.86666667, 0.86666667, 0.6 , 0.8 ]),
'train_score': array([0.94074074, 0.91851852, 0.92592593, 0.93333333, 0.91851852,
0.91851852, 0.91111111, 0.8962963 , 0.91851852, 0.91851852])}
【问题讨论】:
-
您得到了正确的结果。 cross_validate 函数的“test_score”与 cross_val_score 相同,即测试分数。 “cross_validate”函数用于多重评分,如scikit-learn.org/stable/modules/cross_validation.html 中所述。没有其他办法。要查找指标列表,请查看 sklearn.metrics.SCORERS.keys()
-
@ShaurabhBharti 感谢您的评论。 train_score 是什么意思?这是我们从训练数据中得到的结果吗?如果是这样,这个结果是否显示过度拟合? :)
-
如您所知,在交叉验证中,数据 X 被多次拆分为训练集和验证集,轮流进行。模型使用训练数据进行训练,其准确性使用验证数据进行测试。但是,您也可以针对训练数据(此处为“train_score”)测试模型。这可能会给你一些见解。例如,您的 test_score 和 train_score 之间的不匹配程度很高,因为您的数据没有被打乱。改组后,该类将平均分布在训练集和验证集之间,因此分数会更接近。
-
@ShaurabhBharti 感谢您的有用评论。你的意思是
stratified cross validation随机播放吗?如果我错了,请纠正我:)
标签: python scikit-learn