我正在使用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
这里到底发生了什么?感谢您的任何建议。
答案 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')))