java - score - svc c
Exportación de clasificadores SVM desde sklearn a la base de código Java (2)
He usado sklearn
para entrenar un conjunto de clasificadores SVM (principalmente lineal usando LinearSVM
pero algunos de ellos están usando la clase SVC
con kernel rbf) y estoy muy contento con los resultados. Ahora necesito exportar los clasificadores en producción a otra base de código que usa Java. Estoy buscando posibles bibliotecas, que se publican en maven, que se pueden incorporar fácilmente en esta nueva base de código.
¿Que sugieres?
No sé cómo exportar modelos SVM en un marco e importarlos en otro, pero podría ser útil entender qué parámetros describen su modelo: estos son los vectores de soporte seleccionados por el mecanismo de entrenamiento SVM, más el kernel y (algunos ) hiperparámetros. Los guardaba en un archivo y luego recogía cualquier biblioteca de aprendizaje automático en el idioma de destino y veía si podía inicializar los clasificadores SVM alimentándolos con esos parámetros, en lugar de entrenarlos de nuevo.
Los clasificadores lineales son fáciles: tienen un coef_
y un intercept_
, descritos en la clase docstrings. Esas matrices NumPy normales, por lo que puede volcarlas en el disco con las funciones estándar de NumPy.
>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> from sklearn.svm import LinearSVC
>>> clf = LinearSVC().fit(iris.data, iris.target)
Ahora volvamos esto a un pseudo archivo:
>>> 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
Eso es algo que puedes analizar desde Java, ¿verdad?
Ahora, para obtener un puntaje para la clase k
''th en una muestra x
, necesita evaluar
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])
que también es factible, espero. La clase con el puntaje más alto gana.
Para las SVM de kernel, la situación es más complicada porque necesita replicar la función de decisión de uno contra uno , así como los kernels, en el código de Java. El modelo SVM se almacena en objetos SVC
en los atributos support_vectors_
y dual_coef_
.