【问题标题】:The dimension of dual_coef_ in sklearn. SVCsklearn 中 dual_coef_ 的维度。 SVC
【发布时间】:2014-05-14 01:01:42
【问题描述】:

SVC() 中进行多分类,训练一对一分类器。所以总共应该有n_class * (n_class - 1)/2 分类器。但是为什么clf.dual_coef_ 只返回我(n_class - 1) * n_SV?那么每一行代表什么?

【问题讨论】:

    标签: scikit-learn svm


    【解决方案1】:

    多类设置中 sklearn.svm.SVC 的对偶系数很难解释。 scikit-learn documentation中有解释。 sklearn.svm.SVC 使用libsvm 进行计算,对偶系数采用相同的数据结构。在FAQ 中对这些系数的组织进行了另一种解释。对于您在拟合的 SVC 分类器中找到的系数,解释如下:

    由 SVC 识别的支持向量每个都属于某个类。在对偶系数中,它们根据它们所属的类别进行排序。 给定一个拟合的 SVC 估计器,例如

    from sklearn.svm import SVC
    svc = SVC()
    svc.fit(X, y)
    

    你会发现

    svc.classes_   # represents the unique classes
    svc.n_support_ # represents the number of support vectors per class
    

    支持向量根据这两个变量进行组织。每个支持向量都被清楚地标识为一个类,很明显它可以隐含在最多 n_classes-1 个一对一问题中,即与所有其他类的每次比较。但完全有可能一个给定的支持向量不会被隐含在所有一对一问题中。

    看看

    support_indices = np.cumsum(svc.n_support_)
    svc.dual_coef_[0:support_indices[0]]  # < ---
                                          # weights on support vectors of class 0
                                          # for problems 0v1, 0v2, ..., 0v(n-1)
                                          # so n-1 columns for each of the 
                                          # svc.n_support_[0] support vectors
    svc.dual_coef_[support_indices[1]:support_indices[2]]  
                                          #  ^^^
                                          # weights on support vectors of class 1
                                          # for problems 0v1, 1v2, ..., 1v(n-1)
                                          # so n-1 columns for each of the 
                                          # svc.n_support_[1] support vectors
    ...
    svc.dual_coef_[support_indices[n_classes - 2]:support_indices[n_classes - 1]]
                                          #  ^^^
                                          # weights on support vectors of class n-1
                                          # for problems 0vs(n-1), 1vs(n-1), ..., (n-2)v(n-1)
                                          # so n-1 columns for each of the 
                                          # svc.n_support_[-1] support vectors
    

    为您提供 0、1、...、n-1 类在它们各自的一对一问题中的支持向量的权重。与除了它自己的所有其他类进行比较,产生 n_classes - 1 列。发生这种情况的顺序遵循上面公开的唯一类的顺序。每组中的行数与支持向量的数量一样多。

    您可能正在寻找的是原始权重,它们存在于特征空间中,以便检查它们对分类的“重要性”。这仅适用于线性内核。试试这个

    from sklearn.svm import SVC
    svc = SVC(kernel="linear")
    svc.fit(X, y)  # X is your data, y your labels
    

    那就看看

    svc.coef_
    

    这是一个形状数组 ((n_class * (n_class -1) / 2), n_features),代表上述权重。

    根据doc,权重排序为:

    class 0 vs class 1
    class 0 vs class 2
    ...
    class 0 vs class n-1
    class 1 vs class 2
    class 1 vs class 3
    ...
    ...
    class n-2 vs class n-1
    

    【讨论】:

    • 如果这是您正在寻找的内容并且您还有其他问题,请随时发表评论
    • eicken,非常感谢您的意见 (+1)。该链接很有帮助。如果我的理解是正确的,那么该页面上显示的表格中唯一不同的系数是 a_0(0,1)、a_1(0,1) 和 a_2(0,1)?我仍然很困惑(0 类与 1 类)和(0 类与 2 类)之间的支持向量如何相同。
    • 感谢您的反馈!在 sklearn.svm.SVC 分类器的具体情况下,我在对偶系数组织的描述中添加了一些细节。 HTH
    • 谢谢你。很抱歉,我仍然对 svc.dual_coef_ 是支持向量还是这些支持向量的权重感到困惑?对于标签 0 与标签 1、0 与 2、0 与 3、....0 的支持向量(或其权重)是否完全相同(svc.dual_coef_[0:support_indices[0]])是否正确与 n-1?
    • 这通常是不可能的。原始向量可以是无限维的,具体取决于内核。原始系数只有在线性情况下才容易从对偶系数中提取。
    猜你喜欢
    • 2014-01-16
    • 2020-04-26
    • 2019-07-26
    • 2020-09-10
    • 2017-06-18
    • 2018-12-20
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多