【发布时间】:2014-06-18 21:40:24
【问题描述】:
我已经使用sklearn 训练了一组 SVM 分类器(大部分是线性使用 LinearSVM,但其中一些使用带有 rbf 内核的 SVC 类),我对结果非常满意。现在我需要将 production 中的分类器导出到另一个使用 Java 的代码库中。我正在寻找可能的库,它们在 maven 中发布,可以很容易地合并到这个新的代码库中。
你有什么建议?
【问题讨论】:
标签: java scikit-learn svm
我已经使用sklearn 训练了一组 SVM 分类器(大部分是线性使用 LinearSVM,但其中一些使用带有 rbf 内核的 SVC 类),我对结果非常满意。现在我需要将 production 中的分类器导出到另一个使用 Java 的代码库中。我正在寻找可能的库,它们在 maven 中发布,可以很容易地合并到这个新的代码库中。
你有什么建议?
【问题讨论】:
标签: java scikit-learn svm
线性分类器很简单:它们有一个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 对象上。
【讨论】:
我不知道如何在一个框架中导出 SVM 模型并在另一个框架中导入它们,但了解哪些参数描述您的模型可能会有所帮助 - 这些是 SVM 训练机制选择的支持向量,加上内核和(一些)超参数。我会将它们保存到一个文件中,然后以你的目标语言获取任何机器学习库,看看我是否可以通过向它们提供这些参数来初始化 SVM 分类器,而不是再次训练它们。
【讨论】: