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") 有啥区别?