Ejercicio: Visualización del modelo de Machine Learning

Completado

Una de las ventajas de utilizar un clasificador de árbol de decisión es la visualización que puede usar para comprender mejor cómo el modelo toma las decisiones. Con graphviz y pydotplus, puede ver rápidamente cómo se toma una decisión. En futuras iteraciones, puede ver cómo se cambian las decisiones.

Creación del árbol visual

Para crear una representación visual del modelo, debe crear una función que tome los siguientes elementos como parámetros:

  • Datos: tree; el modelo de Machine Learning
  • Columnas: feature_names; una lista de las columnas de los datos de entrada
  • Salida: class_names; una lista de las opciones de clasificación (en este caso, Sí o No)
  • Nombre de archivo: png_file_to_save; el nombre del archivo en el que quiere guardar la visualización

Llamará a la función export_graphviz() de scikit-learn y, después, devolverá una imagen que representa el grafo generado de forma automática por scikit-learn.

# Let's import a library for visualizing our decision tree.
from sklearn.tree import export_graphviz

def tree_graph_to_png(tree, feature_names,class_names, png_file_to_save):
    tree_str = export_graphviz(tree, feature_names=feature_names, class_names=class_names,
                                     filled=True, out_file=None)
    graph = pydotplus.graph_from_dot_data(tree_str)  
    return Image(graph.create_png())

La llamada de esta función es muy sencilla:

  • Datos: tree_model; el modelo que ha entrenado y probado antes
  • Columnas: X.columns.values; la lista de columnas de la entrada
  • Salida: [yes,no]; los dos resultados posibles
  • Nombre de archivo: decision_tree.png; el nombre del archivo en el que quiere guardar la imagen
# This function takes a machine learning model and visualizes it.
tree_graph_to_png(tree=tree_model, feature_names=X.columns.values,class_names=['No Launch','Launch'], png_file_to_save='decision-tree.png')

Esta función crea la imagen siguiente.

Visualization of decision tree.

En general, cuando se examina el conjunto de datos, hay 240 muestras:

  • 192 son lanzamientos cancelados
  • 48 son lanzamientos

Este resultado se debe a la estrategia de limpieza de datos, donde se ha asumido que todos los días sin etiquetar son días sin lanzamientos.

Con las etiquetas nuevas, se puede decir "Si la velocidad del viento era inferior a 1,0, 191 de las 240 muestras han adivinado que en ese día no fue posible ningún lanzamiento". Este resultado podría parecer extraño, pero es correcto según los datos. Aquí tenemos la prueba: se ha trazado la distribución entre los días con y sin lanzamientos en los que la velocidad del viento en el momento del lanzamiento < = 1 antes de quitar la columna anteriormente en este cuaderno. se muestra que casi ninguna vez se produce el lanzamiento:

Plot of launches versus no launches.

Descripción de la visualización

En este árbol simple se muestra que la característica más importante de los datos ha sido Wind Speed at Launch Time. Si la velocidad del viento era inferior a 1,0, en 191 de las 240 muestras se ha adivinado correctamente que no se realizaría el lanzamiento. Se aprecia que solo 191 de esas muestras necesitaban que el valor de Wind Speed at Launch Time fuera inferior a 1,0 para adivinar correctamente el resultado, mientras que por encima de 1,0 se necesita más información.

Estas conclusiones no son correctas. Anteriormente todos los valores que estaban vacíos se han establecido en 0. También se sabe que muchos de los valores que estaban relacionados con el tiempo de inicio eran 0 porque el 60 % de los datos no estaban relacionados con un lanzamiento real o un intento de lanzamiento.

Si continúa el examen del árbol, puede ver que Max Wind Speed es la siguiente característica más importante de los datos. En este caso, se aprecia que, de los 49 días restantes en los que la velocidad máxima del viento era inferior a 30,5, en 48 de ellos se devolvió una salida de lanzamiento correcto y en uno una salida sin lanzamiento.

Estos datos podrían ser más interesantes con un contexto del mundo real. Solo hubo un día en el que se había planificado un lanzamiento y el valor de Max Wind Speed era mayor que 30,5: el 27 de mayo de 2020. El lanzamiento de la Space X Dragon se pospuso al 30 de mayo de 2020. Estas son las pruebas:

launch_data[(launch_data['Wind Speed at Launch Time'] > 1) & (launch_data['Max Wind Speed'] > 30.5)]

Only launch with greater than 1.0 wind speed at launch time and greater than 30 max wind speed.

Mejora de los resultados

Con esta visualización, podría ver que algunas características han pasado a ser importantes. Pero este énfasis se ha basado en información incorrecta.

Una mejora que se podría hacer consiste en determinar la relación entre Max Wind Speed y Wind Speed at Launch Time para las filas que tienen esa información. Después, en lugar de establecer Wind Speed at Launch Time en 0 para los días en los que no hay lanzamientos, se podría haber convertido en la estimación de lo que sería una hora de lanzamiento común. Este cambio podría haber representado mejor los datos.

¿Se le ocurren otras formas de mejorar los datos?