Regresión de árboles de decisión desde cero: teoría y práctica

Actualización definitiva: 03/14/2026
  • Los modelos de árboles de decisión realizan predicciones mediante divisiones recursivas elegidas para minimizar la impureza, utilizando medidas como el coeficiente de Gini, la entropía o la varianza.
  • La ganancia de información guía la elección de características y umbrales en cada nodo, lo que permite que los árboles manejen tanto la regresión como la clasificación.
  • Los hiperparámetros como max_depth, min_samples_split y min_information_gain controlan el sobreajuste y la complejidad del árbol.
  • Comprender la mecánica de los árboles individuales es esencial antes de pasar a conjuntos como los bosques aleatorios, que estabilizan y mejoran el rendimiento.

Regresión de árbol de decisión desde cero

La regresión mediante árboles de decisión desde cero es uno de los ejercicios más reveladores que puedes realizar si quieres comprender realmente cómo piensan los modelos basados ​​en árboles y por qué son tan populares en el aprendizaje automático. En lugar de tratar el árbol como una misteriosa caja negra, verá cómo se elige cada división, cómo se mide la impureza y cómo se generan predicciones numéricas en las hojas, tanto para problemas de regresión como de clasificación.

En esta guía, repasaremos las ideas principales detrás de los árboles de decisión, las funciones de costo que utilizan, cómo buscan las mejores divisiones y cómo programar un árbol básico que admita tanto regresión como clasificación, utilizando solo conceptos fundamentales como bucles, condiciones y estadísticas simples. En el camino, compararemos los árboles de regresión con los árboles de clasificación, conectaremos la teoría con implementaciones prácticas en herramientas como Python y R (por ejemplo, con rpart y tree), y situaremos brevemente los árboles de decisión dentro de conjuntos más grandes como los bosques aleatorios.

¿Qué es un árbol de decisiones y por qué resulta tan intuitivo?

Un árbol de decisiones es esencialmente un flujo de preguntas de sí/no (o reglas simples) que te guía desde una decisión raíz hasta una predicción final en un nodo hoja. En un entorno típico de aprendizaje supervisado, el objetivo es predecir una variable objetivo. Y Utilizando múltiples predictores (características, covariables), el árbol aprende una secuencia de preguntas como "¿el peso es ≤ 103?" o "¿el país está en {EE. UU., Reino Unido, Canadá}?" que divide gradualmente los datos en grupos más homogéneos.

Para comprender mejor este concepto, imagina que quieres predecir si una persona es obesa utilizando únicamente su altura y peso, y que dispones de un conjunto de datos etiquetados que te indica quién es obeso y quién no. Un árbol de decisión podría descubrir una regla como "si el peso es mayor a 100 kg, predice obesidad", pero esa regla no será perfecta: algunas personas que pesen más de 100 kg no serán obesas, y otras que pesen menos sí lo serán. El árbol continúa añadiendo más preguntas (subdivisiones), por ejemplo, sobre la altura o un umbral de peso más preciso, para "afinar" esas predicciones iniciales.

Cada nodo interno del árbol corresponde a una regla de decisión, cada rama corresponde a un resultado de esa regla y cada nodo hoja corresponde a una región del espacio de características donde las predicciones son constantes. En la clasificación, una hoja devuelve una etiqueta de clase (o una distribución de probabilidad sobre las etiquetas); en la regresión, una hoja normalmente devuelve la media de los valores objetivo que caen en esa región.

Una de las principales ventajas de los árboles de decisión es que manejan tanto la regresión como la clasificación de forma natural, son fáciles de interpretar y funcionan con predictores tanto cuantitativos como cualitativos (categóricos) sin necesidad de un preprocesamiento complejo. No es necesario asumir ninguna distribución específica para las características o la variable objetivo, lo que hace que los árboles sean muy atractivos en escenarios del mundo real donde a menudo se incumplen las suposiciones lineales clásicas.

Árboles de clasificación frente a árboles de regresión

Aunque la estructura de los árboles de clasificación y regresión es la misma, la naturaleza de la variable de respuesta Y y la función de coste utilizada para la división difieren entre estos dos tipos. Cuando Y es cuantitativa (por ejemplo, ventas, esperanza de vida, consumo de combustible), hablamos de un árbol de regresión; cuando Y es cualitativa o categórica (por ejemplo, supervivientes frente a no supervivientes, obesos frente a no obesos), hablamos de un árbol de clasificación.

En un árbol de regresión, el objetivo habitual es dividir el espacio de características en regiones donde la respuesta pueda aproximarse mediante una constante, a menudo la media de las observaciones en esa región. Las reglas de decisión típicas tienen la forma “es xk ≤ c?”, donde xk es una de las covariables y c es un umbral; estas reglas dividen repetidamente el espacio en hiperrectángulos, y todos los puntos en el mismo hiperrectángulo comparten el mismo valor predicho ŷ.

En un árbol de clasificación, las divisiones siguen siendo "¿característica ≤ umbral?" o "¿categoría en el conjunto S?", pero la calidad de una división se mide por la pureza de los nodos hijos resultantes en términos de etiquetas de clase. La predicción de la hoja suele ser la clase mayoritaria dentro de ese nodo, y el modelo intenta crear hojas que estén lo más cerca posible de contener una sola clase.

A pesar de estas diferencias en el tipo de objetivo, desde una perspectiva de codificación, se puede implementar una única estructura de árbol genérica y simplemente insertar diferentes medidas de impureza o pérdida dependiendo de si se está realizando una regresión o una clasificación. Más adelante, cuando calculemos la ganancia de información, verás que las fórmulas para la clasificación (basada en la entropía) y la regresión (basada en la varianza) son similares en esencia.

Funciones de impureza y coste en árboles de decisión

En el núcleo de cualquier algoritmo de árbol de decisión se encuentra una función de coste que evalúa la eficacia de una división concreta para separar los datos en grupos significativos. Esta función de coste se expresa en términos de impureza: un nodo se considera puro si todas sus muestras pertenecen a la misma clase (para clasificación) o tienen prácticamente el mismo valor numérico (para regresión).

Cada vez que seleccionas una división candidata en una característica, el algoritmo examina los nodos hijos que produce y pregunta: "¿cuán mezcladas están las etiquetas (o valores) en cada hijo?". Una buena división es aquella que produce nodos hijos mucho menos impuros que el padre, lo que significa que los datos dentro de cada hijo son más homogéneos con respecto al objetivo.

En los árboles de clasificación, la impureza se suele medir mediante criterios como el índice de Gini o la entropía, que reflejan la probabilidad de que una observación elegida al azar en ese nodo se clasifique erróneamente si simplemente predijéramos la clase mayoritaria. En los árboles de regresión, la impureza se suele medir con el error cuadrático o la varianza, lo que refleja la dispersión de los valores objetivo dentro del nodo.

Índice de Gini: medición de impurezas en árboles de clasificación

El índice de Gini es una de las medidas de impureza más utilizadas en los árboles de clasificación porque es sencillo de calcular y funciona bien en la práctica. Conceptualmente, mide la probabilidad de que una observación seleccionada al azar del nodo se clasifique incorrectamente si su etiqueta se predice de acuerdo con la distribución de etiquetas en ese nodo.

Si un nodo contiene clases con probabilidades P1, P2, … , PAGn, el índice de Gini se calcula como Gini = 1 − Σ (Pi)². Cuando un nodo es perfectamente puro (todas las observaciones pertenecen a la misma clase), una de las probabilidades es 1 y el resto son 0, por lo que la suma de los cuadrados es 1 y el índice de Gini es 0, lo que indica una pureza total.

Por otro lado, el índice de Gini alcanza su máximo cuando las clases se mezclan uniformemente dentro del nodo, por ejemplo en un problema binario con P1 = P2 = 0.5, lo que da Gini = 1 − (0.5² + 0.5²) = 0.5. En esa situación, predecir la clase mayoritaria es lo peor que se puede obtener para esa distribución, porque el nodo contiene la mitad de cada clase.

Cuando implementas Gini en código, normalmente tomas el vector de etiquetas para el nodo, calculas la frecuencia de cada clase, conviertes las frecuencias en probabilidades y luego aplicas la fórmula 1 − Σ p². Si realizas este procedimiento para varias particiones candidatas, podrás comparar qué partición produce hijos con una impureza de Gini promedio ponderada menor, que es precisamente lo que el árbol necesita para decidir la mejor partición.

Entropía: otra perspectiva sobre la impureza en la clasificación

La entropía es una medida de impureza alternativa ampliamente utilizada en la teoría de la información y en algoritmos de árboles antiguos como ID3 y C4.5, y captura la cantidad de aleatoriedad o incertidumbre en la distribución de clases del nodo. Mientras que el coeficiente de Gini se centra en la probabilidad de clasificación errónea, la entropía cuantifica la "sorpresa" asociada a la observación de una clase particular cuando la distribución es mixta.

Dadas las probabilidades de clase p1, … , pagc Para un nodo S, su entropía se define como E(S) = − Σ pi log₂(pi). Si el nodo es puro, una de las probabilidades es 1 y todas las demás son 0, lo que hace que la suma sea cero (porque log₂(1) = 0), por lo que la entropía es 0, lo que indica que no hay incertidumbre.

Cuando el nodo contiene una distribución uniforme de clases, la entropía se maximiza; para un problema binario con p1 = pag2 = 0.5, la entropía es de 1 bit, que es el valor más alto posible para dos clases. Este valor corresponde a la máxima incertidumbre, lo que significa que el nodo es tan impuro como puede serlo bajo esa distribución.

Aunque el coeficiente de Gini y la entropía utilizan fórmulas diferentes y tienen rangos numéricos distintos (el de Gini entre 0 y 0.5 para dos clases, y el de entropía entre 0 y 1), ambos miden esencialmente el mismo concepto, por lo que en la práctica suelen dar lugar a árboles muy similares. Cuando se realizan ambos cálculos en el mismo nodo, se observa que un coeficiente de Gini alto corresponde a una entropía alta y viceversa, razón por la cual muchas bibliotecas permiten elegir cualquiera de las dos sin que el rendimiento se vea afectado drásticamente.

Obtención de información y elección de las mejores divisiones

Para elegir la mejor división entre muchos candidatos, el algoritmo de árbol utiliza una métrica llamada Ganancia de Información, que mide cuánta impureza disminuye cuando dividimos un nodo en sus hijos. Intuitivamente, una división tiene una alta ganancia de información si los hijos son mucho más puros que el padre, lo que significa que la regla separó con éxito los datos en grupos más significativos.

Para los árboles de clasificación que utilizan entropía, la ganancia de información de una división se define como IG.Clasificación = E(padre) − Σ (|Ssus hijos| / |S con el futuro bebé|) · E(Ssus hijos). Primero se calcula la entropía del nodo padre y luego se resta la entropía promedio ponderada de los nodos hijos, donde los pesos son sus tamaños relativos.

Para los árboles de regresión, un concepto análogo utiliza la varianza o el error cuadrático medio como medida de impureza, lo que da como resultado IG.regresión = Var(padre) − Σ (|Ssus hijos| / |S con el futuro bebé|) · Var(Ssus hijos). En este contexto, una buena división es aquella que reduce sustancialmente la variabilidad de los valores objetivo dentro de cada hijo.

El algoritmo de entrenamiento del árbol evalúa esta ganancia de información para cada posible división candidata en cada característica, y luego elige la división con la mayor ganancia, siempre que supere un umbral mínimo para evitar crear mejoras pequeñas e inútiles. Este proceso se repite recursivamente en cada nodo hijo hasta que se alcanzan ciertos criterios de parada.

Cómo buscar la mejor división en cada característica

Encontrar la mejor división en función de una sola característica depende de si la característica es numérica o categórica, pero la idea subyacente siempre es la misma: enumerar las particiones candidatas y calcular su ganancia de información. Para las características numéricas, una partición se define mediante un umbral; para las características categóricas, se define agrupando los niveles en subconjuntos.

Para un predictor numérico, la estrategia habitual consiste en examinar todos los valores únicos que toma esa característica en el nodo actual, ordenarlos y, a continuación, considerar posibles umbrales entre valores consecutivos. Para cada umbral candidato c, se crean dos grupos (x ≤ c y x > c), se calcula la impureza de cada grupo y, a continuación, se calcula la ganancia de información; el umbral que produce la mayor ganancia es la mejor división numérica de esa característica.

Cuando se trabaja con predictores categóricos, el espacio de búsqueda es más complejo porque, en principio, cualquier subconjunto de categorías podría formar un lado de la división, con el complemento en el otro lado. En una característica con K categorías, hay muchos subconjuntos posibles (2K−1 − 1 particiones no triviales), por lo que en la práctica las implementaciones a menudo restringen esta búsqueda o utilizan heurísticas, especialmente cuando K es grande.

Una vez que hayas calculado la mejor división para cada característica, comparas sus ganancias de información y seleccionas la característica y el umbral (o subconjunto de categoría) que correspondan a la ganancia máxima. Esta división elegida se convierte en la decisión en el nodo actual, y el proceso de entrenamiento se repite en cada hijo con el subconjunto de observaciones correspondiente.

Controlar el crecimiento de los árboles con hiperparámetros

Si permites que un árbol de decisión crezca sin ninguna restricción, seguirá dividiéndose hasta que cada hoja sea perfectamente pura o contenga muy pocas observaciones, lo que casi siempre conduce a un sobreajuste severo (sobreajuste vs. infraajuste). Para evitar esto, se establece un conjunto de hiperparámetros que controlan la profundidad y la complejidad del árbol.

Un hiperparámetro común es max_depth, que limita el número máximo de niveles que el árbol puede crecer desde la raíz hasta cualquier hoja. Si max_depth se establece en None (o en un número muy grande), el árbol puede seguir creciendo siempre que se cumplan las demás restricciones; si es pequeño, el árbol permanece poco profundo y más interpretable, pero podría no ajustarse correctamente.

Otro hiperparámetro clave es min_samples_split, que especifica el número mínimo de observaciones que debe contener un nodo antes de que se permita su división. Si un nodo tiene menos muestras que este umbral, se convierte en una hoja, lo que impide que el modelo intente detectar ruido en subconjuntos de datos muy pequeños.

También puede imponer una ganancia de información mínima (min_information_gain) para que el algoritmo solo realice una división si produce una mejora significativa en la reducción de impurezas. Esto evita crear ramas innecesarias que apenas modifican las predicciones y que simplemente complican la estructura del árbol.

Construyendo un árbol de decisiones desde cero en código.

La implementación de un árbol de decisión desde cero generalmente gira en torno a un pequeño conjunto de funciones básicas que se llaman de forma recursiva. Si bien bibliotecas como scikit-learn o rpart hacen todo esto internamente, codificar estos pasos uno mismo hace que la lógica sea mucho más clara (lógica de programación) y te da control total sobre el comportamiento.

En primer lugar, necesitas una rutina que, dados los datos actuales en un nodo, evalúe cada característica y cada división candidata para encontrar la que tenga la mayor ganancia de información. Esta función devuelve la característica elegida, la regla de división (umbral o subconjunto de categorías), el valor de ganancia y la máscara booleana o los conjuntos de índices que identifican qué muestras van a la izquierda y cuáles a la derecha.

En segundo lugar, necesitas una función de predicción para los nodos hoja que convierta el conjunto de valores objetivo en ese nodo en una única predicción. En el caso de la regresión, normalmente se utiliza la media de y en ese nodo; en el caso de la clasificación, se suele tomar la moda (la clase más frecuente), y posiblemente también se almacenen las probabilidades de clase si se desean resultados probabilísticos.

En tercer lugar, se crea una función de entrenamiento recursiva que comprueba los criterios de parada, busca la mejor división si está permitida y, a continuación, construye nodos secundarios llamándose a sí misma en los subconjuntos izquierdo y derecho. Si no se cumplen las condiciones de tamaño mínimo de muestra, profundidad máxima o ganancia mínima, la función deja de dividir y almacena una predicción de hoja en lugar de ramas adicionales.

Cómo funciona la predicción en un árbol de decisión entrenado

Una vez que hayas entrenado tu árbol y hayas almacenado todas las reglas de división y las predicciones de las hojas, hacer una predicción para una nueva observación es simplemente cuestión de recorrer el árbol desde la raíz hasta una hoja. En cada nodo interno, se inspecciona la característica requerida y se comprueba si la observación cumple la condición del nodo.

Si la regla de división es numérica, se comprueba si el valor de la característica es menor o igual al umbral; si la regla de división es categórica, se comprueba si la categoría pertenece a un subconjunto determinado. Según el resultado, se sigue la rama correspondiente (por ejemplo, "sí" a la izquierda, "no" a la derecha) y se repite este proceso en el siguiente nodo.

Se continúa descendiendo por el árbol hasta llegar a un nodo sin hijos, que es una hoja que almacena un valor de salida constante o una etiqueta de clase. En un árbol de regresión, la predicción será un número, como una esperanza de vida estimada o una eficiencia de combustible; en un árbol de clasificación, la salida será una categoría predicha, como "sobrevivió" o "no sobrevivió".

Si pruebas este enfoque con los mismos datos que usaste para el entrenamiento, a menudo verás una precisión de clasificación bastante alta (por ejemplo, alrededor del 85 % en algunos ejemplos sencillos de obesidad o al estilo del Titanic), pero ese rendimiento podría disminuir con datos no vistos si tu árbol es demasiado profundo. Precisamente por eso es tan importante controlar la profundidad y el tamaño de los árboles, y por eso se inventaron conjuntos de modelos como los bosques aleatorios para estabilizar las predicciones de los árboles.

Trabajar con árboles de regresión en la práctica

Los árboles de regresión resultan especialmente útiles cuando la relación entre las variables predictoras y la variable de respuesta es fuertemente no lineal e implica interacciones difíciles de modelar con la regresión lineal clásica. En lugar de intentar ajustar una única ecuación global, el árbol divide el espacio de características en regiones y ajusta un modelo constante simple dentro de cada región.

En R, paquetes populares como rpart y tree facilitan la construcción de árboles de regresión con una sola llamada a una función, especificando una fórmula como y ~ x1 + x2 + … + x11. Estos paquetes se inspiraron en la metodología CART original descrita por Breiman y sus colegas, e implementan muchas de las ideas de división y poda que son estándar en el modelado moderno basado en árboles.

Por ejemplo, puede usar el paquete rpart para modelar una respuesta y basada en once covariables x1 a x11, limpiar los datos de valores faltantes y luego visualizar el árbol resultante con funciones auxiliares como prp del paquete rpart.plot. Los nodos terminales muestran el valor predicho de y para cada región, que puede utilizar directamente para nuevas observaciones.

Dado un árbol de regresión entrenado, puede introducir nuevos valores de covariables, como x9 = 70, x2 = 100 o x9 = 60, x2 = 150, en la función de predicción para obtener valores estimados ŷ (por ejemplo, alrededor de 20 o 28 en un ejemplo de consumo de combustible). Comparar estas predicciones con los valores observados, por ejemplo mediante la correlación entre y y ŷ, permite hacerse una idea rápida de lo bien que el árbol capta el patrón subyacente, incluso cuando el conjunto de datos es bastante pequeño.

Desde árboles individuales hasta bosques aleatorios

Un único árbol de decisión es potente pero también notoriamente sensible a las particularidades de los datos de entrenamiento, lo que puede conducir a una alta varianza (sesgo y varianza) y sobreajuste. Para mitigar esto, los bosques aleatorios construyen muchos árboles a partir de muestras de datos obtenidas mediante remuestreo (bootstrap) y agregan sus predicciones, lo que produce un modelo más estable y, por lo general, más preciso.

En un bosque aleatorio, cada árbol se entrena con una muestra bootstrap, lo que significa que se extrae un nuevo conjunto de datos del mismo tamaño del conjunto de entrenamiento original con reemplazo. Este proceso de muestreo hace que cada árbol vea un conjunto de datos ligeramente diferente, por lo que sus errores están menos correlacionados y pueden cancelarse al agregarse.

Además, los bosques aleatorios introducen aleatoriedad en el proceso de selección de características al considerar solo un subconjunto aleatorio de predictores en cada división, en lugar de todos los predictores. Esto reduce aún más la correlación entre los árboles, aumenta la diversidad en el bosque y tiende a reducir la varianza sin aumentar demasiado el sesgo.

La combinación de remuestreo (bootstrapping) y agregación de predicciones se conoce como bagging, y en los bosques aleatorios también se obtiene una estimación interna del error del modelo al evaluar cada árbol con los puntos de datos que no se incluyeron en su muestra de remuestreo (las llamadas observaciones fuera de la bolsa). Este error fuera de la muestra proporciona una forma práctica de evaluar el rendimiento sin necesidad de un conjunto de validación independiente.

Aunque este artículo se centra en la construcción de un único árbol desde cero, comprender cómo funciona ese componente básico facilita mucho la comprensión de cómo los conjuntos de métodos, como los bosques aleatorios, el aumento de gradiente y otros métodos basados ​​en árboles, se basan en los mismos principios para lograr resultados de vanguardia en muchos problemas aplicados.

En resumen, la regresión mediante árboles de decisión desde cero muestra cómo un conjunto simple de reglas, funciones de costo y divisiones recursivas pueden modelar relaciones complejas, ya sea que se prediga un resultado binario como la supervivencia, una etiqueta categórica como el estado de obesidad o un objetivo numérico como la esperanza de vida o el consumo de combustible. Esta comprensión profunda se convierte en una base sólida para utilizar técnicas más avanzadas basadas en árboles en la práctica.

sobreajuste vs. infraajuste
Artículo relacionado:
Overfitting vs Underfitting: guía completa con señales, causas y soluciones
Artículos Relacionados: