gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:05 26 4
gpt4 key购买 nike

我正在使用 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

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

最佳答案

您对 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 个部分来测试全新训练的分类器。这将重复进行,直到每个 block 都被测试一次(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')))

关于python - 为什么分类器的score函数返回的结果与sklearn中的cross_val_score函数完全不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56236724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com