我不清楚我的测试集AUC如何一直如此高,但我的训练集交叉验证了AUC' roc_auc'可以低得多。由于过度拟合,更常见的情况是反向(高训练集CV,低测试集)。
为什么我的AUC使用测试数据相当高(并且与我用作基准的研究论文一致),我的CV AUC低得多?
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))
结果
更多信息:订购了数据集,因此我使用了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中单独运行分类器。结果相同。
工作假设 我认为这个问题与使用交叉验证的数据和问题的有序,分层性质有关(我刚发现gridsearchCV给出了无意义的结果)。当我对此进行更多研究时,我将在此处添加我的发现。