我对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 . 但是,当我使用得分= '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!
我觉得我在这里遗漏了一些非常简单的东西 - 很可能是我如何实施/解释其中一个评分指标的错误 .
任何人都可以了解两个得分指标之间差异的原因吗?
3 回答
这是因为你提供了预测的y而不是roc_auc_score中的概率 . 此功能采用分数,而不是分类标签 . 请尝试改为:
它应该给cross_val_score的先前结果提供类似的结果 . Refer to this post for more info .
我刚遇到类似的问题here . 关键的一点是
cross_val_score
使用带有默认参数的KFold策略来进行列车测试分割,这意味着分成连续的块而不是混乱 . 另一方面,train_test_split
进行了混乱分割 .解决方案是明确拆分策略并指定混洗,如下所示:
自己陷入这个问题,挖了一下就找到了答案 . 分享爱情 .
实际上有两个半问题 .
你需要使用相同的Kfold来比较分数(火车/测试的相同分割);
您需要将概率提供给
roc_auc_score
(使用predict_proba()
方法) . 但是,一些估算器(如SVC)没有predict_proba()
方法,然后使用decision_function()
方法 .这是一个完整的例子:
使用两个估算器
拆分火车/测试装置 . 但是把它保存到我们可以重用的变量中 .
将其输入
GridSearchCV
并保存分数 . 请注意,我们正在通过fourfold
.将其输入
cross_val_score
并保存分数 .有时候,你想循环并计算几个不同的分数,所以这就是你使用的 .
我们是否全面拥有相同的分数?
但是,有时我们的估算器没有
predict_proba()
方法 . 所以,根据example,我们这样做: