Flask
Data Science
Machine Learning
Crea Una Aplicación De Machine Learning Con React y Flask
Photo by Alvaro Reyes on UnsplashSiempre 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 consultaEl repo de GitHub está abajo. Forquea el proyecto y crea tu propia aplicación hoy!https://github.com/kb22/ML-React-App-TemplateLea También: Mejorar Tu Modelo De Machine Learning Probando Diferentes EnfoquesPlantilla 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 plantillaLa 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 UIReiniciar 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 PythonIniciando 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 3000Ahora 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.UIPreparando 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 runEsto 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 propioPara 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 SwaggerLea También: Construye Un Dashboard De Datos En La Web En Sólo Minutos Con PythonActualizar 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ítuloDentro 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 LearningResultadoLa 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 PrincipalCon 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ónComo 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.
Karan Bhanot
June 22, 2020