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之间),但它们不会遵循任何合理的概率模型.
gre*_*ess 12
我看了看sklearn.svm.*系列中的apis.所有以下型号,例如,
有一个共同的界面供应一个
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.