scikit学习高测试集AUC但低训练集交叉验证AUC

时间:2016-11-15 21:27:32

标签: python scikit-learn cross-validation auc

我不清楚我的测试集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))

结果

  1. roc#0,0.633910529504
  2. roc#1,0.63380692856
  3. roc#2,0.624857088789
  4. roc#3,0.636719967088
  5. roc#4,0.623175499321
  6. roc#5,0.613694032062
  7. 更多信息:订购了数据集,因此我使用了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给出了无意义的结果)。当我对此进行更多研究时,我将在此处添加我的发现。

0 个答案:

没有答案