首页 > 解决方案 > 如何为没有概率的二元分类器(svm)绘制 ROC 并计算 AUC?

问题描述

我有一些 SVM 分类器(LinearSVC)为测试集中的每个样本输出最终分类,比如

1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1

等等。

“真相”标签也类似于

1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1

我想用一些参数运行该 svm,并为 roc 曲线生成点,并计算 auc。

我可以自己做到这一点,但我确信有人在我之前就这样的情况下做到了。

不幸的是,我能找到的一切都是分类器返回概率的情况,而不是硬估计,比如这里这里

我认为会工作,但from sklearn.metrics import plot_roc_curve没有找到!

网上有什么适合我的吗?

谢谢

标签: pythonmachine-learningscikit-learnsvmroc

解决方案


您可以通过使用sklearn.svm.SVC并将probability参数设置为True.

如您所见:

概率:布尔值,可选(默认=假)

是否启用概率估计。这必须在调用 fit 之前启用,这会减慢该方法,因为它在内部使用 5 折交叉验证,并且 predict_proba 可能与 predict 不一致。在用户指南中阅读更多信息。

举个例子(细节省略):

from sklearn.svm import SVC
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score

.
.
.

model = SVC(kernel="linear", probability=True)
model.fit(X_train, y_train)

.
.
.

decision_scores = model.decision_function(X_test)
fpr, tpr, thres = roc_curve(y_test, decision_scores)
print('AUC: {:.3f}'.format(roc_auc_score(y_test, decision_scores)))

# roc curve
plt.plot(fpr, tpr, "b", label='Linear SVM')
plt.plot([0,1],[0,1], "k--", label='Random Guess')
plt.xlabel("false positive rate")
plt.ylabel("true positive rate")
plt.legend(loc="best")
plt.title("ROC curve")
plt.show()

你应该得到这样的东西:

在此处输入图像描述


请注意,这LinearSVC比 快得多SVC(kernel="linear"),尤其是在训练集非常大或特征很多的情况下。


推荐阅读