Tu primer experimento en Azure ML Studio: El caso del Titanic (III): Entrenando el modelo

Wednesday, November 29, 2017

Tu primer experimento en Azure ML Studio: El caso del Titanic (III): Entrenando el modelo

Bienvenidos a la tercera  entrega del tutorial ejemplo de creación de un modelo de Machine Learning (ML) en Azure ML Workplace aplicado al dataset de pasajeros del Titanic. Tras la introducción a la herramienta que hicimos en la primera parte, en la segunda, creamos el experimento, y llevamos a cabo todos los procesos de  carga, depuración y tratamiento de los datos, previos a la creación del modelo predictivo.  Ahora, es el momento de construir el modelo.

4. Construcción del Modelo

En el primer post del experimento explicamos lo que eran los datos de entrenamiento y los datos de test (“Concepto Training Data vs Testing Data). Ahora vamos a dividir nuestro dataset de forma aleatoria en esos dos conjuntos de datos. Usaremos el 70% de los datos como datos  de entrenamiento, y el 30% que nos reservamos nos servirá para evaluar la eficacia de  nuestro modelo a la hora de predecir valores futuros o desconocidos.

Para ello, usaremos el modulo de “Split”, siguiendo estos pasos:
  • En el menú “Data Transformation” (a la izquierda) seleccionamos “Sample and Split\Split Data”. 
  • Lo conectamos con el elemento anterior del flujo  (“Select columns in Dataset")
  • En el menú “Properties”, a la derecha damos al parámetro “fraction of rows in the first dataset” el valor 0.7. Esto significa que el 70% de los datos se asignarán de forma aleatoria al nodo de salida izquierdo (“1”), mientras que el 30% se asignará al nodo derecho (“2”) Esta partición de los datos en proporción 70/30 es un valor habitual en Machine Learning, pero podemos definir distintas proporciones según el problema.

Figura1: Añadimos el módulo Split al flujo.
Figura 1: Añadimos el módulo Split al flujo.

Figura1: Propiedades del módulo Split.
Figura 2 : Propiedades del módulo Split.


4.1 Selección del algoritmo


Ya ha llegado el momento de identificar qué tipo de problema tenemos entre manos, y en qué tareas conocidas lo podemos descomponer. Para ello, nos puede resultar muy útil releer estos post de la serie de Machine Learning:


Así, podemos ver que se trata de un caso de aprendizaje supervisado, donde la clase de respuesta o variable objetivo es un valor categórico “0”=superviviente, “1”=fallecido. Por tanto, estamos ante un problema de clasificación binario o de clase dos.

Podemos consultar, por ejemplo, la cheat-sheet de algoritmos machine Learning de Azure  para intentar determinar qué algoritmo puede funcionar mejor en este caso. Hemos “recortado” la parte que nos interesa para verlo mejor.

Por tanto, desde el botón START, seguimos la ruta, predecir categorías (“predicting categories”), dos categorías y vemos que nos propone una serie de algoritmos, indicando sus características más relevantes.  Vamos a probar con el algoritmo de árbol de decisión.

Figura3: Extracto de la cheat-sheet de algorimos de Azure ML.
Figura 3: Extracto de la cheat-sheet de algorimos de Azure ML.

El concepto en el que se basan los árboles de decisión es, dado un conjunto de datos de entrada, con unos atributos bien definidos, puede ser clasificado totalmente basándose en decisiones sobre cada uno de ellos. Cada nodo de un árbol es una pregunta a la que hay que responder, y de él salen distintas ramas hacia cada una de las respuestas posibles. Una vez hemos llegado a los nodos “hoja” (los finales), el algoritmo ha clasificado correctamente el dato de entrado o ha dado con la decisión correcta.

Visualmente lo veríamos así. En cada nodo se plantea una pregunta. En este caso, las preguntas clasifican por sexo, por edad y por tener familiares directos embarcados. Clasifica cada caso según estos parámetros y les asigna la etiqueta “Survived” o “Died”. Bajo cada etiqueta, tenemos la probabilidad de supervivencia y el porcentaje de casos observados.

Así, según este diagrama, veríamos que un 36% del pasaje eran mujeres, y su probabilidad de supervivencia fue del 0,73. El 61% de los pasajeros eran hombres y el 2% niños. Entre los niños, las probabilidades de supervivencia eran mucho mayores (0,89) entre aquellos que iban acompañados de familiares directos. Aunque se suele decir aquello de “Las mujeres y los niños primero”, parece ser que en este caso fue “Los niños y los hombres primeros”, ya que, entre los hombres, la probabilidad de supervivencia fue del 0,83.

Figura 4: Ejemplo de visualización de un árbol de decisión.
Figura 4: Ejemplo de visualización de un árbol de decisión.

Los árboles de decisión son muy populares porque son sencillos de construir y de comprender, siendo a la vez muy eficientes. Por eso, tras ver este ejemplo de visualización de uno de ellos, vamos a ver qué resultados obtenemos a aplicar este algoritmo al dataset de nuestro experimento.

4.2 Comienza el “entrenamiento”.


Para seleccionar el algoritmo, agregamos el módulo desde “Machine Learning/Initialize Model/Classification”. Aunque nos podría funcionar cualquier de los algoritmos de clasificación de dos variables, vamos a elegir el algoritmo "Two-class decission forest".


Figura 5: Elegimos el algoritmo del menú Machine Leaning.
Figura 5: Elegimos el algoritmo del menú Machine Leaning.



Figura 6: Agregamos el módulo correspondiente al algoritmo.
Figura 6: Agregamos el módulo correspondiente al algoritmo.

Ahora, agregamos un módulo de entrenamiento (desde “Machine Learning/Train/Train Module”) y lo conectamos al algoritmo y a la parte izquierda del módulo Split, que correspondía a los datos de entrenamiento (el 70% del dataset).

Como en este caso no sólo queremos predecir el valor de una variable (si la persona sobrevivió o no al naufragio), sino que también queremos predecir la probalilidades de supervivencia que tenía un individuo determinado según el valor de ciertas variables, vamos a agregar también un módulo de Scoring. Desde la ruta “Machine Learning/Score/Score Module”. Conectamos el módulo de Scoring al módulo de entrenamiento del modelo, y a los datos “reservados” (el 30% que corresponde a la salida derecha del módulo Split data). Si tenemos dudas sobre qué lado del módulo es el que corresponde,  siempre podemos visualizar los datos desde el menú contextual del módulo Split.

Al conectar los datos de test al modelo entrenado, vemos cuán bueno es el modelo que hemos entrenado con el training test para clasificar los casos nuevos que habíamos separado del dataset original. Comparando los valores reales de ese conjunto de datos (sabemos de cada individuo si sobrevivió o no), con lo que ha predicho el modelo, podemos calcular su precisión.


Figura 7: Conectamos los módulos Train Model y Score Model.
Figura 7: Conectamos los módulos Train Model y Score Model.








Por último, como vamos a querer evaluar el modelo, añadimos a continuación un módulo de evaluación desde “Machine Learning/Evaluate/ Evaluate Model” y lo conectamos con el de Score. Una vez hecho esto, ponemos el modelo a trabajar pulsando “Run”.

4.3 Evaluamos el modelo


Cada problema en Machine Learning tiene un objetivo diferente. Por tanto, las prioridades a la hora de evaluar si el rendimiento es bueno o malo se basarán en distintas métricas. En este caso, vamos a elegir maximizar el área bajo la curva RoC (RoC Auc). Explicar cómo se utilizan las curvas ROC para evaluación de modelos queda fuera del alcance de este post (haremos uno específico). Pero, por ahora, nos basta con tener en cuenta que este área posee un valor comprendido entre 0,5 y 1, donde 1 representa un valor diagnóstico perfecto y 0,5 es una prueba sin capacidad discriminatoria diagnóstica. En diagnósticos médicos, si el AUC es 0,8 significa que existe un 80% de probabilidad de que el diagnóstico realizado a un enfermo sea más correcto que el de una persona sana escogida al azar. Por esto, siempre se elige la prueba diagnóstica que presente mayor área bajo la curva.


Fig 8: Curvas ROC AUC (fuente: CC-BY-SA_3.0 UPO649 1112 prodgom).
Figura 8: Curvas ROC AUC (By UPO649 1112 prodgom (Own work) [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons ).


Como valores de referencia para evaluar un modelo por este método tenemos:
  • [0.5, 0.6): Test descartable, malo 
  • [0.6, 0.75): Test regular.
  • [0.75, 0.9): Test bueno.
  • [0.9, 0.97): Test muy bueno.
  • [0.97, 1): Test ¿demasiado bueno?

En el módulo “Evaluate Model/evaluation results/visualize”, podemos ver la curva ROC, la proporción de Falsos Positivos/Falsos Negativos (ver post sobre “Tipos de error en ML”), el valor AUC y otras métricas. En concreto, el valor AUC es de 0.814, es un valor bueno.


Figura 9: Valor AUC para este modelo
Figura 9: Valor AUC para este modelo.

¿Cómo podríamos mejorar este valor?. Por ejemplo, ajustando los parámetros del algoritmo. Si nos vamos al módulo del algoritmo, podemos definir propiedades como el número de árboles que queremos que cree, la profundidad, el tipo de muestreo etc. En un futuro post específico sobre este algoritmo los veremos con detalle.


Figura 10: Menú de ajuste de parámetros del modelo.
Figura 10: Menú de ajuste de parámetros del modelo.


Si visualizamos el módulo “Train Model” (desde su menú contextual) podemos incluso ver los árboles que ha creado, preguntando en cada nodo sobre diferentes parámetros.


Figura 11: Visualización de un detalle de uno de los árboles que ha construido el modelo.
Figura 11: Visualización de un detalle de uno de los árboles que ha construido el modelo.

4.4  Comparamos con otros modelos


Si queremos comparer nuestro modelo con otro basado en un algoritmo diferente, no tenemos más que elegir otro algoritmo, copiar y pegar los módulos que “Train Model” y “Score Model” que ya teníamos, y conectarlos entre ellos y con los conjuntos de datos de la misma forma que hemos hecho antes. La salidad del “Score Module” la llevamos al “Evaluation Module” que teníamos anteriormente y así podemos comparar el rendimiento de dos modelos de machine Learning que hemos entrenado por separado.

Figura 12: Probamos con otro algoritmo.
Figura 12: Probamos con otro algoritmo.

El Nuevo valor de AUC con el modelo “Two-Class Boosted Decision” es ligeramente superior, pero en este caso, al ser tan pequeña la diferencia, sería conveniente tener en cuenta otros valores como la exactituc (“Accuracy”) o la precisión (“precisión”).

Figura 13: Nuevo valor AUC con el segundo algoritmo.
Figura 13: Nuevo valor AUC con el segundo algoritmo.

En este ejemplo, el mejor algoritmo teniendo en cuenta estas últimas métricas, sería el Two class decisión forest.

Et voilà. Hemos construido nuestro primer modelo machine Learning en Azure ML Studio, lo hemos entrenado con el dataset del Titanic, hemos analizado su rendimiento comparándolo con el de otro algoritmo distinto y ya, sólo nos quedaría operativizarlo. La semana que viene, cerramos la serie y probamos nuestro modelo con el dataset de Test que nos descargaremos de Kaggle.

¡No te pierdas el final de nuestro experimento!

Los post anteriores de este experimento:

No comments:

Post a Comment