ROC下的sklearn svm area小于0.5用于训练数据
Posted
技术标签:
【中文标题】ROC下的sklearn svm area小于0.5用于训练数据【英文标题】:sklearn svm area under ROC less than 0.5 for training data 【发布时间】:2014-03-02 11:56:07 【问题描述】:我正在使用 sklearn v 0.13.1 svm 来尝试解决二进制分类问题。我使用 kfold 交叉验证并计算 roc 曲线 (roc_auc) 下的面积来测试我的模型的质量。但是,对于某些折叠,roc_auc 小于 0.5,即使对于训练数据也是如此。这不应该是不可能的吗?算法不应该总是有可能在它正在训练的数据上至少达到 0.5 吗?
这是我的代码:
classifier = svm.SVC(kernel='poly', degree=3, probability=True, max_iter=100000)
kf = cross_validation.KFold(len(myData), n_folds=3, indices=False)
for train, test in kf:
Fit = classifier.fit(myData[train], classVector[train])
probas_ = Fit.predict_proba(myData[test])
fpr, tpr, thresholds = roc_curve(classVector[test], probas_[:,1])
roc_auc = auc(fpr, tpr)
probas_ = Fit.predict_proba(myData[train])
fpr2, tpr2, thresholds2 = roc_curve(classVector[train], probas_[:,1])
roc_auc2 = auc(fpr2, tpr2)
print "Training auc: ", roc_auc2, " Testing auc: ", roc_auc
输出如下:
Training auc: 0.423920939062 Testing auc: 0.388436883629
Training auc: 0.525472613736 Testing auc: 0.565581854043
Training auc: 0.470917930528 Testing auc: 0.259344660194
曲线下面积小于0.5的结果有意义吗?原则上,如果训练值和测试值都
【问题讨论】:
【参考方案1】:确实,您可以颠倒您的预测,这就是您的 AUROC 小于 0.5 的原因。这样做通常不是问题,只需确保保持一致并且始终或从不反转它们。确保在训练集和测试集上都这样做。
这个问题的原因可能是classifier.fit
或roc_curve
函数误解了你传递的classVector。解决这个问题可能更好 - 阅读他们的文档以了解他们确切期望的数据。特别是,您没有指定哪个标签是正面的。查看roc_curve
的pos_label 参数并确保正确指定y_true
。
然而,令人担忧的是,你的一些 AUROC 在训练集上 > 0.5,而且大多数都接近它。这可能意味着您的分类器的性能并不比随机分类器好多少。
【讨论】:
您好,非常感谢您的回复。我尝试使用 pos_label,但它并没有解决问题。如果我使用 pos_label=1 我会得到上面显示的输出。如果我使用 pos_label=0 我会得到反转的输出(即 1 - 显示的值),这是我所期望的。我的 y_true 都是 0 或 1 并与正确的事件相关联。 svm 是否有另一种混淆方式?我已经阅读了文档,但找不到任何迹象表明有办法让 roc_auc 可能是从数据的奇怪相关性到非最佳内核的使用。没有最少的可重现代码是不可能的。 @user3276811 我在使用 LogisticRegression 时遇到了类似的问题。你找到 AUC @jibounet 如果您希望有机会获得超出我在这里所写内容的答案,请使用可重复的示例编辑问题。 ***.com/help/mcve以上是关于ROC下的sklearn svm area小于0.5用于训练数据的主要内容,如果未能解决你的问题,请参考以下文章
Sklearn机器学习——ROC曲线ROC曲线的绘制和AUC面积运用ROC曲线找到最佳阈值