形状确实 [n_class * (n_class-1) / 2, n_features] 但为什么呢?
这是因为如果您有 2 个以上的类,即如果您遇到的问题是不是 二进制,那么 multiclass该功能的支持是根据一对一的方案处理的。
示例:
如果您有 3 个类,比如说 1,2,3,那么分类器将适用于以下情况:1vs2、1vs3 和 2vs3。所以在这里,我们有n_class * (n_class-1) / 2 = 3 * (3-1) / 2 = 3。
让我们验证一下:
import numpy as np
from sklearn.svm import SVC
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 3]) # 3 classes
clf = SVC(kernel='linear')
clf.fit(X, y)
print(clf.coef_)
[[-0.5 -0.5 ]
[-0.46153846 -0.30769231]
[-1. 0. ]]
这里,在clf.coef_中,每一行分别对应上述情况1vs2、1vs3和2vs3。因此,第一行即[-0.5, -0.5] 为您提供1vs2 分类拟合情况下的第一个和第二个特征/变量的系数。
P.S:在二进制分类的情况下,print(clf.coef_) 将只为1vs2 分类情况返回一行。
关于行的顺序:
在“one-vs-one” SVC 的情况下,属性的布局是
更多的参与。在具有线性内核的情况下,
属性 coef_ 和 intercept_ 的形状为 [n_class * (n_class -
1) / 2, n_features] 和 [n_class * (n_class - 1) / 2] 分别。
这类似于上述 LinearSVC 的布局,每个
行现在对应于二元分类器。第 0 类的顺序
到 n 是“0 对 1”、“0 对 2”、……“0 对 n”、“1 对 2”、“1 对 3”、“1 对 n”、
. . . “n-1 对 n”。
在https://scikit-learn.org/stable/modules/svm.html中找到的段落