Python scikit学习高测试集AUC,但低训练集交叉验证AUC
我不清楚为什么我的测试集AUC会如此之高,但我的训练集交叉验证AUC‘roc_AUC’会如此之低。由于过度拟合,更常见的情况是相反的(高训练集CV,低测试集) 为什么我使用测试数据的AUC会很高(并且与我使用的作为基准的研究论文一致),而我的简历AUC会低很多?Python scikit学习高测试集AUC,但低训练集交叉验证AUC,python,scikit-learn,cross-validation,auc,Python,Scikit Learn,Cross Validation,Auc,我不清楚为什么我的测试集AUC会如此之高,但我的训练集交叉验证AUC‘roc_AUC’会如此之低。由于过度拟合,更常见的情况是相反的(高训练集CV,低测试集) 为什么我使用测试数据的AUC会很高(并且与我使用的作为基准的研究论文一致),而我的简历AUC会低很多? from sklearn.tree import DecisionTreeClassifier from sklearn import metrics fpr, tpr, thresholds = metrics.roc_curve(
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
结果是
中华民国auc新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_分数的上下文中对分类器使用predict_proba,所以我使用了一种不同的方法(类似于scikit文档中的方法):
结果
我相信这个问题与数据的有序、分层性质有关,并使用交叉验证(我刚刚发现gridsearchCV给出了无意义的结果)。随着我对此进行更多的研究,我将在这里添加我的发现。也许这更像是StackExchange CrossValidaion的问题,而不是它本身的问题?@Moritz,您好Moritz,最初这是两者之间的一个折衷问题,因为我不确定这是与实现algos有关的问题,还是与一些基本的统计特性有关。由于我在这个问题上做了更多的工作(并提出了我的工作宣传),我相信它更适合交叉验证,但我不想重复发布,也不知道如何将这个问题从SO转移到CV。我很感激你的建议。每个小组的成员人数是否大致相同?只是一个没有深入研究的想法:如果不使用shuffle,可能会得到一个糟糕的表示,因为数据集是不均匀的?免责声明:这完全是胡说八道。我突然想到了。嗯,但是(正如你所说的)情况正好相反round@Moritz,谢谢你的想法。我使用StratifiedKFold来确保因变量中存在相同的比率。
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))