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

che*_*het 29 python machine-learning svm scikit-learn

我使用scikit learn(LinearSVC)的线性SVM来解决二进制分类问题.我知道LinearSVC可以给我预测标签和决策分数,但我想要概率估计(对标签的信心).我想继续使用LinearSVC因为速度(与具有线性内核的sklearn.svm.SVC相比)使用逻辑函数将决策分数转换为概率是否合理?

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) 
Run Code Online (Sandbox Code Playgroud)

我想检查将概率估计简单地作为[1 /(1 + exp(-x))]来检查是否有意义,其中x是决策分数.

或者,我可以使用其他选项来分类,以便有效地执行此操作吗?

谢谢.

Mik*_*bov 85

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

 svm = LinearSVC()
 clf = CalibratedClassifierCV(svm) 
 clf.fit(X_train, y_train)
 y_proba = clf.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)

用户指南有一个很好的部分.默认情况下,CalibratedClassifierCV + LinearSVC会为您提供Platt缩放,但它也提供其他选项(等渗回归方法),并且它不仅限于SVM分类器.


Fre*_*Foo 15

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

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

  • 这应该是真正的答案.我用sklearn.linear_model.LogisticRegression替换了我的sklearn.svm.SVC,不仅得到了类似的ROC曲线,而且我的数据集(秒与小时)之间的时差非常大,甚至不值得一个时间.值得注意的是,你可以将你的求解器指定为'liblinear',这实际上会使它与LinearSVC完全相同. (4认同)
  • 正如Fred所指出的那样,我不认为这是获得SVM概率的合适解决方案。LR用于通过逻辑函数对独立信号进行概率估计。SVM旨在提供更好的准确性,并尝试不过度拟合,但是通过铰链功能获得的概率估计值不太准确。它惩罚了错误的预测。读者,请理解折衷方案,并为您的学习目标选择最合适的功能。我将亲自使用LinearSVC + CalibratedClassifierCV。 (3认同)

gre*_*ess 12

我看了看sklearn.svm.*系列中的apis.所有以下型号,例如,

  • sklearn.svm.SVC
  • sklearn.svm.NuSVC
  • sklearn.svm.SVR
  • sklearn.svm.NuSVR

有一个共同的界面供应一个

probability: boolean, optional (default=False) 
Run Code Online (Sandbox Code Playgroud)

模型的参数.如果此参数设置为True,则libsvm将基于Platt Scaling的概念在SVM的输出之上训练概率转换模型.转换的形式类似于您指出的逻辑函数,但是两个特定的常量A并且B在后处理步骤中学习.另请参阅此stackoverflow帖子以获取更多详细信息.

在此输入图像描述

我实际上不知道为什么这个后处理不适用于LinearSVC.否则,您只需要调用predict_proba(X)以获得概率估计值.

当然,如果你只是应用一个朴素的逻辑变换,它将不如Platt Scaling那样的校准方法.如果你能理解平台缩放的下划线算法,你可能可以编写自己的或者为scikit-learn svm系列做贡献.:)也可以随意使用上面支持的四种SVM变体predict_proba.

  • 它不可用,因为它没有内置到Liblinear中,它实现了`LinearSVC`,也因为`LogisticRegression`已经可用(尽管线性SVM + Platt缩放可能比直LR有一些好处,我从未尝试过).`SVC`中的Platt缩放来自LibSVM. (4认同)