将LinearSVC的决策函数转换为概率(Scikit learn python)

2024-04-25 07:46:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用scikit learn(LinearSVC)中的线性支持向量机来解决二进制分类问题。我知道LinearSVC可以给我预测的标签和决策得分,但我想要概率估计(对标签的信心)。我想继续使用linear SVC,因为它的速度很快(与sklearn.svm.SVC的线性核函数相比),使用logistic函数将决策得分转换为概率是否合理?

import sklearn.svm as suppmach
# Fit model:
svmmodel=suppmach.LinearSVC(penalty='l1',C=1)
predicted_test= svmmodel.predict(x_test)
predicted_test_scores= svmmodel.decision_function(x_test) 

我想检查一下简单地获得概率估计值[1/(1+exp(-x))是否有意义,其中x是决策得分。

另外,还有其他选项wrt分类器,我可以用来做这一点有效吗?

谢谢。


Tags: 函数test线性标签sklearnscikit概率learn
3条回答

如果你想要速度,那么就用sklearn.linear_model.LogisticRegression替换SVM。它使用与LinearSVC完全相同的训练算法,但使用对数损失而不是铰链损失。

使用[1/(1+exp(-x))]将产生形式意义上的概率(介于0和1之间的数字),但它们不会遵循任何合理的概率模型。

scikit learn提供了CalibratedClassifierCV可用于解决此问题:它允许向LinearSVC或实现决策函数方法的任何其他分类器添加概率输出:

 svm = LinearSVC()
 clf = CalibratedClassifierCV(svm) 
 clf.fit(X_train, y_train)
 y_proba = clf.predict_proba(X_test)

用户指南有一个很好的section在上面。默认情况下,CalibratedClassifierCV+LinearSVC将获得Platt尺度,但它也提供了其他选项(等渗回归方法),而且它不限于支持向量机分类器。

我查看了sklearn.svm.*家族中的api。所有以下型号,例如

  • sklearn.svm.SVC学习机
  • sklearn.svm.NuSVC学习机
  • 学习支持向量机
  • sklearn.svm.NuSVR学习机

有一个公共的interface来提供

probability: boolean, optional (default=False) 

模型的参数。如果该参数设置为True,libsvm将基于Platt Scaling的思想,在支持向量机输出的基础上训练概率变换模型。转换的形式类似于您指出的逻辑函数,但是在后处理步骤中学习了两个特定常数AB。有关更多详细信息,请参见本文stackoverflow

enter image description here

我真的不知道为什么LinearSVC不能使用这个后处理。否则,您只需调用predict_proba(X)来获得概率估计。

当然,如果您只是应用一个朴素的logistic转换,它的性能将不如Platt Scaling这样的校准方法。如果你能理解platt scaling的下划线算法,也许你可以自己写或者贡献给scikit-learn-svm家族。:)也可以使用支持predict_proba的上述四种支持向量机变体。

相关问题 更多 >