I have used sklearn
to train a set of SVM classifiers (mostly linear using LinearSVM
but some of them are using the SVC
class with rbf kernel) and I am pretty happy with the results. Now I need to export the classifiers in production into another codebase that uses Java. I am looking for possible libraries, that are published in maven, that can be easily incorporated in this new codebase.
What do you suggest?
SVC, or Support Vector Classifier, is a supervised machine learning algorithm typically used for classification tasks. SVC works by mapping data points to a high-dimensional space and then finding the optimal hyperplane that divides the data into two classes.
Classification. SVC , NuSVC and LinearSVC are classes capable of performing binary and multi-class classification on a dataset. SVC and NuSVC are similar methods, but accept slightly different sets of parameters and have different mathematical formulations (see section Mathematical formulation).
Linear classifiers are easy: they have a coef_
and an intercept_
, described in the class docstrings. Those are regular NumPy arrays, so you can dump them to disk with standard NumPy functions.
>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> from sklearn.svm import LinearSVC
>>> clf = LinearSVC().fit(iris.data, iris.target)
Now let's dump this to a pseudo-file:
>>> 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
That's something you can parse from Java, right?
Now to get a score for the k
'th class on a sample x
, you need to evaluate
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])
which is also doable, I hope. The class with the highest score wins.
For kernel SVMs, the situation is more complicated because you need to replicate the one-vs-one decision function, as well as the kernels, in the Java code. The SVM model is stored on SVC
objects in the attributes support_vectors_
and dual_coef_
.
I don't know how to export SVM models in one framework and import them in another, but it could be helpful to understand which parameters describe your model - these are the support vectors selected by the SVM training mechanism, plus the kernel and (some) hyperparameters. I would save those into a file and then pickup any machine learning library in your target language and see if I could initialize SVM classifiers by feeding them with those parameters, instead of training them again.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With