cross_val_score with scoring='roc_auc' 和 roc_auc_score 有什么区别?
What is the difference between cross_val_score with scoring='roc_auc' and roc_auc_score?
我对 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!
我觉得我在这里遗漏了一些非常简单的东西——很可能是我 implementing/interpreting 评分指标之一的错误。
任何人都可以阐明两个评分指标之间存在差异的原因吗?
我只是 运行 进入一个类似的问题 . The key takeaway there was that cross_val_score
uses the KFold
策略,使用默认参数进行训练测试拆分,这意味着拆分成连续的块而不是混洗。另一方面,train_test_split
进行随机拆分。
解决办法是明确split策略并指定shuffling,像这样:
shuffle = cross_validation.KFold(len(X), n_folds=3, shuffle=True)
scores = cross_val_score(rf, X, y, cv=shuffle, scoring='roc_auc')
这是因为您提供了预测的 y 而不是 roc_auc_score 中的概率。此函数采用分数,而不是分类标签。尝试这样做:
print roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])
它应该给出与之前 cross_val_score 的结果类似的结果。 Refer to this post for more info.
运行 我自己解决了这个问题,经过一番挖掘后找到了答案。为爱而分享。
其实有两个半题
- 你需要使用相同的Kfold来比较分数(train/test的相同拆分);
- 您需要将概率输入
roc_auc_score
(使用 predict_proba()
方法)。但是,一些估算器(如 SVC)没有 predict_proba()
方法,然后您使用 decision_function()
方法。
这是一个完整的例子:
# Let's use the Digit dataset
digits = load_digits(n_class=4)
X,y = digits.data, digits.target
y[y==2] = 0 # Increase problem dificulty
y[y==3] = 1 # even more
使用两个估计器
LR = LogisticRegression()
SVM = LinearSVC()
拆分 train/test 集合。但是把它保存到我们可以重用的变量中。
fourfold = StratifiedKFold(n_splits=4, random_state=4)
将它喂给 GridSearchCV
并保存分数。注意我们传递的是 fourfold
.
gs = GridSearchCV(LR, param_grid={}, cv=fourfold, scoring='roc_auc', return_train_score=True)
gs.fit(X,y)
gs_scores = np.array([gs.cv_results_[k][0] for k in gskeys])
将它喂给 cross_val_score
并保存分数。
cv_scores = cross_val_score(LR, X, y, cv=fourfold, scoring='roc_auc')
有时候,你想循环计算几个不同的分数,所以这就是你使用的。
loop_scores = list()
for idx_train, idx_test in fourfold.split(X, y):
X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test]
LR.fit(X_train, y_train)
y_prob = LR.predict_proba(X_test)
auc = roc_auc_score(y_test, y_prob[:,1])
loop_scores.append(auc)
我们的分数是否全面相同?
print [((a==b) and (b==c)) for a,b,c in zip(gs_scores,cv_scores,loop_scores)]
>>> [True, True, True, True]
但是,有时我们的估算器没有 predict_proba()
方法。所以,根据这个example,我们这样做:
for idx_train, idx_test in fourfold.split(X, y):
X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test]
SVM.fit(X_train, y_train)
y_prob = SVM.decision_function(X_test)
prob_pos = (y_prob - y_prob.min()) / (y_prob.max() - y_prob.min())
auc = roc_auc_score(y_test, prob_pos)
我对 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!
我觉得我在这里遗漏了一些非常简单的东西——很可能是我 implementing/interpreting 评分指标之一的错误。
任何人都可以阐明两个评分指标之间存在差异的原因吗?
我只是 运行 进入一个类似的问题 cross_val_score
uses the KFold
策略,使用默认参数进行训练测试拆分,这意味着拆分成连续的块而不是混洗。另一方面,train_test_split
进行随机拆分。
解决办法是明确split策略并指定shuffling,像这样:
shuffle = cross_validation.KFold(len(X), n_folds=3, shuffle=True)
scores = cross_val_score(rf, X, y, cv=shuffle, scoring='roc_auc')
这是因为您提供了预测的 y 而不是 roc_auc_score 中的概率。此函数采用分数,而不是分类标签。尝试这样做:
print roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])
它应该给出与之前 cross_val_score 的结果类似的结果。 Refer to this post for more info.
运行 我自己解决了这个问题,经过一番挖掘后找到了答案。为爱而分享。
其实有两个半题
- 你需要使用相同的Kfold来比较分数(train/test的相同拆分);
- 您需要将概率输入
roc_auc_score
(使用predict_proba()
方法)。但是,一些估算器(如 SVC)没有predict_proba()
方法,然后您使用decision_function()
方法。
这是一个完整的例子:
# Let's use the Digit dataset
digits = load_digits(n_class=4)
X,y = digits.data, digits.target
y[y==2] = 0 # Increase problem dificulty
y[y==3] = 1 # even more
使用两个估计器
LR = LogisticRegression()
SVM = LinearSVC()
拆分 train/test 集合。但是把它保存到我们可以重用的变量中。
fourfold = StratifiedKFold(n_splits=4, random_state=4)
将它喂给 GridSearchCV
并保存分数。注意我们传递的是 fourfold
.
gs = GridSearchCV(LR, param_grid={}, cv=fourfold, scoring='roc_auc', return_train_score=True)
gs.fit(X,y)
gs_scores = np.array([gs.cv_results_[k][0] for k in gskeys])
将它喂给 cross_val_score
并保存分数。
cv_scores = cross_val_score(LR, X, y, cv=fourfold, scoring='roc_auc')
有时候,你想循环计算几个不同的分数,所以这就是你使用的。
loop_scores = list()
for idx_train, idx_test in fourfold.split(X, y):
X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test]
LR.fit(X_train, y_train)
y_prob = LR.predict_proba(X_test)
auc = roc_auc_score(y_test, y_prob[:,1])
loop_scores.append(auc)
我们的分数是否全面相同?
print [((a==b) and (b==c)) for a,b,c in zip(gs_scores,cv_scores,loop_scores)]
>>> [True, True, True, True]
但是,有时我们的估算器没有
predict_proba()
方法。所以,根据这个example,我们这样做:
for idx_train, idx_test in fourfold.split(X, y):
X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test]
SVM.fit(X_train, y_train)
y_prob = SVM.decision_function(X_test)
prob_pos = (y_prob - y_prob.min()) / (y_prob.max() - y_prob.min())
auc = roc_auc_score(y_test, prob_pos)