ML Atlas

Machine learning desde cero · Lección 5.1 · 26 de 33 lecciones listas · 10 min

Árboles de decisión: veinte preguntas con datos

En pocas palabras

Un árbol de decisión clasifica con preguntas de sí o no que separan los datos lo más limpiamente posible. El ejemplo: quién sobrevivió al Titanic.

Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
De la lección 4.6: Pipeline: de la tabla a la predicción ¿Por qué ajustas el escalador solo con la parte de entrenamiento?

Ver la respuesta

Respuesta correcta: Porque el escalador es parte del modelo y la prueba debe imitar datos que el modelo no vio

La prueba imita pingüinos nuevos. La media y la dispersión también son algo que el modelo aprende, así que se calculan solo con el entrenamiento.

De la lección 4.5: Fuga de datos Rellenas los faltantes con la media de todo el archivo, divides en entrenamiento y test, entrenas con el entrenamiento y evalúas en el test. ¿Qué paso tiene fuga?

Ver la respuesta

Respuesta correcta: Rellenar los huecos con la media calculada con todo el archivo

La media incluye los datos de test, así que el test influye en el entrenamiento. Ajusta la imputación solo con el entrenamiento, mejor dentro de un pipeline.

¿Recuerdas el juego de las veinte preguntas? «¿Está vivo?», «¿Es más grande que un gato?». Un buen jugador no hace preguntas al azar; hace la que divide las posibilidades restantes más o menos por la mitad. Un árbol de decisión es un modelo que juega a esto con datos y, como sus preguntas están escritas en lenguaje llano, es uno de los pocos modelos que se pueden leer como un diagrama de flujo. Pruébalo tú mismo antes de leer la explicación.

Predice y comprueba Un árbol de profundidad 20 acierta más del 98 % de los pasajeros de entrenamiento, y uno de profundidad 1 (una sola pregunta) alrededor del 79 %. ¿Cuál acierta más con los pasajeros de prueba?
¿Qué tan seguro estás?

Experimento interactivo

Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.

Ver la respuesta

Respuesta correcta: El poco profundo (profundidad 1)

La profundidad 20 tiene un 98,7 % en entrenamiento, pero un 73,9 % en prueba. La profundidad 1 tiene un 79,3 % en entrenamiento y un 77,2 % en prueba. El árbol profundo memorizó a los pasajeros (114 de sus 145 hojas abarcan a 5 personas como mucho) en vez de aprender una regla; el mejor resultado de prueba, 79,5 %, lo da la profundidad 3.

Prueba esto

  • Pon el control de profundidad máxima en 1. El árbol solo puede hacer una pregunta. Léela en la lista de divisiones: ¿qué característica consideró más informativa el algoritmo?
  • Sube la profundidad máxima de uno en uno. Observa cómo sube la exactitud de entrenamiento y compárala con la de prueba en cada profundidad.
  • Lleva la profundidad máxima al tope. ¿La exactitud de entrenamiento se acerca a la perfección? ¿Qué le pasó a la exactitud de prueba?
  • Encuentra la profundidad con la mejor exactitud de prueba y lee las divisiones principales. ¿Podrías explicarle este árbol a alguien en dos frases?

La idea en pocas palabras

Un árbol de decisión predice haciendo una secuencia de preguntas de sí o no sobre las características: «¿La edad del pasajero es menor que cierto valor?», «¿Viajaba en primera clase?». Cada respuesta envía el ejemplo por una rama, y la siguiente pregunta depende de las respuestas anteriores. Al final de cada camino hay una hoja con una predicción, normalmente la etiqueta más común entre los ejemplos de entrenamiento que acabaron allí.

En esta lección usamos datos de 891 pasajeros del Titanic, de los que sobrevivieron 342. Las características incluyen la clase en que viajaban, el sexo, la edad, el número de familiares a bordo y la tarifa pagada. El árbol aprende qué preguntas sobre estas características separan mejor a quienes sobrevivieron de quienes no.

Piensa en una enfermera de triaje en urgencias. No calcula una suma ponderada; sigue una cadena corta de preguntas —¿respira?, ¿sangra?, ¿está consciente?—, cada una de las cuales acota qué hacer. Un árbol es esa cadena, aprendida de los datos en lugar de escrita por médicos.

Por qué funciona

El árbol se construye desde arriba, pregunta a pregunta. En cada paso, el algoritmo prueba cada característica y cada valor de corte posible y se pregunta: ¿qué pregunta divide este grupo en dos grupos lo más puros posible, es decir, que cada uno contenga sobre todo una etiqueta? Una medida popular de impureza es el índice de Gini de un grupo:

Gini = 1 − Σ pₖ²

donde pₖ es la proporción de la etiqueta k en el grupo. Un grupo en el que todos tienen la misma etiqueta tiene Gini 0; un grupo repartido mitad y mitad entre dos etiquetas tiene Gini 0,5, el peor valor posible con dos clases. El algoritmo elige la pregunta que más reduce la impureza media y luego repite el procedimiento por separado dentro de cada rama. Esta búsqueda voraz, paso a paso, no garantiza el mejor árbol posible, pero es rápida y funciona bien en la práctica.

Si lo dejas solo, el árbol sigue dividiendo hasta que cada hoja es pura, aunque una hoja contenga un solo pasajero. En ese punto ha memorizado los datos de entrenamiento, ruido incluido: el sobreajuste de la lección 7 con otro disfraz. El control principal es la profundidad máxima, el número de preguntas permitidas a lo largo de cualquier camino. Un árbol poco profundo es fácil de leer, pero puede pasar por alto patrones reales; uno profundo se ajusta casi a la perfección a los datos de entrenamiento y generaliza peor. La validación cruzada de la lección 8 es la forma honesta de elegir la profundidad.

Error frecuente

Una división no es una explicación causal. El árbol pregunta por la característica que mejor separa las etiquetas en estos datos, y esa puede ser un sustituto de otra cosa: la clase y la tarifa van juntas, y ambas dicen algo sobre en qué parte del barco dormía el pasajero. El segundo error es fiarse de un árbol profundo porque sus reglas parecen muy precisas. Una regla como «edad entre 31,5 y 32,5 y tarifa por encima de cierto valor» suele ser el árbol describiendo a uno o dos pasajeros, no un patrón. Pequeños cambios en los datos también pueden cambiar la primera división y, con ella, todo el árbol, lo que hace inestables a los árboles individuales.

Esa inestabilidad es una debilidad, pero puede convertirse en una fortaleza. En la próxima lección hacemos crecer muchos árboles distintos y los dejamos votar.

Test

Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.

1. ¿Cómo elige un árbol de decisión la pregunta en cada paso?
Ver la respuesta

Respuesta correcta: Prueba las preguntas posibles y se queda con la que deja los grupos más puros

La búsqueda voraz evalúa las divisiones candidatas y se queda con la que más reduce la impureza, por ejemplo el índice de Gini.

2. Un árbol sin límite de profundidad alcanza una exactitud de entrenamiento casi perfecta. ¿Por qué es una señal de alarma?
Ver la respuesta

Respuesta correcta: Porque probablemente memorizó pasajeros concretos y generalizará peor

Un árbol que divide hasta que cada hoja es pura se ajusta al ruido de la muestra de entrenamiento, la señal clásica del sobreajuste.

3. ¿Cuál es el índice de Gini de un grupo en el que sobrevivieron todos los pasajeros?
Ver la respuesta

Respuesta correcta: 0, porque el grupo es completamente puro

Si una etiqueta tiene proporción 1, la suma de las proporciones al cuadrado es 1 y Gini vale 1 − 1 = 0, un grupo perfectamente puro.

Ideas clave

  • Un árbol de decisión predice con una cadena de preguntas de sí o no que se lee como un diagrama de flujo.
  • Cada división se elige de forma voraz para dejar los grupos resultantes lo más puros posible, por ejemplo según el índice de Gini.
  • La profundidad máxima controla la complejidad: los árboles poco profundos subajustan y los profundos memorizan.
  • Una división muestra qué separa las etiquetas en los datos, no qué causa el resultado.

Más a fondo: fórmula, código, práctica

Las matemáticas

Para un grupo con proporciones de etiquetas pₖ, Gini = 1 − Σ pₖ². Con dos clases va de 0 (una sola etiqueta) a 0,5 (mitad y mitad). Toda la tabla del Titanic, 342 supervivientes de 891, tiene Gini = 1 − (342/891)² − (549/891)² ≈ 0.473.

Una división envía n_L filas a la izquierda y n_R a la derecha, n = n_L + n_R. Su calidad es la caída de la impureza: Δ = G(parent) − (n_L/n) · G(left) − (n_R/n) · G(right). El árbol toma la pregunta con la mayor Δ y luego repite dentro de cada rama. La entropía, −Σ pₖ log₂ pₖ, es una impureza alternativa que se comporta de forma parecida.

Un árbol de profundidad d tiene como máximo 2^d hojas. Una hoja predice la etiqueta mayoritaria de sus filas de entrenamiento, así que una hoja con un solo pasajero predice exactamente la etiqueta de ese pasajero.

En código (Python)

Los 891 pasajeros con seis variables (sexo como 0/1, edades faltantes rellenadas con la mediana del entrenamiento) y una partición de prueba estratificada del 30 %. Es el mismo tipo de experimento que el del lab, pero con otra partición, así que los números difieren un poco de los del lab. El notebook enlazado bajo el resultado descarga los datos por sí solo.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

df = pd.read_csv("data/raw/titanic.csv")
X = pd.DataFrame({"female": (df["sex"] == "female").astype(int)}).join(df[["pclass", "age", "sibsp", "parch", "fare"]])
Xtr, Xte, ytr, yte = train_test_split(X, df["survived"], test_size=0.3, stratify=df["survived"], random_state=1)
Xtr, Xte = Xtr.fillna({"age": Xtr["age"].median()}), Xte.fillna({"age": Xtr["age"].median()})  # mediana del entrenamiento para ambos
print(f"passengers {len(df)}, survived {df['survived'].sum()}")
for d in (1, 3, 20):
    t = DecisionTreeClassifier(max_depth=d, random_state=0).fit(Xtr, ytr)
    print(f"depth {d:2d}: train {t.score(Xtr, ytr):.3f}, test {t.score(Xte, yte):.3f}, leaves {t.get_n_leaves()}")

Resultado

passengers 891, survived 342
depth  1: train 0.780, test 0.802, leaves 2
depth  3: train 0.833, test 0.802, leaves 8
depth 20: train 0.986, test 0.780, leaves 141

Un árbol de profundidad 1 es una sola pregunta. El árbol de profundidad 20 es casi perfecto con los pasajeros de entrenamiento y peor que la pregunta única con los pasajeros de prueba.

Para profesionales
  • Limita el árbol: max_depth, min_samples_leaf o ccp_alpha (poda). Elige el valor por validación cruzada, no por la exactitud de entrenamiento.
  • No leas un árbol profundo como un conjunto de reglas. Una hoja con un puñado de pasajeros es memoria, no un patrón.
  • Los árboles no necesitan variables escaladas, pero sí números. Codifica las categorías (por ejemplo el sexo como 0/1) y decide qué hacer con los valores faltantes. Ajusta la imputación solo con el conjunto de entrenamiento.
  • Un solo árbol es inestable: un pequeño cambio en los datos puede cambiar la primera división. Si solo necesitas exactitud, un conjunto de árboles es una opción más segura.
  • Una división es una afirmación sobre estos datos, no sobre la causa. La clase del billete y la tarifa se sustituyen entre sí, así que el árbol puede elegir cualquiera de las dos.

Profundiza en el Atlas

Entradas de la enciclopedia sobre las ideas de esta lección: