【问题标题】:scikit-learn, linearsvc - how to get support vectors from the trained SVM?scikit-learn,linearsvc - 如何从训练有素的 SVM 中获取支持向量?
【发布时间】:2014-12-03 08:44:38
【问题描述】:

我正在使用 scikit-learn 库中的 LinearSVC,我想知道是否有可能以某种方式提取我的模型在训练后用于进行预测的向量。试图用谷歌搜索它一段时间,但没有任何运气。有谁知道吗?

【问题讨论】:

  • 我的意思是支持向量,LinearSVC 实际上根本不使用这些。
  • LinearSVC 不使用支持向量,但这个概念仍然存在,并且可能仍然有用。

标签: python machine-learning scikit-learn


【解决方案1】:

不幸的是,似乎没有办法做到这一点。 LinearSVC 调用 liblinear (see relevant code) 但不检索向量,只检索系数和截距。

另一种选择是将 SVC 与“线性”内核(libsvm 而不是基于 liblinear)一起使用,但 polydbfsigmoid 内核也支持此选项:

from sklearn import svm

X = [[0, 0], [1, 1]]
y = [0, 1]

clf = svm.SVC(kernel='linear')
clf.fit(X, y)
print clf.support_vectors_

输出:

[[ 0.  0.]
 [ 1.  1.]]

liblinear 可以更好地适应大量样本,但除此之外大部分是等效的。

【讨论】:

  • 谢谢,Elyase。如果我将使用 scikit-learn 中可用的其他类型的 SVC,是否有可能以某种方式返回向量(或者如果我使用多项式内核,如何正确调用它们)描述?
  • 当我尝试这个时,我得到 clf.support_vectors_.shape 为 (4485, 2),大概来自所有不同的试验向量,因为算法试图优化拟合。在这种情况下,有没有办法隔离表现最好的支持向量(如果我的解释是正确的)?
【解决方案2】:

这可以帮助你。

clf = svm.SVC( kernel='rbf',C=0.05)
clf.fit(traindata,y)
print clf.support_vectors_

如果需要,此链接可为您提供更多信息。 http://scikit-learn.org/stable/modules/svm.html

【讨论】:

    【解决方案3】:

    我不确定它是否有帮助,但我正在寻找类似的东西,结论是:

    clf = svm.LinearSVC()
    

    然后这个:

    clf.decision_function(x)
    

    等于:

    clf.coef_.dot(x) + clf.intercept_
    

    【讨论】:

    • 这正是我想要的。如果有 n 个类,svm.SVC 从 n*(n-1) 个分类器计算决策函数(one-vs-rest),这与 LinearSVC 不同,它只查看 n 个分类器的 arg max。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2017-04-16
    • 2016-02-05
    • 2013-05-25
    • 2020-10-26
    相关资源
    最近更新 更多