Ejercicio: Visualización del modelo de Machine Learning
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.
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:
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)]
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?