19 · Clasificación con árboles de decisión: entropía, Gini e información ganada
Construye un árbol que hace preguntas binarias sobre las características de forma recursiva — cada split elegido para maximizar cuánto más puros quedan los subconjuntos.
Un árbol de decisión divide el espacio de características recursivamente a lo largo de umbrales de una sola característica — en cada split elige la pregunta que más purifica los subconjuntos resultantes.
Sin esto:
Sin los árboles de decisión pierdes el bloque fundamental de los random forests, el gradient boosting y XGBoost — la familia de algoritmos de ML clásico más exitosa.
Un árbol de decisión responde una pregunta de clasificación haciendo una secuencia de preguntas sí/no sobre características individuales. Cada nodo interno plantea un test de umbral — "¿es petal_length ≤ 2.45?" — y enruta los ejemplos a izquierda o derecha según la respuesta. Los nodos hoja predicen una clase.
División recursiva codiciosa
El árbol crece codiciosamente: en cada nodo, prueba cada par (característica, umbral) y elige el que reduce más la impureza. Después del split, recursa en cada hijo. Se detiene cuando los nodos son puros o se cumple un criterio de parada (max_depth, min_samples_split, etc.).
Medidas de impureza
Dos criterios dominantes para medir cuán "mezclado" está un nodo:
Impureza Gini (default de sklearn):
Gini(t) = 1 − Σ pₖ²
donde pₖ es la fracción de la clase k en el nodo t. Un nodo puro tiene Gini = 0. Una división binaria 50/50 tiene Gini = 0.5.
Entropía (teoría de la información):
H(t) = −Σ pₖ log₂ pₖ
Misma intuición: 0 para un nodo puro, 1 para una división binaria 50/50.
Ganancia de información
La ganancia de una división es la reducción en impureza del nodo padre a los hijos ponderados:
IG = Impureza(padre) − [|izq|/|padre| · Impureza(izq) + |der|/|padre| · Impureza(der)]
El algoritmo elige el par (característica, umbral) que maximiza IG.
Características categóricas vs numéricas
Para características numéricas sklearn escanea todos los puntos medios entre valores consecutivos ordenados como umbrales candidatos. Para características categóricas con k categorías, sklearn las codifica internamente en one-hot.
API de sklearn
DecisionTreeClassifier(criterion='gini') es el default. Hiperparámetros clave: max_depth, min_samples_split, min_samples_leaf, max_leaf_nodes.
Python (in browser)
`plot_tree` renderiza el árbol aprendido completo. Cada nodo muestra la condición de split (característica ≤ umbral), impureza gini, conteo de muestras, distribución por clase y la clase mayoritaria. El split raíz sobre petal_length (≤ 2.45) aísla perfectamente todos los ejemplos de setosa en una hoja.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Gini y entropía son intercambiables en la práctica — producen estructuras de árbol casi idénticas en datasets reales. Ambas alcanzan su máximo en la incertidumbre máxima (p=0.5 para binaria) y llegan a 0 para un nodo puro. La ganancia de información (IG) mide cuánto reduce un split la impureza del padre; el árbol elige el split que maximiza IG en cada nodo.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
La propiedad más llamativa de los árboles de decisión: la frontera de decisión siempre está alineada con los ejes — un mosaico de rectángulos. Cada rectángulo corresponde a una hoja del árbol. La forma escalonada es consecuencia directa de dividir sobre una sola característica a la vez. Contrasta con un kernel RBF de SVM (curvas elípticas suaves) o la regresión logística (una sola línea diagonal).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`model.feature_importances_` da a cada característica una puntuación en [0, 1] que suma 1. La puntuación equivale a la reducción total ponderada de Gini de todos los splits que usaron esa característica. Para Iris, las dimensiones del pétalo dominan porque el split raíz y los splits del segundo nivel usan petal_length o petal_width.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Gini es el default por una razón: evita una evaluación de logaritmo en cada split, lo que se acumula en los miles de splits candidatos evaluados durante el crecimiento del árbol. En datasets grandes o árboles profundos esto importa. Vale la pena probar entropía si quieres valores de ganancia de información interpretables.
Si un nodo tiene 10 ejemplos de clase A y 0 de clase B, ¿cuál es su impureza Gini?
- Un árbol de decisión elige codiciosamente el split (característica, umbral) que maximiza la ganancia de información (reducción de Gini o entropía) en cada nodo. Recursa hasta que las hojas sean puras o se cumpla un criterio de parada.
- Gini = 1 − Σ pₖ²; entropía = −Σ pₖ log₂ pₖ. Ambas son 0 para un nodo puro y alcanzan el máximo en el desorden máximo. En la práctica producen árboles casi idénticos; Gini es el default de sklearn.
- Las fronteras de decisión son siempre rectángulos alineados con los ejes — un split de característica a la vez. Los separadores diagonales requieren muchos splits para aproximarse.
- No se requiere escalado de características — los árboles dividen sobre valores brutos, por lo que las unidades y escalas mixtas se manejan de forma nativa.
- Un árbol sin restricciones sobreajustará perfectamente los datos de entrenamiento. Siempre establece max_depth (u otro hiperparámetro de parada) para generalizar.
`DecisionTreeClassifier` de sklearn rara vez se usa solo en producción, pero es la unidad atómica de los random forests, el gradient boosting y XGBoost — por lejos los algoritmos de ML tabular más desplegados.
Si lo quitas: Perderías el bloque fundamental de los métodos ensemble — que dominan las competiciones de ML tabular.