【问题标题】:Why the classifier's score function return a quite different result from cross_val_score function in sklearn?为什么分类器的 score 函数返回的结果与 sklearn 中的 cross_val_score 函数完全不同?
【发布时间】:2019-05-21 19:16:27
【问题描述】:

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

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

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

根据document,score函数也计算平均准确率。
它们都应用于测试数据集(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

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

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我在寻找解决方案时也遇到了问题。
    • @Florian 谢谢。现在一切都说得通了。基本上,cross_val_score 函数再次训练模型。
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2020-12-18
    • 2020-08-25
    • 2014-08-18
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多