python - 为什么分类器的 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
这里到底发生了什么?感谢您的任何建议。
解决方案
你对做什么有误解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_score
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')))
推荐阅读
- regex - 正则表达式 sed 问题
- java - 使用 ActiveMQ 在 Spring Websocket STOMP 中路由订阅
- python - Cython 尝试编译两次,但失败了
- java - Javafx Webview 更改文本字段内容
- json - ReactJS,发出 POST 请求
- python - 根据 Tensorflow 中的其他特定张量重新洗牌张量
- javascript - 将选择选项保存到变量中的问题
- php - Zend Framework 2 中的异常处理
- java - 如何将 MediaMetadataRetriever SetDataSource 用于外部存储中的文件
- java - 星号-Java AGI。DefaultAgiServer 在启动方法运行时冻结