python - ROC 下的 sklearn svm 区域小于 0.5 用于训练数据

标签 python svm scikit-learn roc

我正在使用 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的结果有意义吗?原则上,如果训练值和测试值都小于 0.5,我可以反转每个点的预测,但我担心会出现问题。我想即使我给它完全随机的数据,算法应该在训练数据上达到 0.5?

最佳答案

事实上,您可以反转您的预测,这就是为什么您的 AUROC < 0.5。这样做通常不是问题,只需确保保持一致并且始终或从不反转它们。确保在训练集和测试集上都这样做。

此问题的原因可能是 classifier.fitroc_curve 函数误解了您传递的 classVector。最好解决这个问题 - 阅读他们的文档以了解他们确切期望的数据。特别是,您没有指定什么标签是正面的。查看pos_label roc_curve 的参数并确保正确指定了 y_true

但是,令人担忧的是,您的一些 AUROC 在训练集上 > 0.5,并且大多数都接近它。这可能意味着您的分类器的性能并不比随机好多少。

关于python - ROC 下的 sklearn svm 区域小于 0.5 用于训练数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21587639/

相关文章:

python - Pyspark DataFrame - 如何使用变量进行连接?

python - 如何使用pandas使用zstandard压缩parquet文件

matlab - 为什么 SVM 需要几 MB?

machine-learning - 单一分类器与剩余分类器

python - 数据均值/方差的变化会影响svm分类器吗?

scikit-learn - Scikit learn 预处理无法理解在 OneHotencoder 类中使用 min_Frequency 参数的输出

scikit-learn - 其他参数中的参数 - 在集成学习中使用带有随机森林的引导聚合

python - 这行是什么意思

python - 在 Python 中静音/取消静音扬声器

python - Pandas 数据框分配不更新数据框