Creación de un árbol de decisiones

En esta unidad, usarás la YDF (Yggdrasil) Decision Forest) entrenan e interpretan un árbol de decisiones.

Esta unidad está inspirada en el 🧭 Primeros pasos de YDF .

Aspectos preliminares

Antes de estudiar el conjunto de datos, haz lo siguiente:

  1. Crea un nuevo Colab notebook.
  2. Instala la biblioteca de YDF colocando y ejecutando la siguiente línea de código. en tu nuevo notebook de Colab:
    !pip install ydf -U
    
  3. Importa las siguientes bibliotecas:
    import ydf
    import numpy as np
    import pandas as pd
    

Conjunto de datos de Palmer Penguins

Este Colab usa Conjunto de datos de Palmer Penguins, que contiene las mediciones de tamaño de tres especie de pingüino:

  • Barbijo
  • Papúa
  • Adelie

Este es un problema de clasificación: el objetivo es predecir las especies de pingüino según los datos del conjunto de datos sobre los pingüinos de Palmer. Estos son los pingüinos:

Tres pingüinos diferentes
de especies conocidas.

Figura 16. Tres especies diferentes de pingüinos. Imagen de @allisonhorst

 

El siguiente código llama a Pandas para cargar el conjunto de datos de Palmer Penguins en la memoria:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

La siguiente tabla formatea los primeros 3 ejemplos de los pingüinos Palmer conjunto de datos:

Tabla 3. Los primeros 3 ejemplos en Palmer Penguins

especie island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sexo año
0 Adelie Torgersen 39,1 18.7 181,0 3,750 masculino 2007
1 Adelie Torgersen 39,5 17.4 186,0 3,800.0 female 2007
2 Adelie Torgersen 40,3 18.0 195,0 3,250 female 2007

El conjunto de datos completo contiene una combinación de valores numéricos (por ejemplo, bill_depth_mm) categórico (por ejemplo, island) y atributos faltantes. A diferencia de los modelos y los bosques de decisiones admiten todos estos tipos de funciones de forma nativa, no tiene que usar codificación one-hot, normalización ni un atributo is_present adicional.

La siguiente celda de código divide el conjunto de datos en un conjunto de entrenamiento y pruebas Configurar:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

Entrena árboles de decisión con hiperparámetros predeterminados

Puedes entrenar tu primer árbol de decisión con el modelo CART (clasificación y algoritmo de aprendizaje de árboles de regresión (también conocido como “estudiante”) sin especificar ningún hiperparámetros. Esto se debe a que el algoritmo de aprendizaje ydf.CartLearner proporciona un buen valor predeterminado los valores de hiperparámetros. Obtendrás más información sobre el funcionamiento de este tipo de modelo. más adelante en el curso.

model = ydf.CartLearner(label=label).train(train_dataset)

La llamada anterior no especificó columnas para usar como atributos de entrada. Por lo tanto, se usan todas las columnas del conjunto de entrenamiento. La llamada tampoco especificó la semántica (por ejemplo, numérica, categórica, de texto) de los atributos de entrada. Por lo tanto, la semántica de atributos se infiere automáticamente.

Llama a model.plot_tree() para mostrar el árbol de decisión resultante:

model.plot_tree()

En Colab, puedes usar el mouse para mostrar detalles sobre elementos específicos, como que la distribución de clases en cada nodo.

Un árbol de decisión entrenado con un
hiperparámetros.

Figura 17. Un árbol de decisión entrenado con hiperparámetros predeterminados.

Colab muestra que la condición raíz contiene 243 ejemplos. Sin embargo, es posible recuerda que el conjunto de datos de entrenamiento contenía 272 ejemplos. Las 29 restantes los ejemplos se reservaron automáticamente para la validación y la reducción del árbol.

La primera condición prueba el valor de bill_depth_mm. Las tablas 4 y 5 muestran las probabilidad de diferentes especies según el resultado de la primera condición.

Tabla 4. Probabilidad de diferentes especies si bill_depth_mm ≥ 42.3

Especie Probabilidad
Adelia (rojo) 8%
Papúa (azul) 58%
Barbijo (verde) 36%

 

Tabla 5. La probabilidad de diferentes especies si bill_depth_mm < 42.3

Especie Probabilidad
Adelia (rojo) 97%
Papúa (azul) 2%
Barbijo (verde) 0%

bill_depth_mm es un atributo numérico. Por lo tanto, se encontró el valor 42.3 usando la división exacta para la clasificación binaria con atributos.

Si bill_depth_mm ≥ 42.3 es verdadero, se debe realizar más pruebas para determinar si flipper_length_mm ≥ 207.5 puede separar casi perfectamente la Papúa y de Gentoos+Adelie.

El siguiente código proporciona el entrenamiento y la precisión de las pruebas del modelo:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

Es poco frecuente, pero posible, que la precisión de la prueba sea mayor que la del entrenamiento. exactitud. En ese caso, es posible que el conjunto de prueba difiera del conjunto de entrenamiento. Sin embargo, este no es el caso aquí, ya que los comandos la prueba se dividió de forma aleatoria. Una explicación más probable es que el conjunto de datos de prueba es muy pequeño (solo 72 ejemplos), por lo que la estimación de precisión es ruidosa.

En la práctica, para un conjunto de datos tan pequeño, usar validación cruzada sería preferible, ya que calcularía valores de métricas de evaluación más precisos. Sin embargo, en este ejemplo, continuamos con una capacitación prueba para poder simplicidad.

Mejora los hiperparámetros del modelo

El modelo es un árbol de decisión único que se entrenó con un hiperparámetro predeterminado de salida. Para obtener mejores predicciones, puedes hacer lo siguiente:

  1. Usa un modelo de aprendizaje más eficaz, como un bosque aleatorio o un árbol con boosting del gradiente un modelo de responsabilidad compartida. Esos algoritmos de aprendizaje se explicarán en la siguiente página.

  2. Optimizar el hiperparámetro con las observaciones y la intuición. El guía de mejora del modelo puede ser útil.

  3. Usa el ajuste de hiperparámetros. para probar automáticamente una gran cantidad de hiperparámetros posibles.

Como todavía no hemos visto el bosque aleatorio y los árboles con boosting del gradiente algoritmo y, como la cantidad de ejemplos es demasiado pequeña para hacer una ajuste de hiperparámetros, mejorarás el modelo de forma manual.

El árbol de decisión que se muestra arriba es pequeño y el ejemplo de la hoja con 61 contiene un mezcla de etiquetas Adelia y Barbijo. ¿Por qué el algoritmo no dividió esta hoja? un poco más lejos? Existen dos motivos posibles:

  • La cantidad mínima de muestras por hoja (min_examples=5 de forma predeterminada) puede tener que los usuarios alcanzaron sus objetivos.
  • El árbol podría haberse dividido y, luego, podado para evitar el sobreajuste.

Reduce la cantidad mínima de ejemplos a 1 y observa los resultados:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

Un árbol de decisiones entrenado con
min_examples=1.

Figura 18. Árbol de decisiones entrenado con min_examples=1.

 

El nodo hoja que contiene 61 ejemplos se dividió aún más veces.

Para ver si dividir más el nodo es valioso, evaluamos la calidad de este nuevo modelo en el conjunto de datos de prueba:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

La calidad del modelo aumentó con una exactitud de la prueba que va de 0.9167 a 0.97222 Este cambio de hiperparámetro era una buena idea.

Anterior de una decisión de bosques

Si seguimos mejorando los hiperparámetros, es probable que podamos alcanzar un punto exactitud. Sin embargo, en lugar de este proceso manual, podemos entrenar un modelo como un bosque aleatorio y ver si funciona mejor.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

La precisión del bosque aleatorio es mejor que la de nuestro árbol simple. Lo que harás aprenderás por qué en las siguientes páginas.

Uso y limitación

Como se mencionó anteriormente, un solo árbol de decisiones suele tener una calidad más baja que la de los modelos modernos métodos de aprendizaje automático como bosques aleatorios, árboles con boosting del gradiente y redes. Sin embargo, los árboles de decisión siguen siendo útiles en los siguientes casos:

  • Como un modelo de referencia simple y económico para evaluar enfoques más complejos.
  • Cuando hay un equilibrio entre la calidad del modelo y la interpretabilidad.
  • Como sustituto para la interpretación del modelo de bosques de decisión, que que exploraremos más adelante.