Sklearn SVM 系数属性 - 如何获取类名?

Posted

技术标签:

【中文标题】Sklearn SVM 系数属性 - 如何获取类名?【英文标题】:Sklearn SVM coefficient attribute - how to get class name? 【发布时间】:2016-05-12 06:45:13 【问题描述】:

当我获得多类 SVM 的系数时,我似乎无法找到一种方法来检索权重的类别。它们按某种顺序排序。有没有办法检索系数二维数组中哪个类与哪个索引?

【问题讨论】:

据我所知,系数 (coef_) 只是形成分离超平面的权重。每个功能一个权重,我看不出这些类在哪里发挥作用,在这里。您是否正在寻找支持向量? @kazemakase 嗯,当我查看 coef 参数的文档时,似乎它确实返回了每个类的特征权重的二维数组。 你是对的。在多类情况下,每个类组合都有不同的权重。不过,您没有提到您正在做多类课程:) @kazemakase 啊编辑,谢谢!所以我的问题是它是如何排序的,即索引n对应什么类 我正在寻找答案,但这很棘手:) 【参考方案1】:

您可以从classes_ 属性中获取类的顺序。我认为它们通常按升序排列,因为 numpy.unique 会对它们进行排序,但据我所知,这没有记录。

如果您进行多类分类,scikit-learn 采用一对一方案。这意味着您为每个类组合获得一个单独的分类器(或一组权重)。如果C 是类数,则共有C * (C-1) / 2 组合。 不幸的是,似乎也没有任何关于如何订购这些组合的信息。但是,从source code 看来,它们的顺序如下:

0-1, 0-2, 0-3, ... 0-c,
     1-2, 1-3, ... 1-c,
          2-3, ... 2-c,
                .
                .
                .

考虑以下示例:

import numpy as np
from sklearn.svm import SVC

x = np.random.randn(40, 7)  # 7 features, 40 samples
y = ['D', 'B', 'A', 'C'] * 10  # four classes
svc = SVC(kernel='linear').fit(x, y)

print(svc.classes_)  # ['A', 'B', 'C', 'D']
print(svc.coef_.shape)  # (6, 7)

svc.coef_ 的形状显示有 6 组权重。这些对应于以下类标签对: AB、AC、AD、BC、BD、CD

注意: 此答案基于观察和源代码检查,而不是实际文档。带上一粒盐吧:)

【讨论】:

以上是关于Sklearn SVM 系数属性 - 如何获取类名?的主要内容,如果未能解决你的问题,请参考以下文章

参数“coef0”是不是表示 sklearn.svm.SVC 方法中的特定系数?

sklearn svm 不合适

如何获得 PLS 回归的截距(sklearn)

sklearn:评估 LinearSVC AUC

超详细基于sklearn实现软硬间隔SVM

sklearn SVM(支持向量机)模型使用RandomSearchCV获取最优参数及可视化