Crea Una Aplicación De Machine Learning Con React y Flask

Karan Bhanot
Jun 22, 2020

Crea Una Aplicación De Machine Learning Con React y Flask

Jun 22, 2020 9 minutes read

Photo by Alvaro Reyes on Unsplash


Siempre he querido desarrollar una aplicación completa de aprendizaje automático en la que tuviera una interfaz de usuario para incorporar algunas variables de entrada y un modelo de aprendizaje automático para predecir esos valores. La semana pasada, hice justo eso. En el proceso, creé una plantilla fácil de usar en React y Flask, que cualquiera puede modificar para crear su propia aplicación en cuestión de minutos.

Lo más destacado del proyecto: 

1. El front-end se desarrolla en React y comprendería una sola página con un formulario para presentar los valores de entrada

2. El back-end se desarrolla en Flask que expone los puntos finales de la predicción para predecir usando un clasificador entrenado y enviar el resultado de vuelta al front-end para su fácil consulta

El repo de GitHub está abajo. Forquea el proyecto y crea tu propia aplicación hoy!

https://github.com/kb22/ML-React-App-Template



Lea También: Mejorar Tu Modelo De Machine Learning Probando Diferentes Enfoques

Plantilla 


React

React es una biblioteca de JavaScript creada por Facebook para ayudar a que el trabajo con las interfaces de usuario sea simple y fácil de desarrollar y utilizar. Es uno de los principales lenguajes para el desarrollo de interfaces. Puede leer sobre ello aquí. El mejor recurso para aprender sobre React es su propia documentación, que es muy completa y fácil de comprender.

Flask y Flask-RESTPlus

Flask y Flask-RESTPlus nos permiten definir un servicio en Python que tendrá puntos finales que podemos llamar desde la UI. Puedes aprender más sobre el desarrollo de una aplicación Flask en mi artículo más abajo.

Descripción 


Usé create-react-app para crear una aplicación básica de React para empezar. Luego, cargué el bootstrap que nos permite crear sitios web receptivos para cada tamaño de pantalla. Actualizé el archivo App.js para añadir un formulario con desplegables y botones de Predicción y Reinicio de Predicción. Añadí cada propiedad del formulario al estado y al pulsar el botón de Predicción, envío los datos al backend de Flask. También he actualizado el archivo App.css para añadir estilo a la página.

Vista de la plantilla


La aplicación Flask tiene un punto final POST / predicción. Acepta los valores de entrada como un json, lo convierte en un array y vuelve a la UI. En la aplicación real, usaremos los mismos datos para hacer la predicción usando el clasificador almacenado en classifier.joblib y retorna la predicción.

Predicción mostrada en la UI


Reiniciar la predicción eliminará la predicción de la UI.


Le puede interesar leer también: Comprensión de la Matriz de Confusión y Cómo Implementarla en Python

Iniciando la Plantilla 


Clona el repo a tu ordenador y ve dentro de él y abre dos terminales aquí.

Preparando la interfaz de usuario

En la primera terminal, entra en la carpeta ui usando cd ui. Asegúrate de que estás usando el nodo versión 10.4.1. Una vez dentro de la carpeta, ejecute el comando "yarn install" para instalar todas las dependencias. 
Para ejecutar la UI en el servidor, usaremos serve. Empezaremos instalando el serve globalmente, después de lo cual, construiremos nuestra aplicación y finalmente ejecutaremos la UI usando serve en el puerto 3000.

npm install -g serve
npm run build
serve -s build -l 3000
Ahora puedes ir al localhost:3000 para ver que la UI está en funcionamiento. Pero no interactuará con el servicio de Flask que aún no está funcionando. Así que, hagamos eso.

UI


Preparando el servicio

En la segunda terminal, muévase dentro de la carpeta de service usando cd service. Empezamos creando un entorno virtual usando virtualenv y Python 3. Puedes leer sobre virtualenv aquí. Después de activar el entorno, instalaremos todas las dependencias necesarias usando pip. Finalmente, ejecutaremos la aplicación Flask.

virtualenv -p Python3 .
source bin/activate
pip install -r requirements.txt
FLASK_APP=app.py flask run
Esto iniciará el servicio en 127.0.0.1:5000.

Service


¡Voila! La aplicación completa ahora funcionará correctamente. ¡Yaay!


Usando la plantilla para el caso de uso propio


Para entender el proceso de usar la plantilla para cualquier modelo, usaré el conjunto de datos del iris y crearé un modelo para el mismo. Este ejemplo también está disponible en la carpeta de ejemplos del proyecto.

Crear el modelo
Entrené un Clasificador de Árbol de Decisión en el conjunto de datos del iris que requiere 4 características: Longitud del Sépalo, Ancho del Sépalo, Longitud del Pétalo y Ancho del Pétalo. Luego, guardé el modelo en classifier.joblib usando joblib.dump(). El clasificador puede ser usado ahora para predecir nuevos datos.

Actualizar el servicio
 A continuación, abrí el archivo app.py en un editor de texto (Sublime Text es uno). Descompuse el clasificador de líneas = joblib.load('clasificador.joblib') para que el clasificador de variables contenga ahora el modelo entrenado. 
 
En el método post, hice las siguientes actualizaciones:

prediction = classifier.predict(np.array(data).reshape(1, -1))
 | types = { 0: "Iris Setosa", 1: "Iris Versicolour ", 2: "Iris Virginica"}
 | response = jsonify({
 | 				"statusCode": 200,
 | 				"status": "Prediction made",
 | 				"result": "The type of iris plant is: " + types[prediction[0]]
 | 				})

Primero, usé el clasificador.predict() para obtener la predicción. Luego, creé un mapa para las clases de tal manera que 0 significa Iris Setosa, 1 significa Iris Versicolour y 2 significa Iris Virginica. Finalmente devolví la predicción en la llave de "result".

Actualización: Como señaló Martins Untals, olvidé mencionar que también necesitamos actualizar el modelo para que funcione correctamente y tenga el modelo actualizado en la interfaz de usuario de Swagger.

model = app.model('Prediction params', 
 | 				  {'sepalLength': fields.Float(required = True, 
 | 				  							   description="Sepal Length", 
 |     					  				 	   help="Sepal Length cannot be blank"),
 | 				  'sepalWidth': fields.Float(required = True, 
 | 				  							   description="Sepal Width", 
 |     					  				 	   help="Sepal Width cannot be blank"),
 | 				  'petalLength': fields.Float(required = True, 
 | 				  							description="Petal Length", 
 |     					  				 	help="Petal Length cannot be blank"),
 | 				  'petalWidth': fields.Float(required = True, 
 | 				  							description="Petal Width", 
 |     					  				 	help="Petal Width cannot be blank")})

Como se puede ver en la esencia, he actualizado los nombres de los campos, su tipo a Float, la descripción y el texto de ayuda. Lo mismo se reflejará ahora en el Swagger también.

Modelo actualizado en la interfaz de usuario de Swagger



Actualizar la interfaz de usuario 


La forma se compone de columnas dentro de filas. Así, como tengo 4 características, he añadido 2 columnas en 2 filas. La primera fila tendrá desplegables para la longitud y el ancho de los sépalos. La segunda fila tendrá desplegables para la longitud y el ancho del pétalo. 
 
Comencé creando una lista de opciones para cada uno de estos desplegables.

var sepalLengths = []
 | for (var i = 4; i <= 7; i = +(i + 0.1).toFixed(1)) {
 |   sepalLengths.push(<option key = {i} value = {i}>{i}</option>);
 | }
 | var sepalWidths = []
 | for (var i = 2; i <= 4; i = +(i + 0.1).toFixed(1)) {
 |   sepalWidths.push(<option key = {i} value = {i}>{i}</option>);
 | }
 | var petalLengths = []
 | for (var i = 1; i <= 6; i = +(i + 0.1).toFixed(1)){
 |   petalLengths.push(<option key = {i} value = {i}>{i}</option>);
 | }
 | var petalWidths = []
 | for (var i = 0.1; i <= 3; i = +(i + 0.1).toFixed(1)) {
 |   petalWidths.push(<option key = {i} value = {i}>{i}</option>);
 | }
A continuación, definí dos filas con dos columnas cada una. Cada selección desplegable se verá como el código de abajo:

<Form.Group as={Col}>
 |   <Form.Label>Petal Length</Form.Label>
 |   <Form.Control 
 |     as="select"
 |     value={formData.petalLength}
 |     name="petalLength"
 |     onChange={this.handleChange}>
 |     {petalLengths}
 |   </Form.Control>
 | </Form.Group>
Para cada desplegable, tendremos que actualizar el texto dentro de <Form.Label></Form.Label>. Nombraremos cada grupo de selección también. Digamos que el nombre es petalLength, así que fijamos el valor como {formData.petalLength} y el nombre como "petalLength". Las opciones se añaden usando los nombres que definimos arriba dentro de <Form.Control></Form.Control> como podemos ver {petalLengths} arriba. Dos de estos grupos dentro de una <Form.Row></Form.Row> harán nuestra interfaz de usuario.

El estado también debe ser actualizado con los mismos nombres dentro de formData con los valores por defecto como el valor más pequeño de los respectivos desplegables. El constructor se verá como abajo. Como puedes ver, el estado ha sido actualizado para tener formData con nuevas claves.

constructor(props) {
 |   super(props);
 | 

 |   this.state = {
 |     isLoading: false,
 |     formData: {
 |       sepalLength: 4,
 |       sepalWidth: 2,
 |       petalLength: 1,
 |       petalWidth: 0
 |     },
 |     result: ""
 |   };
 | }

Añade una nueva imagen de fondo y un nuevo título
Dentro de app.css, cambia el enlace de la imagen de fondo a la tuya. Añadí una imagen de flores de Unsplash. También he actualizado el título a Iris Plant Classifier y el título de la página también dentro del archivo index.html en la carpeta pública.

Le puede interesar leer: No Aprendas Machine Learning

Resultado

La aplicación ya está lista para usar el modelo. Reinicie ambos servicios después de construir la UI usando npm run build. La aplicación tiene el aspecto que se muestra a continuación:

Pagina Principal


Con algunos valores de características, al pulsar el botón de predecir, el modelo lo clasifica como Iris Setosa.



Con los nuevos valores de las características, el modelo predice que la planta es Iris Versicolor.




Conclusión

Como pueden ver, en este artículo, he hablado de una plantilla de la aplicación ML React que hará que la creación de aplicaciones completas de ML sea simple y rápida.


Pruebe la aplicación para su propio caso de uso y comparta sus comentarios. Me encantaría saber de ti.
Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!