首页 > 解决方案 > 为什么分类器的 score 函数返回的结果与 sklearn 中的 cross_val_score 函数完全不同?

问题描述

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

但是奇怪的事情发生了。

决策树的 score 函数返回的准确率(0.88)远高于cross_val_score(0.84 左右)。

根据文档,评分函数还计算平均准确率。
它们都应用于测试数据集(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

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

标签: pythonmachine-learningscikit-learn

解决方案


你对做什么有误解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% 的数据训练,而你的 10 个分类器用你cross_val_score27% 的数据训练。

在机器学习中,我们经常看到更多的数据会得到更好的结果。

说清楚点。在您的代码中,以下两行将完全相同:

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')))

推荐阅读