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

数据挖掘 机器学习 Python scikit-学习 支持向量机
2021-10-13 14:20:32

我有一个带有标签“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中,结果列表中有值。

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

2个回答

您的链接有足够的资源,所以让我们来看看:

当你调用 decision_function() 时,你会得到每个成对分类器的输出(总共 n*(n-1)/2 个数字)。请参阅“用于模式分类的支持向量机”的第 127 和 128 页。

单击“第 127 页和第 128 页”链接(此处未显示,但在 Stackoverflow 答案中)。你应该看到:

在此处输入图像描述

  • Python 的 SVM 实现使用一对一。这正是本书所要谈论的。
  • 对于每个成对比较,我们测量决策函数
  • 决策函数是正则二元 SVM 决策边界

这和你的问题有什么关系?

  • clf.decision_function() 会给你 D 对于每个成对比较
  • 得票最多的班级获胜

例如,

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

正在比较:

[AB、AC、AD、BC、BD、CD]

我们用符号标记它们中的每一个。我们得到:

[A、C、A、C、B、C]

例如,96.42193513 是正数,因此 A 是 AB 的标签。

现在我们有了三个 C,C 将是您的预测。如果您对其他两个示例重复我的过程,您将得到 Python 的预测。试试看!

您可以使用 CallibratedClassifierCV。

from sklearn.calibration import CalibratedClassifierCV

model_svc = LinearSVC()
model = CalibratedClassifierCV(model_svc) 

model.fit(X_train, y_train)
pred_class = model.predict(y_test)
probability = model.predict_proba(predict_vec)