Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换线性SVC';s概率决策函数(Scikit学习python)_Python_Machine Learning_Scikit Learn_Svm - Fatal编程技术网

转换线性SVC';s概率决策函数(Scikit学习python)

转换线性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

我使用scikit学习中的线性SVM(LinearSVC)来解决二值分类问题。我知道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) 
我想检查一下,简单地以[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
会导致错误。我必须训练两个。我认为没有什么变化。是吗?哦,我的天啊,这太快了(在我的情况下也有类似的表现)