我不清楚我的测试集AUC如何一直如此高,但我的训练集交叉验证AUC'rococ_auc'可以低得多 . 由于过度拟合,更常见的情况是反向(高训练集CV,低测试集) .

Why might my AUC using the test data be quite high (and consistent with a research paper I am using as a benchmark), where my CV AUC much lower?

from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics

fpr, tpr, thresholds = metrics.roc_curve(y_test, clf.predict_proba(x_test)[:,1]) 
auc_dt = metrics.auc(fpr,tpr)

print 'roc auc new', metrics.roc_auc_score(y_test, clf.predict_proba(x_test)[:,1])
print 'Test set DT AUC: ', auc_dt

结果是roc auc new 0.883120510099测试集AUC:0.883120510099

当我使用交叉验证

from sklearn.cross_validation import StratifiedKFold    
shuffle = StratifiedKFold(y_train, n_folds=10, shuffle=True)
scores = cross_val_score(clf, x_train, y_train, cv=shuffle, scoring='roc_auc')
print scores
print 'Average Training set DT CV score: ',scores.mean()

结果[0.64501863 0.64880271 0.62380773 0.63231963 0.59982753 0.63169843 0.62608849 0.62264435 0.63381149 0.60471224]

我认为这可能是一个问题,因为我不知道如何在cross_val_score的上下文中对分类器使用predict_proba,所以我使用了不同的方法(scikit docs中的类似方法):

cv = StratifiedKFold(y_train, n_folds=6, shuffle=True)
classifier = DecisionTreeClassifier()

mean_tpr = 0.0

for i, (train, test) in enumerate(cv):
    probas_ = classifier.fit(x_train.values[train], y_train.values[train]).predict_proba(x_train.values[test])
    fpr, tpr, thresholds = metrics.roc_curve(y_train.values[test], probas_[:,1])
    roc_auc = metrics.auc(fpr, tpr)
    print ('roc # %s, %s'%(i,roc_auc))

结果

  • roc#0,0.633910529504

  • roc#1,0.63380692856

  • roc#2,0.624857088789

  • roc#3,0.636719967088

  • roc#4,0.623175499321

  • roc#5,0.613694032062

更多信息:订购的数据集,所以我使用shuffle参数 . 如果没有shuffle参数,我会得到从0到非常高的结果(代表有序数据集) .

我整天都在深入研究AUC和CV的使用,但无法弄清楚这一点 .

KNeighborsClassifier有一个类似的结果,我使用metrics.roc_curve和metrics.auc获得更高的AUC,但是上述CV方法的CV AUC显着降低 .

如果它有帮助,测试集上的混淆矩阵如下:

真阴性:3550假阴性:116真阳性:335假阳性:118

使用准确性作为得分手可以让我获得更好的CV分数 .

任何想法都会有帮助 .

编辑:我也在测试集上运行了CV(AUC得分很高),我的CV AUC与上面大致相同(略差) .

我还使用了一个非常精简的脚本版本,我在其中导入数据,将独立变量与因变量分开,使用get_dummies对分类变量进行编码,并在CV中单独运行分类器 . 结果相同 .

Working hypothesis 我认为这个问题与使用交叉验证的数据和问题的有序,分层性质有关(我刚发现gridsearchCV给出了无意义的结果) . 当我对此进行更多研究时,我将在此处添加我的发现 .