我正在使用scikit中的linearsvm训练我的数据集。我可以计算/获得样本在给定标签下分类的概率吗?
例如,使用SGDClassifier(loss="log")
来拟合数据,启用了predict_proba方法,该方法为每个样本x
:提供概率估计向量P(y|x)
>>> clf = SGDClassifier(loss="log").fit(X, y)
>>> clf.predict_proba([[1., 1.]])
输出:
array([[ 0.0000005, 0.9999995]])
在使用svm.LinearSVC
(多类分类)时,有没有类似的函数可以用来计算预测概率。我知道在这种情况下有一种方法decision_function
来预测样本的置信度得分。但是,有没有什么方法可以使用这个决策函数来计算样本的概率估计?
否,LinearSVC
不会计算概率,因为它没有经过训练。请使用sklearn.linear_model.LogisticRegression
,它使用与LinearSVC
相同的算法,但会丢失日志。它使用概率估计的标准逻辑函数:
1. / (1 + exp(-decision_function(X)))
(出于同样的原因,SGDClassifier
将只在loss="log"
时输出概率,而不使用其默认损失函数,这会使其学习线性SVM。)
多类分类是一种"一对所有"的分类。对于SGDClassifier
,当返回到与特定类别对应的超平面的距离时,概率计算为
clip(decision_function(X), -1, 1) + 1) / 2
有关详细信息,请参阅代码。
你可以实现类似的功能,对我来说,LinearSVC似乎是合理的,尽管这可能需要一些理由。参考文件中提到的文件
Zadrozny和Elkan,"将分类器得分转化为多类概率估计",SIGKDD'02,http://www.research.ibm.com/people/z/zadrozny/kdd2002-Transf.pdf
附言:来自"LinearSVC是否存在‘predict_proba’?"的评论:
如果你想要概率,你应该使用逻辑回归或SVC。两者都可以预测问题,但方式截然不同。