Exportar modelo de Machine Learning de Python a Java

0
268

En este post, te mostraré cómo entrenar un modelo de Machine Learning en Python utilizando Sklearn y cómo exportarlo como código ejecutable en Java.

Es importante destacar que la mayoría de los recursos de Machine Learning están disponibles en Python, como por ejemplo Sklearn. En contraste, aunque existen recursos para construir algoritmos de Machine Learning en Java, no son tan sencillos de utilizar como en Python y cuentan con menos documentación.

Recientemente, he descubierto que es posible construir y entrenar un modelo de clasificación en Sklearn en Python, y convertir el modelo entrenado en una clase que puede ser utilizada en Java para replicar los resultados obtenidos en Python de manera nativa en Java. Este enfoque te permitirá aprovechar las fortalezas de ambos lenguajes y utilizarlos de manera efectiva en tu proyecto de Machine Learning.

Antes de entrar en materia les recomiendo revisar estas dos publicaciones previas, pues me basaré en ellas para desarrollar el modelo que presentaré en este post:

Sin más que decir, empecemos.

Construcción del modelo en Python

Para esta demostración utilizaremos el modelo de LogisticRegression que presentamos en nuestra publicación anterior. Este modelo permite hacer predicciones sobre los resultados de biopsias con los resultados de las mamografías y la evaluación BI-RADS. Es un modelo sencillo, con apenas 5 features y dos posibles valores predecibles, 1 o 0 (tumor benigno o tumor maligno).

El script que utilizaremos para construir y entrenar el modelo es el siguiente:

Este código está disponible en Github. El script básicamente utiliza la librería M2cgen para convertir el modelo entrenado en código ejecutable. Al ejecutar este modelo se hará hará una clasificación de datos y se creará un fichero llamado trained_model.java. Este archivo contiene el siguiente código:

Como vemos se trata de un código muy simple. Al tratarse de un modelo de Regreresión Logística se crea un modelo en la forma de una ecuación lineal. Cada una de los features se multiplica por un coeficiente, el cual producirá un valor que puede ser positivo o negativo.

Si el valor es mayor que cero, se considera un «1» (tumor maligno). Si el valor es menor que cero se considera un «0» (tumor benigno). Es un modelo muy simple, pero funciona.

Código en Java

Para probar este código utilizaremos el siguiente código en Java:

Este código se encuentra disponible en nuestro repositorio de Github. El resultado de ejecutar este código en Java es el siguiente:

El 85.5% de eficiencia en la clasificación es consistente con el resultado obtenido en Python, el cual reportamos en nuestro post anterior.

Debo mencionar que para que este código funcione se necesita tener las dos clases en la misma carpeta. El código creado en Python debe renombrarse en Model.java. Les recomiendo que descarguen el repositorio completo y lo abran con Netbeans.

machine learning en Java
Así luce el proyecto en Netbeans con el modelo generado en Python

Probando con modelos más complejos

El modelo de LogisticRegression es muy simple, una ecuación lineal. Es el modelo que presentó un mejor desempeño en esta tarea específica, pero desde el punto de vista de código es muy simple.

Si cambiamos el modelo de LogisticRegression por un modelo más complejo, como Random Forest, el resultado será completamente distinto. Hice la prueba y el resultado es inmenso:

machine learning en Java

El código lo pueden encontrar aquí. En el entrenamiento en Python el resultado obtenido fue el siguiente:

Ahora intentaremos replicar este resultado en Java. Utilizaremos este código, el cual produce este resultado:

machine learning en Java
Resultado de ejecutar el modelo entrenado de Random Forest en Java

Como vemos, es el mismo resultado que en Python. Hemos logrado ejecutar exitosamente un modelo de Random Forest en Java.

Consideraciones sobre el uso de M2cgen

En algunos casos, el código generado puede ser tan grande y complejo que no se puede compilar en Java. Como ejemplo, probé un clasificador Random Forest en el conjunto de datos MNIST, como se muestra en nuestro post anterior. Sin embargo, el resultado fue una clase en Java con un peso de 150 MB y más de 1.7 millones de líneas de código.

Desafortunadamente, esta clase no pudo ser compilada para ser utilizada en Java debido a las restricciones en cuanto al tamaño de las clases en la Máquina Virtual de Java. En consecuencia, habrá ocasiones en las que no podremos utilizar el código generado, ya que será demasiado extenso para ser utilizado en una aplicación en Java. En estos casos, deberemos explorar otras opciones para poder utilizar nuestro modelo de Machine Learning en un entorno de producción en Java.

Conclusiones

En  este post aprendimos cómo entrenar un modelo de Machine Learning en Python utilizando Sklearn y cómo exportarlo como código ejecutable en Java. Esta técnica nos permite aprovechar las fortalezas de ambos lenguajes de programación y utilizarlos de manera efectiva en proyectos de Machine Learning. Aunque hay limitaciones en cuanto al tamaño y complejidad del código generado, esta técnica es una excelente opción para modelos sencillos y medianamente complejos.

En casos de modelos más complejos, es importante explorar otras opciones para utilizar modelos de Machine Learning en un entorno de producción en Java.

Muchas gracias por leer este post y espero que haya sido de utilidad para ti. Si tienes alguna pregunta o comentario, no dudes en escribirlo en la sección de comentarios a continuación. Me encantaría conocer tu opinión y escuchar tus ideas sobre este tema.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

0 Comments
Inline Feedbacks
View all comments