为什么分类器的score函数与sklearn中的cross_val_score函数返回的结果完全不同?

时间:2019-05-21 10:52:24

标签: python machine-learning scikit-learn

我正在使用sklearn训练决策树分类器。

但是发生了一件奇怪的事情。

决策树的得分函数(0.88)返回的精度远高于cross_val_score(约0.84)。

根据document,得分函数还计算平均准确度。
两者都应用于测试数据集(87992个样本)。
交叉验证是基于子集进行计算的,如果结果略有不同,这是有意义的,但是现在差异非常大。

from sklearn.tree import DecisionTreeClassifier  
from sklearn.model_selection import cross_val_score

clf_tree = DecisionTreeClassifier()
clf_tree.fit(X_train, y_train)

print('Accuracy: %f' % clf_tree.score(X_test, y_test))
print((cross_val_score(clf_tree, X_test, y_test, cv=10, scoring='accuracy')))
print(classification_report(clf_tree.predict(X_test), y_test))

输出:

Accuracy: 0.881262

[0.84022727 0.83875    0.843164   0.84020911 0.84714172 0.83929992 0.83873167 0.8422548  0.84089101 0.84111831]

              precision    recall  f1-score   support

           0       0.89      0.88      0.88     44426
           1       0.88      0.89      0.88     43566

   micro avg       0.88      0.88      0.88     87992
   macro avg       0.88      0.88      0.88     87992
weighted avg       0.88      0.88      0.88     87992

这里到底发生了什么?感谢您的任何建议。

1 个答案:

答案 0 :(得分:3)

您对cross_val_score的操作有误解。

假设您有一个包含100行的数据集,并将其拆分为训练(70%)和测试(30%),然后在代码的以下部分中将训练70行并使用30行进行测试:

clf_tree = DecisionTreeClassifier()
clf_tree.fit(X_train, y_train) 
print('Accuracy: %f' % clf_tree.score(X_test, y_test))

您稍后致电

print((cross_val_score(clf_tree, X_test, y_test, cv=10, scoring='accuracy')))

这里cross_val_score提取您的30行测试数据并将其分为10部分。然后,它使用9个部分进行训练,并使用1个部分来测试完全经过训练的新分类器。重复该过程,直到对每个块进行一次测试(10次)。

因此,最后,您的第一个分类器接受了70%的数据训练,而cross_val_score的10个分类器接受了27%的数据训练。

通常在机器学习中,我们看到更多的数据可以获得更好的结果。

明确点。在您的代码中,以下两行将完全相同:

print((cross_val_score(clf_tree, X_test, y_test, cv=10, scoring='accuracy')))

print((cross_val_score(DecisionTreeClassifier(), X_test, y_test, cv=10, scoring='accuracy')))