为什么sklearn.svm.SVC的属性coeef_有shape = [n_class * (n_class-1) 2, n_features]?

问题描述 投票:0回答:1

我在使用线性内核的sklearn.svm.SVC,我想得到特征的重要性,所以我使用了属性coeff_(如这里的解释)。https:/scikit-learn.orgstablemodulesgeneratedsklearn.svm.SVC.html。)是一个形状为[n_class * (n_class-1) 2, n_features]的数组,比如我的情况,我有10个类和54个特征,所以形状为[45,54]。

为什么我得到45个权重数组? 这些数组中的每一个数组有什么意义?因为从直觉上讲,我希望有10个权重数组,每个类有一个。

python scikit-learn svm
1个回答
1
投票

形状是 果然 [n_class * (n_class-1) / 2, n_features] 但为什么呢?

这是因为如果你有 两班以上 即如果你有一个问题是 二进制 那么 多类支持的函数是按照一个对一个的方案来处理的。


例如:如果你有3个类,比如说 1,2,3 则将对这些情况进行拟合。1vs2, 1vs32vs3. 所以在这里,我们有 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, 1vs32vs3,分别是。所以,第一行即 [-0.5, -0.5] 给出了第一、二个特征变量的系数,对于这种情况下的 1vs2 分类拟合。


P.S:如果是二元分类,则是 print(clf.coef_) 将只返回一行 1vs2 分类情况。


关于行的顺序。

在 "一对一 "SVC的情况下,属性的布局会更复杂一些。在有线性内核的情况下,属性coef_和intercept_的形状分别是[n_class * (n_class - 1) 2,n_features]和[n_class * (n_class - 1) 2]。 这与上面描述的LinearSVC的布局类似,现在每一行对应一个二进制分类器。类0到n的顺序是 "0 vs 1","0 vs 2",...... "0 vs n","1 vs 2","1 vs 3","1 vs n",......。"n-1与n"。

段落见于:...... "0与n"、"1与2"、"1与3"、"1与n"、...... "n-1与n"。https:/scikit-learn.orgstablemodulessvm.html。

© www.soinside.com 2019 - 2024. All rights reserved.