将SVM分类器从sklearn导出到Java代码库

nop*_*per 4 java svm scikit-learn

我已经习惯sklearn了训练一组SVM分类器(大多数是线性的,LinearSVM但有些是使用SVCrbf内核的类),我对结果非常满意.现在我需要将生产中的分类器导出到另一个使用Java的代码库中.我正在寻找可以在这个新代码库中轻松整合的可能库,这些库是在maven中发布的.

你有什么建议?

Fre*_*Foo 6

线性分类器很简单:它们有一个coef_和一个intercept_,在类docstrings中描述.这些是常规的NumPy数组,因此您可以使用标准的NumPy函数将它们转储到磁盘上.

>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> from sklearn.svm import LinearSVC
>>> clf = LinearSVC().fit(iris.data, iris.target)
Run Code Online (Sandbox Code Playgroud)

现在让我们将其转储到伪文件:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这是你可以用Java解析的东西,对吗?

现在要获得k样本上的第一类分数x,您需要进行评估

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])
Run Code Online (Sandbox Code Playgroud)

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

对于内核SVM,情况更复杂,因为您需要在Java代码中复制一对一决策函数以及内核.SVM模型存储在SVC属性support_vectors_和对象中dual_coef_.