"Generalized random forests": una introducción

Los generalized random forests (GRF en lo sucesivo) han cobrado cierta relevancia recientemente porque una de sus potenciales variantes son los llamados causal forests: RRFF adaptados para medir el tamaño de una intervención causal.

Lo que voy a contar aquí es un resumen de lo que aprendí echándole un vistazo al artículo relevante de la cosa.

[Nota: voy a simplificar un poco con respecto a lo que aparecen en el artículo por aligerar la introducción; recuérdese: este es un mapa del territorio y el territorio en sí mismo.]

Cuesta entender el artículo hasta que uno se percata de que los GRF no son RRFF. Es más fructífero entenderlos como modelos locales donde los pesos, en lugar de utilizar kernels tradicionales —que al final, están basados en algún tipo de distancia— utilizan un criterio distinto (y al que volveremos).

En un GRF, a cada punto $x_i$ no se le asocia un escalar $y_i$ —como sucede con los no generalizados— sino un vector de datos $D_i$. La predicción del GRF en un punto $x$ es el valor $\theta$ —que puede ser un vector— que minimiza la expresión

$$\sum_i \alpha_i(x) L(D_i, \theta)$$

donde:

  • $\alpha_i(x)$ es el peso de $x_i$ en la predicción de $x$ (y que depende de la distancia entre $x$ y $x_i$).
  • $L$ es una función de pérdida determinada.

Por ejemplo, si $D_i = (y_i)$ y $L(D_i, \theta) = (y_i - \theta)^2$, el mínimo se obtendría en la media (local) de los valores $y_i$ y tendríamos un modelo de regresión al uso. Análogamente, si $L(D_i, \theta) = |y_i - \theta |$, el GRF estaría tratando de estimar la mediana (local) de los $y_i$.

Pero imaginemos que $D_i = (y_i, z_{i1}, \dots, z_{ik})$ y que

$$L(D_i, \theta) = (y_i - \theta_0 - \theta_1 z_{i1} - \dots - \theta_k z_{ik})^2.$$

Entonces los $\theta = (\theta_0, \dots, \theta_k)$ serían los coeficientes de una regresión lineal local (en el entorno de cada $x$).

Antes de continuar, dos notas:

  1. En realidad, en el artículo, $\theta$ tiene dos partes: $\theta$ propiamente dicha, que es la variable de interés, y $\nu$, una serie de valores que forman parte de la minimización pero que no son de interés para el usuario (y que no intervienen en la definición de la distancia).
  2. Los bosques causales son precisamente casos en los que $L(D_i, \theta) = (y_i - \theta_0 - \theta_1 T_{i})^2$ donde $T$ es una variable que indica si el sujeto $i$ ha recibido o no el tratamiento en cuestión. Es, por tanto, la regresión $y \sim T$ ajustada localmente y un caso particular del descrito más arriba. En este caso, además, solo interesa realmente el valor $\theta_1$, el tamaño del efecto, y $\theta_0$, el término independiente, sería la componente ignorable, $\nu$, discutida en la nota anterior.

Lo peculiar de los GRF —y que los distingue de otros métodos de ajuste local de modelos— es cómo se calculan los pesos $\alpha_i(x)$: son la proporción de nodos terminales de los árboles de un RRFF en los que $x$ y $x_i$ coinciden. Así, $x_i$ y $x$ estarán próximos si muchos de los árboles del RRFF tienden a colocarlos en el mismo nodo terminal y lejos si pasa lo contrario.

Con lo cual hemos llegado al punto en el que la pescadilla se muerde la cola: se necesita un RRFF para poder evaluar la función objetivo; pero, a la vez, el RRFF tiene que haberse construido conforme a dicha función objetivo para que corte el espacio de forma consistente con ella.

El truco que utilizan los GRF consiste, como no puede ser de otra manera, en cambiar la función objetivo en la construcción del RRFF. En primer lugar, los árboles del RRFF ignoran los pesos y solo tienen en cuenta la diferencia entre $\theta_{\text{izda}}$ y $\theta_{\text{dcha}}$ —estimados, se insiste, sin pesos— para identificar los cortes óptimos de los árboles. Luego, además, y según el artículo, tampoco resuelven exactamente $\theta_{\text{izda}}$ y $\theta_{\text{dcha}}$ —piénsese en lo costoso que resultaría computacionalmente— sino que utilizan aproximaciones a sus diferencias basadas en resultados cuyos detalles, creo, nos interesan a pocos.

El resultado final podría haber sido una catástrofe, pero parece que, al final, los errores que introducen las aproximaciones por todas partes no parecen agregarse perniciosamente en una serie de ejemplos de uso de la cosa y el algoritmo parece que aguanta derecho las inclemencias de las aplicaciones reales. Al menos, de momento, nadie parece haberse quejado mucho, si es que eso es garantía de algo.