【问题标题】:Why is cross_val_score different to when I calculate it manually?为什么 cross_val_score 与我手动计算时不同?
【发布时间】:2021-01-23 08:15:08
【问题描述】:

这是可重现示例代码:

from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_validate
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import balanced_accuracy_score

# define dataset
X, y = make_classification(n_samples=1000, weights = [0.3,0.7], n_features=100, n_informative=75, random_state=0)
# define the model
model = RandomForestClassifier(n_estimators=10, random_state=0)
# evaluate the model
n_splits=10
cv = StratifiedShuffleSplit(n_splits, random_state=0)
n_scores = cross_validate(model, X, y, scoring='balanced_accuracy', cv=cv, n_jobs=-1, error_score='raise')
# report performance
print('Accuracy: %0.4f' % (mean(n_scores['test_score'])))

bal_acc_sum = []
for train_index, test_index in cv.split(X,y):
    model.fit(X[train_index], y[train_index])                                      
    bal_acc_sum.append(balanced_accuracy_score(model.predict(X[test_index]),y[test_index]))

print(f"Accuracy: %0.4f" % (mean(bal_acc_sum)))

结果:

Accuracy: 0.6737
Accuracy: 0.7113

我自己计算的准确度结果总是高于交叉验证给我的结果。但它应该是一样的还是我错过了什么?相同的度量,相同的拆分(KFold 带来相同的结果),相同的固定模型(其他模型行为相同),相同的随机状态,但结果不同?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    这是因为,在您的手动计算中,您颠倒了 balanced_accuracy_score 中的参数顺序,这很重要 - 它应该是 (y_true, y_pred) (docs)。

    改变这个,你的手动计算变成:

    bal_acc_sum = []
    for train_index, test_index in cv.split(X,y):
        model.fit(X[train_index], y[train_index])                                      
        bal_acc_sum.append(balanced_accuracy_score(y[test_index], model.predict(X[test_index])))  # change order of arguments here
    
    print(f"Accuracy: %0.4f" % (mean(bal_acc_sum)))
    

    结果:

    Accuracy: 0.6737
    

    import numpy as np
    np.all(bal_acc_sum==n_scores['test_score'])
    # True
    

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      相关资源
      最近更新 更多