Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scikit学习高测试集AUC,但低训练集交叉验证AUC_Python_Scikit Learn_Cross Validation_Auc - Fatal编程技术网

Python scikit学习高测试集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(

我不清楚为什么我的测试集AUC会如此之高,但我的训练集交叉验证AUC‘roc_AUC’会如此之低。由于过度拟合,更常见的情况是相反的(高训练集CV,低测试集)

为什么我使用测试数据的AUC会很高(并且与我使用的作为基准的研究论文一致),而我的简历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
结果是 中华民国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文档中的方法):

结果

  • 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_曲线和metrics.AUC获得了更高的AUC,但使用上述CV方法得到的CV AUC却显著更低

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

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

    使用准确度作为记分员可以让我在简历中获得更好的分数

    任何想法都会有帮助

    编辑:我也在测试集上运行了CV(AUC得分很高),我得到了与上述大致相同的CV AUC(只是稍微差一点)

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

    工作假设
    我相信这个问题与数据的有序、分层性质有关,并使用交叉验证(我刚刚发现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))