4

我不清楚我的测试集 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. 中华民国 #1, 0.63380692856
  3. 中华民国 #2, 0.624857088789
  4. 中华 #3, 0.636719967088
  5. 中华 #4, 0.623175499321
  6. 中华民国 #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 中运行。结果相同。

工作假设 我认为这个问题与数据的有序、分层性质和使用交叉验证的问题有关(我刚刚发现 gridsearchCV 给出了无意义的结果)。随着我对此进行更多研究,我将在这里添加我的发现。

4

0 回答 0