Gecofer / TFM_1920

Repositorio para el TFM del Máster TECI en el curso 2019/2020

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Trabajo de Fin de Máster

Repositorio para el Trabajo de Fin de Máster (TFM) del Máster Universitario en Tratamiento Estadístico Computacional de la Información (TECI) en el curso 2019/2020, realizado por Gema Correa Fernández.

  • El PDF del TFM se encuentra aquí
  • La presentación del TFM se encuentra aquí

Tabla de Contenidos

La propuesta del TFM se puede encontrar aquí.

Objetivo

MLOps y cómo industrializar el uso de Machine Learning: un ejemplo práctico para anticipar el malware en sistemas Windows

Desafíos

En este trabajo se desarrolla el enfoque actual de MLOps, desde la perspectiva de las empresas en España y su posible introducción al campo académico. Además, se abordan distintos aspectos metodológicos, se proponen varias alternativas de arquitectura (herramientas y configuración del sistema) para llevar a cabo un MLOps de éxito. En términos generales, MLOps se basa en los principios y las prácticas de DevOps para aumentar la eficacia de los flujos de trabajo en los proyectos de Machine Learning. Asimismo, se presenta MLOps en casos reales de empresas donde el objetivo de negocio es detectar (predecir) la ocurrencia de un evento - como puede ser el fraude de transacciones online o el malware informático, entre otros. Para ello, será necesario mostrar cómo se desarrolla cada una de las etapas del proceso de modelización, incluyendo varias opciones de creación de variables para el modelo y métricas de diagnosis y selección de modelos de clasificación. Además, de introducir MLflow, plataforma que nos permite gestionar todo el ciclo de vida de Machine Learning.

En los siguientes diagramas (realizados por mí) se puede ver una idea de cuál va a ser la arquitectura a crear para el enfoque de MLOps tanto en local como en el cloud:

Datos

El objetivo de este dataset es predecir la probabilidad de que una máquina Windows se infecte por varias familias de malware, en función de las diferentes propiedades de esa máquina. Los datos de telemetría que contienen estas propiedades y las infecciones de la máquina se generaron mediante la combinación de informes y amenazas recopilados por la solución de protección de Microsoft, Windows Defender. Los datos con los que vamos a trabajar han sido obtenidos de Kaggle (https://www.kaggle.com/c/microsoft-malware-prediction/data). Para poder realizar su extracción, es necesario aceptar las reglas. Cada fila de este conjunto de datos corresponde a una máquina, identificada de forma exclusiva por un identificador MachineIdentifier, donde HasDetections indica que se detectó malware en la máquina (0 FALSO, 1 VERDADERO). Usando la información y las etiquetas en train.csv, se debe predecir el valor de HasDetections en una máquina nueva.

La detección de malware es un problema propio de series temporales, pero se complica al introducir nuevas máquinas, conexiones entre máquinas, máquinas con parches, máquinas con programas beta, máquinas con nuevos sistemas operativos, etc. Es importante, destacar que este conjunto de datos no es representativo de las máquinas de los clientes de Microsoft en la naturaleza; ya que está muestreado para incluir una proporción mucho mayor de máquinas de malware.

Notebooks

  • 2-MicrosoftMalwarePrediction-Preprocesamiento contiene el preprocesamiento y tratamiento de los datos (pincha aquí para saber más).
    • Eliminar variables que no aportan información
    • Análisis de Componentes Principales (PCA)
    • Missings
      • Missings por columnas
      • Missings por filas
    • Pasar a minúsculas las variables categóricas
    • Transformar variables
      • Transformar missings a 'unknown' en variables categóricas
      • Fusionar la etiqueta 'unspecified' con 'unknown'
      • Fusionar la etiqueta 'portable' con 'notebook' en Census_ChassisTypeName
      • Cambiar la etiqueta 'promt' por 'prompt' en SmartScreen
      • Arreglar Census_OSEdition
      • Arreglar Census_OSInstallTypeName
      • Agrupar valores de Census_TotalPhysicalRAM
      • Agrupar valores de Census_SystemVolumeTotalCapacity
      • Agrupar valores de Census_PrimaryDiskTotalCapacity
    • Outliers
    • Correlación
      • Label Encoding para columnas categóricas
      • Estudiar la correlación

  • 7-MicrosoftMalwarePrediction-MLflow.ipynb contiene el código para realizar la puesta en producción de varios modelos con MLflow (pincha aquí para saber más).

    # Iniciamos 'mlflow'
    with mlflow.start_run():
    
        # Cargamos el modelo 01
        pkl_filename_01 = "modelos/random_forest_01.pkl"
        with open(pkl_filename_01, 'rb') as file:
            rf_model_01 = pickle.load(file)
    
        # Obtenemos las predicciones con el modelo 01  
        predict_01 = rf_model_01.predict(X_val)
    
        # Calculamos diversas medidas
        (rmse, mae, logloss, accuracy, F1, precision, recall, auc) = eval_metricas(y_val, predict_01)
    
        # Log mlflow parámetros
        mlflow.log_metric("rmse", rmse)
        mlflow.log_metric("mae", mae)
        mlflow.log_metric("logloss", logloss)
        mlflow.log_metric("accuracy", accuracy)
        mlflow.log_metric("F1", F1)
        mlflow.log_metric("precision", precision)
        mlflow.log_metric("recall", recall)
        mlflow.log_metric("auc", auc)
    
        # Log modelo generado
        mlflow.sklearn.log_model(rf_model_01, "RFmodel01")

Aplicación Web

MLflow

MLflow es una plataforma de código abierto para administrar el ciclo de vida de aprendizaje automático.

Poner en producción modelos con MLflow en local

Para poner en producción modelos en local (después de ejecutar 7-MicrosoftMalwarePrediction-MLflow.ipynb), es necesario poner la ruta donde se encuentra el modelo creado por la herramienta MLflow. Por ejemplo, mi ruta en local sería /Users/gema/Desktop/TFM/codigo/mlruns/0/72fd515589624214b2c41bcfa44aef17/artifacts/RFmodel01 o la de Github https://github.com/Gecofer/TFM_1920/tree/master/mlruns/0/326a8d2080934288afe93177737d3844/artifacts/GBmodel (pincha aquí para saber más).

# Lanzar interfaz de mlflow ui (se abrirá en http://127.0.0.1:5000)
mlflow ui

# Poner en producción modelo RF (http://0.0.0.0:8001/invocations)
mlflow models serve -m /Users/gema/Desktop/TFM/codigo/mlruns/0/72fd515589624214b2c41bcfa44aef17/artifacts/RFmodel01 -h 0.0.0.0 -p 8001

# Poner en producción modelo RL (http://0.0.0.0:8002/invocations)
mlflow models serve -m /Users/gema/Desktop/TFM/codigo/mlruns/0/aac82aa84f6d4b82adafd19fc2975050/artifacts/RLmodel01 -h 0.0.0.0 -p 8002

# Poner en producción modelo GB (http://0.0.0.0:8003/invocations)
mlflow models serve -m /Users/gema/Desktop/TFM/codigo/mlruns/0/326a8d2080934288afe93177737d3844/artifacts/GBmodel -h 0.0.0.0 -p 8003

Vídeo demostrativo para ver como lanzar la interfaz de MLflow: videoMLflow

Poner en producción modelos con MLflow en el cloud

Como comparativa de la herramienta MLflow en local, se ha realizado un ejemplo en el cloud (Microsoft Azure). En concreto, se hace uso de Azure Databricks, la cual tiene integrada MLflow (pincha aquí para saber más).

Vídeo demostrativo del funcionamiento de MLflow en Azure y funcionamiento final de MLOps con la herramienta Postman: videoMLflowAzure

Funcionamiento de la aplicación Web

El funcionamiento de la aplicación Web es el mismo independiente de que la puesta en producción sea en local o en el cloud, simplemente se necesita acceso a la API del modelo o URI para poner realizar las diversas peticiones o consultas. El código se encuentra aquí y ha sido realizado con el lenguaje de programación Python, el framework Flask y Bootstrap (pincha aquí para saber más).

...

# Hacemos la petición, y nos quedamos con la salida (probabilidad)
url = 'http://localhost:8001/invocations'
headers = {"content-type": "application/json; format=pandas-split"}
r = requests.post(url, data=data, headers=headers)

return render_template("probabilidad_random_forest.html", malware = r.text)

Vídeo demostrativo del funcionamiento de la aplicación Web: videoAppWeb

Referencias

Información administrativa sobre el TFM

Documentación sobre MLflow

Licencia

Proyecto bajo licencia GNU GLP V3.

About

Repositorio para el TFM del Máster TECI en el curso 2019/2020

License:GNU General Public License v3.0


Languages

Language:Jupyter Notebook 99.4%Language:HTML 0.5%Language:Python 0.1%