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

时间:2014-05-02 08:46:52

标签: java scikit-learn svm

我已经使用sklearn来训练一组SVM分类器(大部分使用LinearSVM进行线性分析,但其中一些使用带有rbf内核的SVC类)并且我很满意结果。现在我需要将 production 中的分类器导出到另一个使用Java的代码库中。我正在寻找可以在maven中发布的可以轻松合并到这个新代码库中的库。

你有什么建议?

2 个答案:

答案 0 :(得分: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)

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

>>> 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解析的东西,对吧?

现在要获得样本kx类的分数,您需要进行评估

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模型存储在属性SVCsupport_vectors_中的dual_coef_个对象中。

答案 1 :(得分:1)

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