转换线性SVC';s概率决策函数(Scikit学习python)
我使用scikit学习中的线性SVM(LinearSVC)来解决二值分类问题。我知道LinearSVC可以给我预测的标签和决策分数,但我需要概率估计(标签的置信度)。我想继续使用LinearSVC,因为它的速度很快(与使用线性核的sklearn.svm.SVC相比),使用逻辑函数将决策得分转换为概率是否合理转换线性SVC';s概率决策函数(Scikit学习python),python,machine-learning,scikit-learn,svm,Python,Machine Learning,Scikit Learn,Svm,我使用scikit学习中的线性SVM(LinearSVC)来解决二值分类问题。我知道LinearSVC可以给我预测的标签和决策分数,但我需要概率估计(标签的置信度)。我想继续使用LinearSVC,因为它的速度很快(与使用线性核的sklearn.svm.SVC相比),使用逻辑函数将决策得分转换为概率是否合理 import sklearn.svm as suppmach # Fit model: svmmodel=suppmach.LinearSVC(penalty='l1',C=1) predi
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.svm.*家族中的API。以下所有型号,例如:
- sklearn.svm.SVC
- sklearn.svm.NuSVC
- sklearn.svm.SVR
- sklearn.svm.NuSVR
probability: boolean, optional (default=False)
模型的参数。如果该参数设置为True,则libsvm将基于概率的思想在SVM的输出之上训练概率变换模型。正如您所指出的,转换的形式类似于逻辑函数,但是在后处理步骤中学习了两个特定常数a
和B
。有关更多详细信息,请参阅本文
我真的不知道为什么LinearSVC不能使用这种后处理。否则,您只需调用predict\u proba(X)
即可获得概率估计
当然,如果您只是应用一个简单的逻辑转换,那么它的性能将不如像这样的校准方法。如果您能够理解platt scaling的下划线算法,您可能可以编写自己的或为scikit learn svm系列做出贡献。:)如果您想提高速度,也可以随意使用支持
predict\u proba
的上述四种SVM变体,然后用sklearn.linear\u model.LogisticRegression
替换SVM即可。它使用与LinearSVC
完全相同的训练算法,但使用的是日志损失而不是铰链损失
使用[1/(1+exp(-x))]将产生形式意义上的概率(0和1之间的数字),但它们不会遵循任何合理的概率模型。scikit learn提供了可用于解决此问题的方法:它允许将概率输出添加到LinearSVC或实现决策函数方法的任何其他分类器:
svm = LinearSVC()
clf = CalibratedClassifierCV(svm)
clf.fit(X_train, y_train)
y_proba = clf.predict_proba(X_test)
《用户指南》对此有很好的解释。默认情况下,CalibratedClassifiedRCV+LinearSVC将为您提供Platt缩放,但它也提供了其他选项(等渗回归方法),并且不限于SVM分类器。如果您真正想要的是置信度而不是实际概率的度量,您可以使用该方法
LinearSVC.decision\u function()
。请参阅。谢谢@greeness的回复。你上面所说的一切都是完全有道理的,我已经接受了这个答案。然而,我不使用任何其他分类器的原因是,它们的速度通常远低于sklearn.svm.LinearSVC。我会继续寻找一段时间,如果我发现了什么,我会在这里更新。它不可用,因为它没有内置到Liblinear中,Liblinear实现了LinearSVC
,也因为LogisticRegression
已经可用(虽然线性SVM+Platt缩放可能比直接LR有一些好处,但我从未尝试过)。SVC
中的Platt缩放来自LibSVM。另一个可能的问题是,使用LinearSVC允许选择不同于默认“l2”的惩罚。SVC不允许这样做,因为我猜LibSVM不允许这样做。我使用了SVC(kernel='linear',**kwargs)
和caliberedClassifier(LinearSVC(**kwargs))
,但我得到了不同的结果……这很有意义。谢谢你的澄清这应该是真正的答案。我用sklearn.linear_model.LogisticRegression替换了我的sklearn.svm.SVC,不仅得到了相似的ROC曲线,而且对于我的数据集来说,时间差太大了(秒与小时),根本不值一次。同样值得注意的是,你可以指定你的解算器是“线性的”,它确实会使它与线性方程组完全一样。方程[x(1/(1+EXP(-x))]中的x值是什么?我不认为这是一个合适的解决方案,如弗莱德所指出的那样,用SVM获得概率。LR用于通过逻辑函数对独立信号进行概率估计。支持向量机的目的是提供更好的精度,并尝试不过度拟合,但通过铰链函数得到的概率估计精度较低。它惩罚预测失误。读者们,请理解折衷方案,并为您的学习目标选择最合适的函数。我个人将使用LinearSVC+CalibratedClassifiedRCV。@thefourtheye:LinearSVC声明:“类似于SVC,参数为kernel='linear',但以liblinear而不是libsvm实现,因此它在选择惩罚函数和损失函数方面具有更大的灵活性,并且应能更好地扩展到大量样本。”所以,如果你像OP一样使用LinearSVC,你会使用liblinear(就像你的Logistic回归一样),它也会很快。因此,这并不是使其快速的方法:您使用了错误的实现后端。您知道如何在网格搜索中使用它吗?尝试设置参数,例如base\u estimator\uu C
,但GridSearchCV
不会接受这些参数。base\u estimator\uu C
看起来是正确的。我建议提供一个完整的示例并打开一个新的SO问题。当我拟合clf
时,不拟合svm
会导致错误。我必须训练两个。我认为没有什么变化。是吗?哦,我的天啊,这太快了(在我的情况下也有类似的表现)