不明白为什么我会得到 SVM 的逆 ROC 曲线(Python)

数据挖掘 机器学习 Python 支持向量机 奥克
2022-02-15 19:03:55

我构建了一个 SVM 分类器,但得到了一条逆 ROC 曲线。AUC 仅为 0.08。我使用相同的数据集来构建逻辑回归分类器和决策树分类器,它们的 ROC 曲线看起来不错。

这是我的 SVM 代码:

from sklearn.svm import SVC
svm = SVC(max_iter = 12, probability = True)
svm.fit(train_x_sm, train_y_sm)
svm_test_y = svm.predict(X = test_x)
svm_roc = plot_roc_curve(svm, test_x, test_y)
plt.show()

谁能告诉我我的代码有什么问题?

2个回答

对于任何分类问题,如果 AUC<0.5,您的表现并不比随机 (0.5) 好。

原因可能是:

  • 您的分类器在训练集上过度拟合,在测试集上表现很差。
  • 您的测试样本可能非常小。
  • 你的分类器给你这个类是-1的概率。因此,对于第 1 类,您得到一个预测(接近)0,对于 -1 类预测,您得到 1。如果您的 ROC 方法预计正 (+1) 预测高于负 (-1) 预测,则会得到一条反转曲线。

一个有效的策略是将预测简单地反转为:

invert_prob=1-prob 

参考:中华民国

一种可能的解决方法是删除max_iter = 12(这会将其设置为 scikit learn 默认值max_iter=-1)。从以下示例中可以看出,使用如此低的值可能会导致分数不佳:

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import plot_roc_curve
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)

model = SVC(max_iter=12, probability = True)
model.fit(X_train, y_train)

plot_roc_curve(model, X_test, y_test)

结果是

具有 max_iter=12 的 ROC

但是,再次执行完全相同的代码max_iter=12仍然)会给出完全不同的结果:

ROC max_iter=12

删除max_iter=12代码后,始终会产生更高的 AUC,大约在之间。0.950.99