为 LinearSVC 计算 scikit 中每个样本 x 的概率估计 P(y|x)
Posted
技术标签:
【中文标题】为 LinearSVC 计算 scikit 中每个样本 x 的概率估计 P(y|x)【英文标题】:Calculate probability estimate P(y|x) per sample x in scikit for LinearSVC 【发布时间】:2013-12-15 15:49:39 【问题描述】:我正在使用 scikit 中的 linearsvm 训练我的数据集。我可以计算/得到一个样本被分类到给定标签下的概率吗?
例如,使用 SGDClassifier(loss="log")
拟合数据,启用 predict_proba 方法,该方法为每个样本提供概率估计向量 P(y|x)
x
:
>>> clf = SGDClassifier(loss="log").fit(X, y)
>>> clf.predict_proba([[1., 1.]])
输出:
array([[ 0.0000005, 0.9999995]])
在使用svm.LinearSVC
(多类分类)时,是否有任何类似的函数可以用来计算预测概率。我知道在这种情况下有一种方法decision_function
可以预测样本的置信度分数。但是,有什么方法可以使用此决策函数计算样本的概率估计值?
【问题讨论】:
【参考方案1】:不,LinearSVC
不会计算概率,因为它没有经过训练这样做。使用sklearn.linear_model.LogisticRegression
,它使用与LinearSVC
相同的算法,但有日志丢失。它使用标准logistic function 进行概率估计:
1. / (1 + exp(-decision_function(X)))
(出于同样的原因,SGDClassifier
只会在loss="log"
时输出概率,而不使用导致它学习线性 SVM 的默认损失函数。)
【讨论】:
我使用LinearSVC
的原因是我需要一个l1
正则化,所以这个解决方案不适用。
@adrin: SGDClassifier
有。它甚至具有弹性网络(混合 l1/l2)正则化。【参考方案2】:
多类分类是一对多的分类。对于SGDClassifier
,当返回与特定类对应的超平面的距离时,概率计算为
clip(decision_function(X), -1, 1) + 1) / 2
Refer to code 了解详情。
你可以实现类似的功能,对我来说 LinearSVC 似乎是合理的,尽管这可能需要一些理由。参考文档中提到的论文
Zadrozny 和 Elkan,“将分类器分数转换为多类概率估计”,SIGKDD'02,http://www.research.ibm.com/people/z/zadrozny/kdd2002-Transf.pdf
附:来自"Is there 'predict_proba' for LinearSVC?"的评论:
如果您想要概率,您应该使用逻辑回归或 SVC。两者都可以预测概率,但方式非常不同。
【讨论】:
该代码是Huber损失的概率预测。它对任何其他损失都无效,实际上带有loss="log"
的SGD 使用了不同的公式。两者都不适用于 SVM。以上是关于为 LinearSVC 计算 scikit 中每个样本 x 的概率估计 P(y|x)的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn 中的 SVC 和 LinearSVC 在啥参数下是等效的?
如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估算器键参考?