cross_val_score与scoring ='roc_auc'和roc_auc_score有什么区别?

Mic*_*ood 11 python machine-learning random-forest scikit-learn cross-validation

我对cross_val_score评分指标'roc_auc'和我可以直接导入和调用的roc_auc_score之间的区别感到困惑.

文档(http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter)表明指定scoring ='roc_auc'将使用sklearn.metrics.roc_auc_score.但是,当我使用scoring ='roc_auc'实现GridSearchCV或cross_val_score时,我会收到非常不同的数字,当我直接调用roc_auc_score时.

这是我的代码,以帮助演示我所看到的:

# score the model using cross_val_score

rf = RandomForestClassifier(n_estimators=150,
                            min_samples_leaf=4,
                            min_samples_split=3,
                            n_jobs=-1)

scores = cross_val_score(rf, X, y, cv=3, scoring='roc_auc')

print scores
array([ 0.9649023 ,  0.96242235,  0.9503313 ])

# do a train_test_split, fit the model, and score with roc_auc_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
rf.fit(X_train, y_train)

print roc_auc_score(y_test, rf.predict(X_test))
0.84634039111363313 # quite a bit different than the scores above!
Run Code Online (Sandbox Code Playgroud)

我觉得我在这里错过了一些非常简单的事情 - 很可能是我如何实施/解释其中一个评分指标的错误.

任何人都可以解释两个得分指标之间差异的原因吗?

Geo*_*Liu 9

这是因为你提供了预测的y而不是roc_auc_score中的概率.此功能采用分数,而不是分类标签.请尝试改为:

print roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])
Run Code Online (Sandbox Code Playgroud)

它应该给出与cross_val_score的先前结果类似的结果.有关详细信息,请参阅此帖子.

  • 你完全正确!如果我能停止哭泣,我会笑.谢谢! (3认同)

Ani*_*der 6

我刚刚在这里遇到了类似的问题。关键要点是cross_val_score使用KFold带有默认参数的策略进行训练测试拆分,这意味着拆分为连续的块而不是混洗。train_test_split另一方面进行洗牌拆分。

解决方案是明确拆分策略并指定改组,如下所示:

shuffle = cross_validation.KFold(len(X), n_folds=3, shuffle=True)
scores = cross_val_score(rf, X, y, cv=shuffle, scoring='roc_auc')
Run Code Online (Sandbox Code Playgroud)