2015-07-08 20 views
5

Sto riscontrando qualche difficoltà nel comprendere come gli alberi sono strutturati nel pacchetto di macchine con boosting gradiente gbm di R. In particolare, guardando l'output di pretty.gbm.treeQuali caratteristiche fanno gli indici in SplitVar punto a?Comprensione della struttura ad albero nel pacchetto R gbm

mi sono allenato un GBM su un insieme di dati, qui è il top ~ quarto di uno dei miei alberi - il risultato di una chiamata a pretty.gbm.tree:

SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 
0   9 6.250000e+01  1   2   21  0.6634681 5981 0.005000061 
1  -1 1.895699e-12  -1  -1   -1  0.0000000 3013 0.018956988 
2  31 4.462500e+02  3   4   20  1.0083722 2968 -0.009168477 
3  -1 1.388483e-22  -1  -1   -1  0.0000000 1430 0.013884830 
4  38 5.500000e+00  5  18   19  1.5748155 1538 -0.030602956 
5  24 7.530000e+03  6  13   17  2.8329899 361 -0.078738904 
6  41 2.750000e+01  7  11   12  2.2499063 334 -0.064752766 
7  28 -3.155000e+02  8   9   10  1.5516610  57 -0.243675567 
8  -1 -3.379312e-11  -1  -1   -1  0.0000000  45 -0.337931219 
9  -1 1.922333e-10  -1  -1   -1  0.0000000  12 0.109783128 
``` 

Sembra a me qui che gli indici sono 0 in base a come guardare LeftNode, RightNode e MissingNode puntare a righe diverse. Quando eseguo il test utilizzando campioni di dati e seguendo l'albero fino alla loro previsione, ottengo la risposta corretta quando considero che SplitVar utilizza l'indicizzazione basata su .

Tuttavia, 1 dei molti alberi che ho costruito ha uno zero nella colonna SplitVar! Ecco questo albero:

SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 
0   4 1.462500e+02  1   2   21  0.41887 5981 0.0021651262 
1  -1 4.117688e-22  -1  -1   -1  0.00000 512 0.0411768781 
2   4 1.472500e+02  3   4   20  1.05222 5469 -0.0014870985 
3  -1 -2.062798e-11  -1  -1   -1  0.00000  23 -0.2062797579 
4   0 4.750000e+00  5   6   19  0.65424 5446 -0.0006222011 
5  -1 3.564879e-23  -1  -1   -1  0.00000 4897 0.0035648788 
6  28 -3.195000e+02  7  11   18  1.39452 549 -0.0379703437 

Qual è il modo corretto per visualizzare l'indicizzazione utilizzato da alberi di GBM?

+0

Sarebbe utile se si includesse un piccolo [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) con l'input di esempio e il codice stai usando per generare i tuoi oggetti. Mostrare solo i risultati non ci permette di avere una buona idea di cosa sta succedendo. I vettori in R sono sempre a base 1. Una prima colonna senza nome è solitamente un nome di riga piuttosto che un indice. – MrFlick

risposta

7

La prima colonna stampata quando si utilizza lo pretty.gbm.tree è lo row.names assegnato nello script pretty.gbm.tree.R. Nello script, row.names viene assegnato come row.names(temp) <- 0:(nrow(temp)-1) dove temp sono le informazioni sull'albero memorizzate nel modulo data.frame. Il modo corretto di interpretare lo row.names consiste nel leggerlo come node_id con il nodo radice assegnato a un valore 0.

Nel tuo esempio:

Id SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 0 9 6.250000e+01 1 2 21 0.6634681 5981 0.005000061

significa che il nodo radice (indicata dal numero di riga 0) è divisa dalla variabile scissione 9-esimo (la numerazione della variabile di distinzione qui parte da 0 , quindi la variabile split è la decima colonna nel set di allenamento x). SplitCodePred di 6.25 indica che tutti i punti inferiori a 6.25 sono passati allo LeftNode 1 e tutti i punti superiori a 6.25 sono passati a RightNode 2. Tutti i punti con un valore mancante in questa colonna sono stati assegnati allo MissingNode 21. Il ErrorReduction era 0.6634 a causa di questa divisione e c'erano 5981 (Weight) nel nodo principale. Prediction di 0.005 indica il valore assegnato a tutti i valori su questo nodo prima che il punto venisse diviso. Nel caso di nodi terminali (o foglie) indicati con -1 in SplitVar, LeftNode, RightNode, e MissingNode, il Prediction indica il valore previsto per tutti i punti appartenenti a questo nodo foglia rettificato (volte) volte la shrinkage.

Per comprendere la struttura ad albero, è importante notare che la scissione dell'albero avviene in modo approfondito prima. Pertanto, quando il nodo radice (con ID nodo 0) viene suddiviso nel nodo sinistro e nel nodo destro, il lato sinistro viene elaborato fino a quando non sono possibili ulteriori suddivisioni prima di restituire ed etichettare il nodo corretto. In entrambi gli alberi dell'esempio, il valore RightNode ottiene un valore pari a 2. Questo perché in entrambi i casi, lo LeftNode risulta essere un nodo foglia.

+0

Volevo solo sottolineare che i punti esattamente uguali a 6.25 vanno a destra. – Zelazny7