为 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中LinearSVC缩减后如何获取选中的特征

scikit-learn 中的 SVC 和 LinearSVC 在啥参数下是等效的?

如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估算器键参考?

LinearSVC sklearn (scikit-learn) 中 C 的行为

多处理 scikit-learn

在 python 中使用带有 LinearSVC 的特征选择