[AUDIO_EN_BLANCO] [MÚSICA] Hola. Vamos a continuar con árboles de clasificación. Esta técnica nos va a permitir analizar una variable de tipo binario, nuestro caso, la variable objetivo va a ser el retraso sí o no. Habíamos definido esta variable como sí en el caso que el retraso en minutos fuera superior a 15, a 15 minutos. Para proceder, empezamos capturando la base de datos como es habitual. A continuación, llevábamos a cabo la transformación de la variable Compañía que opera el vuelo, de forma que esta variable, que es alfanumérica, es transformada a una variable con códigos numéricos. Aquí vemos la instrucción para comprobar esta transformación. Y procedíamos definiendo las variables que van a intervenir en el modelo. En primer lugar, empaquetamos todas estas variables, que van a ser las variables de trabajo, en una única columna, features. Y luego, a la variable objetivo, nuestro caso con este nombre, retraso, es identificada para proceder. En el caso particular de los árboles de clasificación, la variable objetivo debe ser de tipo doble. Por lo tanto, transformamos la variable a tipo doble. Y además, la variable debe estar convertida a través de la función stringIndexer para poder ser analizada. Es una transformación un poco redundante, pero es necesaria porque forma parte de los criterios para ejecutar el modelo. Por lo tanto, la variable de trabajo, en nuestro caso, se va a llamar label2. Porcedemos, llevando a cabo la partición de la base de datos en dos subconjuntos, la base de datos de entrenamiento, la base de datos de test, con estas dimensiones, 70% y 30% respectivamente, empleando esta semilla para que el proceso sea reproducible. Las bases de datos, aquí vemos sus dimensiones. Podemos proceder, ejecutando el modelo. En particular, uno de los parámetros a indicar es la profundidad. Definimos que la profundidad sea cinco. Y en particular, también necesitamos especificar que la variable objetivo es esta de aquí. Tras ejecutar el modelo en la base de datos de entrenamiento, podemos llevar a cabo y capturar los valores predichos. Aquí vemos la base de datos resultante con la variable original, las variables explicativas empaquetadas, que han formado parte de la predicción, la variable original transformada para ser incorporada en el modelo y los valores predichos. Aquí vemos la columna rawPrediction, donde se está especificando el número de casos positivos y negativos en cada uno de los nodos terminales, de hecho, en el nodo terminal pertinente para cada observación. Vemos en este caso particular que este nodo terminal contiene 7186 observaciones 0 y 290 observaciones 1. Por lo tanto, la probabilidad de ser 0 es próxima al 96% y la probabilidad de ser 1, que aquí no se ve por una cuestión de representación, pero estaría al lado, porque esto es un vector, la probabilidad de ser 1 es en torno del 3%. El valor predicho, estableciendo un punto de corte del 50%, es obviamente en este caso un 0. Podemos también inspeccionar un poco la naturaleza del árbol generando una tabla de frecuencias de las distintas probabilidades asignadas, es decir, de los distintos nodos terminales. Aquí vemos, para cada una de las combinaciones de estas probabilidades, el número de casos que han sido reflejados. Por ejemplo, en esta combinación hay 40 observaciones. Esto vendría a reflejar los nodos terminales resultantes del árbol. Para proceder, podemos ahora describir la tabla, la matriz de confusión representando las combinaciones de los valores originales y los predichos. Recordad que el punto de corte ha sido fijado en 0,5, aunque también se puede modificar. Aquí veríamos la matriz de confusión de donde podríamos extraer la sensibilidad, la especificidad, accuracy y este tipo de índices que you vimos en videos anteriores. No obstante, la capacidad predictiva del modelo se puede obtener a través de la curva ROC y su área debajo. La curva ROC se puede representar empleando herramientas propias de Python. Para ello, necesitamos los valores originales de la variable objetivo, más las probabilidades de ser 1. Esas probabilidades, en realidad, se encuentran empaquetadas en este vector y deben ser extraídas. Aquí vemos una función, una función definida por el usuario, udf, de donde se va a extraer la segunda componente. Fijaros que las componentes son 0 y 1, por lo tanto, esta de aquí indica la segunda componente. Por lo tanto, la probabilidad de ser 1. Esta nueva columna se va a llamar props, aquí lo vemos. Se lleva a cabo la transformación, obtenemos esta columna y podemos proceder generando una base de datos en formato pandas con estas dos columnas de interés y no obstante, que ello represente tan solo una pequeña muestra de los casos, porque el gráfico va a ser esencialmente el mismo. La sintaxis para llevar a cabo la curva, la representación de la curva, es propia de Python y esto se va a basar en la librería Seaborn. Aquí vemos el gráfico. Este gráfico nos permite visionar para un punto de corte particular, por ejemplo, este de aquí, la sensibilidad y la especificidad que se generarían. Por ejemplo, en este caso, del 80% de sensibilidad y de una especificidad en torno al, bueno, 85%, una cosa de este estilo. Estaría por aquí. Finalmente, podemos calcular el área bajo la curva empleando las métricas de evaluación estándar para este tipo de variables y este tipo de modelos. No obstante, siendo un árbol de clasificación, la columna que nos indica las predicciones tiene que ser probability. La columna probability es la que indicaremos para llevar a cabo los cálculos. El área bajo la curva resultante es de un 92%. Aquí vemos otras opciones propias del árbol de clasificación que pueden ser modificadas, por ejemplo, la profundidad del árbol, el número de particiones para las variables cuantitativas, el número mínimo de observaciones por nodo terminal, el criterio de ganancia de información para saber si es necesario continuar partiendo o no es necesario, y criterios de pureza de los nodos terminales. En particular, el árbol de clasificación nos permite emplear el índice Gini y también la entropía. Tras ejecutar un nuevo árbol, en este caso modificando la profundidad, haciendo pues que sea 20, algo más profundo, llevamos a cabo el modelo, ejecutamos, llevamos a cabo las predicciones, las predicciones en la base de datos de entrenamiento y vemos ahora al área bajo la curva resultante. Vemos que el resultado es bastante elevado, 99.96 prácticamente. Esto sería un resultado muy óptimo. No obstante, se basa en solo la base de datos de entrenamiento. Para tener una idea de su capacidad real, necesitamos tan solo aplicar el modelo a la base de datos de entrenamiento y capturar la métrica de nuevo. Las predicciones las generamos para la base de datos test y capturamos la métrica AUC de nuevo empleando la columna probability. Y ahora el resultado final, un resultado un poco más limpio, es del 82%, que también es un valor alto, pero you no tanto. Hasta aquí el video donde explicábamos el árbol de clasificación. [MÚSICA] [AUDIO_EN_BLANCO]