【发布时间】: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://stackoverflow.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) 但它不会事情。正如我之前所说,您需要做更多的工作才能获得概率。这肯定比再培训更麻烦。
标签: python-2.7 machine-learning scikit-learn svm