我使用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分类器,我可以用来做这一点有效吗?
谢谢。
如果你想要速度,那么就用
sklearn.linear_model.LogisticRegression
替换SVM。它使用与LinearSVC
完全相同的训练算法,但使用对数损失而不是铰链损失。使用[1/(1+exp(-x))]将产生形式意义上的概率(介于0和1之间的数字),但它们不会遵循任何合理的概率模型。
scikit learn提供了CalibratedClassifierCV可用于解决此问题:它允许向LinearSVC或实现决策函数方法的任何其他分类器添加概率输出:
用户指南有一个很好的section在上面。默认情况下,CalibratedClassifierCV+LinearSVC将获得Platt尺度,但它也提供了其他选项(等渗回归方法),而且它不限于支持向量机分类器。
我查看了sklearn.svm.*家族中的api。所有以下型号,例如
有一个公共的interface来提供
模型的参数。如果该参数设置为True,libsvm将基于Platt Scaling的思想,在支持向量机输出的基础上训练概率变换模型。转换的形式类似于您指出的逻辑函数,但是在后处理步骤中学习了两个特定常数
A
和B
。有关更多详细信息,请参见本文stackoverflow。我真的不知道为什么LinearSVC不能使用这个后处理。否则,您只需调用
predict_proba(X)
来获得概率估计。当然,如果您只是应用一个朴素的logistic转换,它的性能将不如Platt Scaling这样的校准方法。如果你能理解platt scaling的下划线算法,也许你可以自己写或者贡献给scikit-learn-svm家族。:)也可以使用支持
predict_proba
的上述四种支持向量机变体。相关问题 更多 >
编程相关推荐