LinearSVC 和 roc_auc_score() 用于多类问题

Posted

技术标签:

【中文标题】LinearSVC 和 roc_auc_score() 用于多类问题【英文标题】:LinearSVC and roc_auc_score() for a multi-class problem 【发布时间】:2021-02-05 23:09:35 【问题描述】:

我有一个多类问题。我尝试使用来自sklearn 的函数metrics.roc_auc_score() 计算ROC-AUC 分数。该函数支持多类,但它需要估计概率,因为分类器需要有方法predict_proba()svm.LinearSVC() 没有)。

这是我尝试做的一个例子:

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split


# Get the data
iris = datasets.load_iris()
X, y = iris.data, iris.target

# Create the model
clf = SVC(kernel='linear', probability=True)

# Split the data in train and test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

# Train the model
clf.fit(X_train, y_train)

# Predict the test data
predicted = clf.predict(X_test)
predicted_proba = clf.predict_proba(X_test)
roc_auc = roc_auc_score(y_test, predicted_proba, multi_class='ovr')

我尝试将svm.SVC() 与线性内核一起使用,参数probability 将其设置为True。这允许我使用该函数中的方法predict_proba()。当你有一个大数据集时,与LinearSVC() 相比,问题是需要很长时间才能完成(这个例子真的退出了,因为样本量很少)。有没有办法使用LinearSVC()roc_auc_score() 来解决多类问题?

【问题讨论】:

请minimal reproducible example 这有帮助吗? scikit-learn.org/stable/auto_examples/model_selection/… @Grayrigel 问题是我无法用svm.LinearSVC() 计算估计概率。 【参考方案1】:

对于这样的情况,有一个专门的课程CalibratedClassifierCV

from sklearn import datasets
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split


# Get the data
iris = datasets.load_iris()
X, y = iris.data, iris.target

# Create the model
clf = CalibratedClassifierCV(LinearSVC(max_iter=10000))

# Split the data in train and test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

# Train the model
clf.fit(X_train, y_train)

# Predict the test data
predicted = clf.predict(X_test)
predicted_proba = clf.predict_proba(X_test)
roc_auc = roc_auc_score(y_test, predicted_proba, multi_class='ovr')

当您在 SVC 和 LinearSVC 之间进行选择时,您不妨查看When should one use LinearSVC or SVC?

【讨论】:

我更喜欢使用LinearSVC(),因为它更快,但正如我的问题所说,我必须计算 ROC-AUC 分数。我对你的代码有疑问,为什么max_iter 设置为 10000? 尝试不使用它,将警告视为原因 我明白了。我比较了你的方法给我的 ROC-AUC 分数 0.93 和使用 SVC() 给我 0.99 的结果。 这些是不同的算法......请参阅我提供的链接 如何使用上面的示例绘制多类的可靠性曲线?

以上是关于LinearSVC 和 roc_auc_score() 用于多类问题的主要内容,如果未能解决你的问题,请参考以下文章

评分='roc_auc' 的 cross_val_score 和 roc_auc_score 有啥区别?

sklearn学习:为什么roc_auc_score()和auc()有不同的结果?

LinearSVC 和 SVC(kernel="linear") 有啥区别?

为啥 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果?

Sklearn LinearSVC库中惩罚和损失参数的区别

LinearSVC() 与 SVC(kernel='linear') 不同