【问题标题】:Exporting SVM classifiers from sklearn to Java codebase [closed]将 SVM 分类器从 sklearn 导出到 Java 代码库 [关闭]
【发布时间】:2014-06-18 21:40:24
【问题描述】:

我已经使用sklearn 训练了一组 SVM 分类器(大部分是线性使用 LinearSVM,但其中一些使用带有 rbf 内核的 SVC 类),我对结果非常满意。现在我需要将 production 中的分类器导出到另一个使用 Java 的代码库中。我正在寻找可能的库,它们在 maven 中发布,可以很容易地合并到这个新的代码库中。

你有什么建议?

【问题讨论】:

    标签: java scikit-learn svm


    【解决方案1】:

    线性分类器很简单:它们有一个coef_ 和一个intercept_,在类文档字符串中进行了描述。这些是常规 NumPy 数组,因此您可以使用标准 NumPy 函数将它们转储到磁盘。

    >>> from sklearn.datasets import load_iris
    >>> iris = load_iris()
    >>> from sklearn.svm import LinearSVC
    >>> clf = LinearSVC().fit(iris.data, iris.target)
    

    现在让我们把它转储到一个伪文件中:

    >>> from io import BytesIO
    >>> outfile = BytesIO()
    >>> np.savetxt(outfile, clf.coef_)
    >>> print(outfile.getvalue())
    1.842426121444650788e-01 4.512319840786759295e-01 -8.079381916413134190e-01 -4.507115611351246720e-01
    5.201335313639676022e-02 -8.941985347763323766e-01 4.052446671573840531e-01 -9.380586070674181709e-01
    -8.506908158338851722e-01 -9.867329247779884627e-01 1.380997337625912147e+00 1.865393234038096981e+00
    

    这是你可以从 Java 中解析出来的东西,对吧?

    现在要在样本x 上获得k'th 类的分数,您需要评估

    np.dot(x, clf.coef_[k]) + clf.intercept_[k]
    # ==
    (sum(x[i] * clf.coef_[k, i] for i in xrange(clf.coef_.shape[1]))
     + clf.intercept_[k])
    

    我希望这也是可行的。得分最高的班级获胜。

    对于内核 SVM,情况更为复杂,因为您需要在 Java 代码中复制 one-vs-one decision function 以及内核。 SVM 模型存储在属性support_vectors_dual_coef_ 中的SVC 对象上。

    【讨论】:

    • 我投了赞成票,但这并不能真正回答我的问题:)
    • @nopper 你的意思是你想要一个图书馆?那么这个问题就跑题了。
    • 问题是:我需要以最小的努力将一组 SVM 分类器 (sklearn) 导出到 Java。您建议使用哪些库(java,可能在 maven 中)?
    • 有没有人用 svm 完成了上述工作并公开了这项工作?在网上找不到任何东西。
    • @CartesianTheater 我维护了一个项目,该项目将学习模型移植到 C、Java 或 JavaScript 等低级编程语言。但它正在积极开发中。无论如何,你可以在这里找到它:https://github.com/nok/sklearn-porter
    【解决方案2】:

    我不知道如何在一个框架中导出 SVM 模型并在另一个框架中导入它们,但了解哪些参数描述您的模型可能会有所帮助 - 这些是 SVM 训练机制选择的支持向量,加上内核和(一些)超参数。我会将它们保存到一个文件中,然后以你的目标语言获取任何机器学习库,看看我是否可以通过向它们提供这些参数来初始化 SVM 分类器,而不是再次训练它们。

    【讨论】:

    • 我猜线性分类器应该很容易,因为它们只公开一组系数,但对于非线性分类器可能会更复杂。无论如何,问题是关于这个范围的最佳 Java 库,它也在 maven 中发布?如果结果相同,我有能力重新训练整个分类器。
    • 是的,我不知道,只是想建议在您搜索库时,“导入”功能可能不是一个关键因素(SO 也有点与“帮助我选择一个图书馆”的问题 - 看到那个密切的投票(不是我的) - 我想强调你的问题有一个更有趣的方面)
    • 是的,我明白你的意思。事实上,在创建这个特定问题之前,我寻找了类似的问题。最后我发现有些人正在寻找将 sklearn 分类器(无需重新训练)导出到 Java 代码库,例如 one。因此我决定放宽要求并接受完全重新训练我的模型的可能性;)
    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 2015-04-25
    • 2018-10-31
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多