我正在使用python sklearn的10倍交叉验证来计算梯度增强分类器的ROC AUC值。我以两种方式完成了此操作,我认为这些方法会给出相同的结果,但它们没有:(1( 将cross_val_predict
与method = 'predict_proba'
一起使用,通过交叉验证获得预测概率,然后使用roc_auc_score
计算每个折叠的 AUC,而不是 (2( 将cross_val_score
与scoring = 'roc_auc'
一起使用。结果并没有太大的不同,但令我困扰的是它们完全不同(请参阅下面的代码和输出(。谁能解释这种差异?
gbm = GradientBoostingClassifier(loss='deviance', n_estimators=initNumTrees, learning_rate=0.001, subsample=0.5, max_depth=1, random_state=12345, warm_start=True)
foldgen = StratifiedKFold(n_splits=10, shuffle=True, random_state=12345)
cv_probs = cross_val_predict(gbm, X_train, y_train, method='predict_proba', cv=foldgen, n_jobs=n_cores)[:,1]
auc = []
for train_index, test_index in foldgen.split(X_train, y_train):
auc.append(roc_auc_score(y_train[test_index], cv_probs[test_index]))
np.round(auc,4)
array([ 0.6713, 0.5878, 0.6315, 0.6538, 0.6709, 0.6724, 0.666 ,
0.6857, 0.6426, 0.6581])
对:
cv_values = cross_val_score(gbm, X_train, y_train, scoring='roc_auc', cv=foldgen, n_jobs=n_cores)
np.round(cv_values,4)
array([ 0.6391, 0.6159, 0.6673, 0.6613, 0.6748, 0.6754, 0.6869,
0.7107, 0.6552, 0.6602])
我遇到了同样的问题。
我阅读了文档并找到了这篇文章。之后,我开始使用方法make_scorer而不是文字字符串roc_auc_score
。
所以,这对我有用,现在当我使用cross_val_score
和StratifiedKFold
时,我可以得到相同的结果。
我希望有用。