Tenía una pregunta sobre el parámetro de profundidad de la interacción en gbm en R. Puede que sea una pregunta de novato, por lo que me disculpo, pero ¿cómo el parámetro, que creo que denota el número de nodos terminales en un árbol, indica básicamente la interacción de X vías entre los predictores? Sólo trato de entender cómo funciona. Además, obtengo modelos bastante diferentes si tengo un conjunto de datos con, por ejemplo, dos variables de factor diferentes frente al mismo conjunto de datos, excepto que esas dos variables de factor se combinan en un único factor (por ejemplo, niveles X en el factor 1, niveles Y en el factor 2, la variable combinada tiene factores X * Y). Esta última es significativamente más predictiva que la primera. Pensaba que el aumento de la profundidad de las interacciones permitiría detectar esta relación.
Respuestas
¿Demasiados anuncios?Las dos respuestas anteriores son incorrectas. El paquete GBM utiliza interaction.depth
como un número de divisiones que debe realizar en un árbol (partiendo de un solo nodo). Como cada división aumenta el número total de nodos en 3 y el número de nodos terminales en 2 (nodo $\to$ {nodo izquierdo, nodo derecho, nodo NA}) el número total de nodos del árbol será $3*N+1$ y el número de nodos terminales $2*N+1$ . Esto puede verificarse echando un vistazo a la salida de pretty.gbm.tree
función.
El comportamiento es bastante engañoso, ya que el usuario espera efectivamente que la profundidad sea la del árbol resultante. Pero no es así.
Tenía una pregunta sobre el parámetro de profundidad de la interacción en gbm en R. Puede que sea una pregunta de novato, por lo que me disculpo, pero ¿cómo indica el parámetro, que creo que denota el número de nodos terminales en un árbol, básicamente la interacción X-way entre los predictores?
Relación entre interaction.depth y el número de nodos terminales
Uno como para ver interaction.depth
como el número de nodos divididos. Un interaction.depth
fijado en k dará lugar a nodos con k+1 nodos terminales (omitiendo los nodos NA), por lo que tenemos : $$interaction.depth=\#\{Terminal Nodes\}+1 $$
Enlace entre interaction.depth y la orden de interacción
El vínculo entre interaction.depth
y el orden de interacción es más tedioso.
En lugar de razonar con la interacción.profundidad, vamos a razonar con el número de nodos terminales, que llamaremos J .
Ejemplo: Digamos que tiene J=4 nodos terminales (interaction.depth=3) puede :
- hacer la primera división en la raíz, luego la segunda en el nodo izquierdo de la raíz y la tercera en el nodo derecho de la raíz. El orden de interacción para este árbol será 2.
- hacer la primera división en la raíz, luego la segunda división en el nodo izquierdo (respectivamente derecho) de la raíz, y una tercera división en este mismo nodo izquierdo (respectivamente derecho). El orden de interacción para este árbol será 3.
Por lo tanto, no se puede saber de antemano cuál será el orden de interacción entre sus características en un árbol determinado. Sin embargo, es posible acotar este valor. Sea P sea el orden de interacción de las características en un árbol dado. Tenemos : $$P\leq min(J-1,n)$$ siendo n el número de observaciones. Para más detalles, véase la sección 7 del artículo original de Friedman .
En realidad, las respuestas anteriores son incorrectas.
Sea K la profundidad de la interacción, entonces el número de nodos N y de hojas L (es decir, los nodos terminales) vienen dados respectivamente por lo siguiente: $$\begin{align*} N &= 2^{(K+1)} - 1\\ L &= 2^K \end{align*} $$ Las 2 fórmulas anteriores pueden demostrarse fácilmente: un árbol de profundidad K puede verse como si tuviera K+1 niveles k que van de 0 (nivel de raíz) a K (nivel de hoja).
Cada uno de estos niveles tiene $2^k$ nodos. Y el número total de nodos del árbol es la suma del número de nodos de cada nivel.
En términos matemáticos: $$ N = \sum_{k=0}^K 2^k) $$
lo que equivale a:
$$N = 2^{(K+1)} - 1 $$ (según la fórmula de la suma de los términos de una progresión geométrica).
Puedes probar
table(predict(gbm( y ~.,data=TrainingData, distribution="gaussian", verbose =FALSE, n.trees =1 , shrinkage =0.01, bag.fraction =1 , interaction.depth = 1 ),n.trees=1))
y ver que sólo hay 2 valores predichos únicos. interaction.depth = 2 obtendrá 3 valores predichos distintos. Y convénzase usted mismo.