【问题标题】:How to obtain features' weights如何获得特征的权重
【发布时间】:2014-02-11 04:45:32
【问题描述】:

我正在处理高度不平衡的数据集,我的想法是从我的 libSVM 模型中获取特征权重的值。至于现在我可以使用线性内核,在那里我可以获得特征权重,但是当我使用rbfpoly 时,我无法达到我的目标。

这里我使用sklearn 作为我的模型,使用.coef_ 很容易获得线性核的特征权重。谁能帮我为rbfpoly 做同样的事情?到目前为止,我尝试做的事情如下:

svr = SVC(C=10, cache_size=200, class_weight='auto', coef0=0.0, degree=3.0, gamma=0.12,kernel='rbf', max_iter=-1, probability=True, random_state=0,shrinking=True, tol=0.001, verbose=False)
clf = svr.fit(data_train,target_train)
print clf.coef_

【问题讨论】:

    标签: python machine-learning svm scikit-learn libsvm


    【解决方案1】:

    这不仅是不可能的,正如documentation中所述:

    分配给特征的权重(原始问题中的系数)。这仅在线性内核的情况下可用。

    但它也没有任何意义。在线性 SVM 中,生成的分离平面与输入特征在同一空间中。因此,它的系数可以看作是输入“维度”的权重。

    在其他内核中,分离平面存在于另一个空间中 - 这是原始空间的内核变换的结果。它的系数与输入空间没有直接关系。事实上,对于rbf 内核,转换后的空间是无限维的(当然,您可以在这个on Wikipedia 上找到一个起点)。

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,但原因不同。 我的目标是不使用内置的SVC.predict 来计算推理。 假设:

      import numpy as np
      from sklearn.svm import SVC
      
      X = np.array([[3, 4], [1, 4], [2, 3], [6, -1], [7, -1], [5, -3]])
      y = np.array([-1, -1, -1, 1, 1, 1])
      
      clf = SVC(C=1e5, kernel='linear')
      clf.fit(X, y)
      

      我想仅使用代数计算训练模型的预测。 现在线性推理的公式很简单:

      统称为权重。让事情变得超级简单的是clf.coef_ 为您提供权重。 所以:

      w = clf.coef_
      b = clf.intercept_
      
      assert np.sign(w.dot(X[0]) + b)[0] == clf.predict(X[0].reshape((1, 2)))
      

      旁注:乘法之和正是dot 对两个向量所做的,输入向量的reshape 需要符合预期的predict 输入形状。

      当然,对于其他内核来说,比这更复杂,从这个公式 和之前的答案,我们无法预先计算权重,因为 都绑定在一起。

      现在,在我得到朋友的帮助之前,这就是我遇到的问题。 谁发现了这个documentation page。它说 在 scikit 学习术语中是 clf.dual_coef_。 一旦你知道这个等式也变得简单了。

      我们现在知道 的值。剩下要做的一件事是计算内核函数,这取决于内核的类型,用于 3 次多项式内核(这是 scikit 中 poly SVM 的默认次数) 大致转换为 np.power(clf.support_vectors_.dot(X), clf.degree)。 **

      现在让我们将我们学到的所有内容结合到这段代码 sn-p 中:

      import numpy as np
      from sklearn.svm import SVC
      
      X = np.array([[3, 4], [1, 4], [2, 3], [6, -1], [7, -1], [5, -3]])
      y = np.array([-1, -1, -1, 1, 1, 1])
      
      clf = SVC(kernel='poly', gamma=1)
      clf.fit(X, y)
      
      print('b = ', clf.intercept_)
      print('Indices of support vectors = ', clf.support_)
      print('Support vectors = ', clf.support_vectors_)
      print('Number of support vectors for each class = ', clf.n_support_)
      print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
      
      negative_prediction = clf.dual_coef_.dot(np.power(clf.gamma * clf.support_vectors_.dot(X[0]), clf.degree)) + clf.intercept_
      positive_prediction = clf.dual_coef_.dot(np.power(clf.gamma * clf.support_vectors_.dot(X[4]), clf.degree)) + clf.intercept_
      
      print('Compare both results')
      print(negative_prediction, clf.decision_function(X[0].reshape((1, 2))))
      print(positive_prediction, clf.decision_function(X[4].reshape((1, 2))))
      
      assert np.sign(negative_prediction) == clf.predict(X[0].reshape((1, 2)))
      assert np.sign(positive_prediction) == clf.predict(X[4].reshape((1, 2)))
      

      如果你运行它,你会看到断言通过了,哇哦!我们现在可以预测不使用predict 的结果,我希望它可以帮助解决所提出的问题。从现在开始,您可以像调整权重一样调整对偶系数。

      ** 但是请注意,如果你不使用 gamma,也要将其从“手动计算”中删除,否则它只会中断。此外,它是多项式内核的推理示例,对于其他内核,推理功能应相应调整。 See documentation

      • Source 获取公式快照以及有关 SVM 的更多信息。
      • Relevant scikit learn documentation
      • sn-p 代码基于我在 stackoverflow 上看到的内容,但我丢失了源链接。所以我要感谢并感谢原作者(一旦我找到他)。

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2018-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2013-08-15
        • 2013-11-27
        相关资源
        最近更新 更多