从 scikit-learn SVC decision_function 预测概率,decision_function_shape='ovo'

Posted

技术标签:

【中文标题】从 scikit-learn SVC decision_function 预测概率,decision_function_shape=\'ovo\'【英文标题】:Predicting probability from scikit-learn SVC decision_function with decision_function_shape='ovo'从 scikit-learn SVC decision_function 预测概率,decision_function_shape='ovo' 【发布时间】:2017-09-11 10:27:30 【问题描述】:

我有一个带有标签“A”、“B”、“C”、“D”的多类 SVM 分类器。

这是我正在运行的代码:

>>>print clf.predict([predict_this])
['A']
>>>print clf.decision_function([predict_this])
[[ 185.23220833   43.62763596  180.83305074  -93.58628288   62.51448055  173.43335293]]

如何使用决策函数的输出来预测具有最高概率的类别 (A/B/C/D),如果可能的话,它的值?我访问过https://***.com/a/20114601/7760998,但它是针对二元分类器的,找不到一个很好的资源来解释具有 ovo 形状(一对一)的多类分类器的决策函数的输出。

编辑:

以上示例适用于“A”类。对于另一个输入,分类器预测“C”并在决策函数中给出以下结果

[[ 96.42193513 -11.13296606 111.47424538 -88.5356536 44.29272494 141.0069203 ]]

对于分类器预测为“C”的另一个不同输入,decision_function 给出了以下结果,

[[ 290.54180354 -133.93467605  116.37068951 -392.32251314 -130.84421412   284.87653043]]

如果是 ovr(one-vs-rest),选择具有较高值的​​那个会变得更容易,但在 ovo(one-vs-one)中,结果列表中有 (n * (n - 1)) / 2 值。

如何根据决策函数推断选择哪个类?

【问题讨论】:

(1) 为什么你想自己做而不是 sklearn 为你做(probability=True,然后打电话给clf.predict_proba)? (2) 如果没有 sklearn 的probability=True 所做的额外步骤(这可能代价高昂),您就无法从这个决策函数中获得概率。这对 SVM 来说并不自然(sklearn 的 svm 实现内部使用 platt-scaling)。 @sascha 我想避免再次运行分类器。它非常慢。我已经使用 pickle 将分类器保存到磁盘。无论如何,我可以使用probability=True 获得所需的结果而无需再次运行它? 没有。这些计算是在训练期间进行的。 这些值可能只是字典排序产生的对 (0/1, 0/2, 0/3, 1/2, 1/3, 2/3) 但它不会事情。正如我之前所说,您需要做更多的工作才能获得概率。这肯定比再培训更麻烦。 【参考方案1】:

如果我理解正确,我认为这是一种方法。我使用 np.argmax() 返回最高分的索引。

import numpy as np
a = clf.decision_function([predict_this])
index = np.argmax(a)
print str(unichr(65 + index))

编辑: 是的,这不是应该的方式,抱歉,我没有注意到您使用了决策功能。好吧,预测函数使用决策函数输出来计算最终输出,scikit-learn 文档中没有给出明确的算法,但如果您仍然想使用决策函数预测自己,请参阅您提供的链接中的第二条评论。该链接具有将决策转化为预测的数学推导。

【讨论】:

这不是正确的方法。如果数组中的项目数等于类数,它会起作用。在这里,我有#classes = 4 和#itemsInArray = 6。我们有#itemsInArray = (#classes * (#classes - 1)) / 2 (1) 这永远不会产生(好的)概率(2)该链接还显示了一个广受欢迎的评论,即多类情况不同! 仅供参考,我的意思是第二个帖子,而不是第一个。【参考方案2】:

对于正在寻找此问题答案的任何人,请访问 this accepted answer 我已在 DataScience Stack Exchange 上发布了相同的问题并得到了所需的答案。

【讨论】:

以上是关于从 scikit-learn SVC decision_function 预测概率,decision_function_shape='ovo'的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥带有铰链损失的 SGDClassifier 比 scikit-learn 中的 SVC 实现更快

在 scikit-learn 中将数据加载到 SVC 模型时尝试避免 .toarray()

如何使用 scikit-learn 和 matplotlib 为不平衡数据集绘制 SVC 分类?

Scikit-learn SVC 在随机数据交叉验证中总是给出准确度 0

在 scikit-learn SVM 中缩放数据