【问题标题】:Set the weights of decision functions through stdin in SklearnSklearn中通过stdin设置决策函数的权重
【发布时间】:2014-05-13 23:27:21
【问题描述】:

有没有一种方法可以在我的脚本中将系数输入到 SVC 的clf,然后应用clf.score()clf.predict() 函数进行进一步测试?

目前我正在使用joblib.dump(clf,'file.plk') 来保存受过训练的clf 的所有信息。但这涉及磁盘写入/读取。如果我可以定义一个clf,其中两个数组分别代表支持向量(clf.support_vectors_)、权重(clf.coef_/clf.dual_coef_)和偏差(clf.intercept_),这对我会有帮助。

【问题讨论】:

  • 我认为这里的问题是 clf 可能有其他状态参数,而不是你提到的那些,所以你最好酸洗或使用 joblib 来保证训练有素的 clf 的可重复性。对于某些具有较少参数但不是 100% 的分类器可能是可能的。你可以试试看。

标签: python scikit-learn svm


【解决方案1】:

This line 从 libsvm 调用预测函数。看起来是这样的(但请看一下整个函数_dense_predict):

libsvm.predict(
        X, self.support_, self.support_vectors_, self.n_support_,
        self.dual_coef_, self._intercept_,
        self.probA_, self.probB_, svm_type=svm_type, kernel=kernel,
        degree=self.degree, coef0=self.coef0, gamma=self._gamma,
        cache_size=self.cache_size)

您可以使用此行并直接为其提供所有相关信息,并将获得原始预测。为此,您必须导入 libsvm from sklearn.svm import libsvm。如果您的初始拟合分类器称为svc,那么您可以通过将所有self 关键字替换为svc 并保留值来从中获取所有相关信息。如果svc._impl 给你"c_svc",那么你设置svm_type=0

请注意,_dense_predict 函数的开头是 X = self._compute_kernel(X)。如果你的数据是X,那么你需要通过K = svc._compute_kernel(X)进行转换,并以K为第一个参数调用libsvm.predict函数

评分独立于这一切。查看sklearn.metrics,您会在其中找到例如accuracy_score,这是 SVM 中的默认分数。

这当然是一种有些次优的做事方式,但在这种特定情况下,如果不可能(我没有非常努力地检查)设置系数,那么进入代码并看看它的作用并提取相关部分肯定是一种选择。

【讨论】:

  • 聪明的方法!非常感谢!
【解决方案2】:

查看this blog post 使用简洁的sklearn 模型的内存使用情况,尝试查看它是否适用。

如果其他位置无法访问 sklearn 包,您需要创建自己的分数和预测函数。 clf.score()clf.predict() 要求 clf 是一个 sklearn 对象。

【讨论】:

  • 我最后一个对此评论表示赞同的答案已被删除,因为我在第一篇文章中要求澄清。但是我还没有离开 cmets 的特权(50 分),所以我无法在那里提问,但仍然觉得我可以做出贡献,所以我只问了我能做的唯一方法。如果他们想在未来避免这个问题,mods 可能应该允许新的潜在回答者离开 cmets。无论如何,上面的答案可能会有所帮助。
  • 再次感谢您!该链接很有帮助。我仍在阅读(不过对于像我这样的入门级来说可能并不容易:))。我再次赞成你的回答!您现在可以将 cmets 留在帖子中。另外,我从另一篇文章中发现,有些 clf 参数是只读的,我们不能给它们设置参数,遗憾的是包含了支持向量和权重。
  • 你的申请是什么?您希望在其中运行模型的第二个位置是 PC 还是某个嵌入式系统?我希望有某种方法可以在精简的计算环境中运行预训练模型。
猜你喜欢
  • 2023-03-07
  • 2020-02-24
  • 2019-02-12
  • 1970-01-01
  • 2013-10-04
  • 2019-03-04
  • 2021-06-17
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多