use*_*811 5 python svm roc scikit-learn
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
Training auc: 0.423920939062 Testing auc: 0.388436883629
Training auc: 0.525472613736 Testing auc: 0.565581854043
Training auc: 0.470917930528 Testing auc: 0.259344660194
Run Code Online (Sandbox Code Playgroud)
曲线下面积小于 0.5 的结果有意义吗?原则上,如果训练值和测试值都 <0.5,我可以反转每个点的预测,但我担心会出错。我想即使我给它完全随机的数据,算法在训练数据上应该达到0.5?
事实上,您可以反转您的预测,这就是您的 AUROC < 0.5 的原因。这样做通常不是问题,只需确保一致并且始终或从不反转它们即可。确保在训练集和测试集上都这样做。
此问题的原因可能是classifier.fit或roc_curve函数误解了您传递的 classVector。最好解决这个问题 - 阅读他们的文档以了解他们到底期望什么数据。特别是,您没有指定哪个标签是阳性的。请参阅pos_label参数roc_curve并确保y_true已正确指定。
然而,令人担忧的是,您的一些 AUROC 在训练集上> 0.5,并且大多数都接近它。这可能意味着你的分类器的性能并不比随机的好多少。
| 归档时间: |
|
| 查看次数: |
5572 次 |
| 最近记录: |