Parámetros del árbol

Basic

Parámetros del Árbol de Decisión | Profundidad, hojas y poda

Creado: Última actualización: Tiempo de lectura: 2 min
まとめ
  • Los árboles de decisión ofrecen varios mandos—profundidad, muestras mínimas por división/hoja, poda y pesos de clase—que determinan directamente su capacidad e interpretabilidad.
  • max_depth y min_samples_leaf limitan el detalle de las reglas, mientras que ccp_alpha (poda por complejidad de costo) elimina ramas cuyo aporte no justifica su tamaño.
  • Escoger el criterio adecuado (squared_error, absolute_error, friedman_mse, etc.) cambia la sensibilidad del árbol frente a atípicos.
  • Las visualizaciones de fronteras de decisión y de la estructura del árbol facilitan explicar por qué una determinada combinación de hiperparámetros funciona.

1. Descripción general #

Sin restricciones, un árbol sigue dividiendo hasta dejar hojas totalmente puras, lo que suele implicar sobreajuste. Los hiperparámetros actúan como regularizadores: la profundidad impide que el árbol sea demasiado detallado, las muestras mínimas evitan hojas minúsculas y la poda colapsa ramas marginales.

2. Ganancia de impureza y poda por complejidad #

Para un nodo padre (P) que se divide en hijos (L) y (R), la reducción de impureza es

$$ \Delta I = I(P) - \frac{|L|}{|P|} I(L) - \frac{|R|}{|P|} I(R), $$

donde (I(\cdot)) puede ser Gini, entropía, MSE o MAE. Sólo mantenemos divisiones con (\Delta I > 0).

La poda por complejidad evalúa un árbol (T) mediante

$$ R_\alpha(T) = R(T) + \alpha |T|, $$

donde (R(T)) es la pérdida de entrenamiento, (|T|) el número de hojas y (\alpha \ge 0) penaliza estructuras grandes. Aumentar (\alpha) conduce a árboles más simples.

3. Experimentos en Python #

El siguiente código entrena varios DecisionTreeRegressor sobre un conjunto sintético y muestra cómo distintos parámetros afectan el (R^2) de entrenamiento y prueba.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.metrics import r2_score

X, y = make_regression(
    n_samples=500,
    n_features=2,
    noise=0.2,
    random_state=42,
)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)

def evaluate(params):
    model = DecisionTreeRegressor(random_state=0, **params).fit(Xtr, ytr)
    r2_train = r2_score(ytr, model.predict(Xtr))
    r2_test = r2_score(yte, model.predict(Xte))
    print(f"{params}: train R2={r2_train:.3f}, test R2={r2_test:.3f}")

evaluate({"max_depth": 3})
evaluate({"max_depth": 10})
evaluate({"max_depth": 5, "min_samples_leaf": 5})
evaluate({"max_depth": 5, "ccp_alpha": 0.01})

Las siguientes figuras muestran cómo cambia la superficie de predicción al modificar los parámetros clave:

Árbol limitado por profundidad (max_depth=3) Distribución de datos y ajuste base Superficie 3D del ajuste base Árbol profundo con max_depth=10 Regularización con min_samples_leaf=20 Árbol podado con ccp_alpha=0.4 Restricción max_leaf_nodes=5 Criterio absolute_error ante atípicos Criterio squared_error ante atípicos

4. Referencias #

  • Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and Regression Trees. Wadsworth.
  • Breiman, L., & Friedman, J. H. (1991). Cost-Complexity Pruning. En Classification and Regression Trees. Chapman & Hall.
  • scikit-learn developers. (2024). Decision Trees. https://scikit-learn.org/stable/modules/tree.html