Come interpretare l'output di importanza XGBoost?


37

Ho eseguito un modello xgboost. Non so esattamente come interpretare l'output di xgb.importance.

Qual è il significato di guadagno, copertura e frequenza e come li interpretiamo?

Inoltre, cosa significano Split, RealCover e RealCover%? Ho alcuni parametri extra qui

Ci sono altri parametri che possono dirmi di più sull'importanza delle funzionalità?

Dalla documentazione R, ho capito che il guadagno è qualcosa di simile al guadagno delle informazioni e la frequenza è il numero di volte in cui una funzione viene utilizzata in tutti gli alberi. Non ho idea di cosa sia Cover.

Ho eseguito il codice di esempio fornito nel collegamento (e ho anche provato a fare lo stesso sul problema su cui sto lavorando), ma la definizione di divisione fornita non corrispondeva ai numeri che ho calcolato.

importance_matrix

Produzione:

           Feature         Gain        Cover    Frequence
  1:            xxx 2.276101e-01 0.0618490331 1.913283e-02
  2:           xxxx 2.047495e-01 0.1337406946 1.373710e-01
  3:           xxxx 1.239551e-01 0.1032614896 1.319798e-01
  4:           xxxx 6.269780e-02 0.0431682707 1.098646e-01
  5:          xxxxx 6.004842e-02 0.0305611830 1.709108e-02

214:     xxxxxxxxxx 4.599139e-06 0.0001551098 1.147052e-05
215:     xxxxxxxxxx 4.500927e-06 0.0001665320 1.147052e-05
216:   xxxxxxxxxxxx 3.899363e-06 0.0001536857 1.147052e-05
217: xxxxxxxxxxxxxx 3.619348e-06 0.0001808504 1.147052e-05
218:  xxxxxxxxxxxxx 3.429679e-06 0.0001792233 1.147052e-05

Risposte:


40

Dalla tua domanda, presumo che stai usando xgboost per adattare gli alberi potenziati per la classificazione binaria. La matrice di importanza è in realtà un oggetto data.table con la prima colonna che elenca i nomi di tutte le funzionalità effettivamente utilizzate negli alberi potenziati.

Il significato della tabella dei dati di importanza è il seguente:

  1. Il guadagno implica il contributo relativo della caratteristica corrispondente al modello calcolato prendendo il contributo di ciascuna caratteristica per ciascun albero nel modello. Un valore più elevato di questa metrica rispetto a un'altra caratteristica implica che è più importante per generare una previsione.
  2. La metrica Cover indica il numero relativo di osservazioni relative a questa funzione. Ad esempio, se si hanno 100 osservazioni, 4 caratteristiche e 3 alberi e si suppone che la funzione 1 sia usata per decidere il nodo foglia per 10, 5 e 2 osservazioni rispettivamente in albero1, albero2 e albero3; quindi la metrica conterà la copertura per questa funzione come 10 + 5 + 2 = 17 osservazioni. Questo sarà calcolato per tutte e 4 le funzionalità e la copertina sarà 17 espressa in percentuale per le metriche di copertina di tutte le funzionalità.
  3. La frequenza (/ 'Frequenza') è la percentuale che rappresenta il numero relativo di volte in cui una particolare caratteristica si presenta negli alberi del modello. Nell'esempio sopra, se feature1 si è verificato in 2 split, 1 split e 3 split in ciascuno di tree1, tree2 e tree3; quindi la ponderazione per feature1 sarà 2 + 1 + 3 = 6. La frequenza per feature1 viene calcolata come peso percentuale rispetto ai pesi di tutte le funzionalità.

Il guadagno è l'attributo più rilevante per interpretare l'importanza relativa di ciascuna caratteristica.

Le misure sono tutte relative e quindi tutte sommate a una, un esempio di un modello xgboost montato in R è:

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1

1
La copertina viene calcolata solo in base ai nodi foglia o su tutte le divisioni?
fanfabbb,

3

Grazie Sandeep per la risposta dettagliata. Vorrei correggere che la copertina sia calcolata su tutte le divisioni e non solo sui nodi foglia.

Facciamo un semplice esempio con i dati forniti dalla libreria xgboost.

library('xgboost')

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')

train <- agaricus.train
test <- agaricus.test

X = train$data

y = train$label

bst <- xgboost(data = X, label = y, max.depth = 2,
           eta = 1, nthread = 2, nround = 2,objective = "binary:logistic",
           reg_lambda = 0, reg_alpha = 0)

xgb.model.dt.tree(agaricus.train$data@Dimnames[[2]], model = bst)

xgb.importance(agaricus.train$data@Dimnames[[2]], bst)

Produzione -

Discarica di alberi

Matrice di importanza

Proviamo a calcolare la copertura dell'odore = nessuno nella matrice di importanza (0.495768965) dalla discarica dell'albero.

La copertura di ogni divisione in cui viene utilizzato l'odore = nessuno è 1628.2500 con ID nodo 0-0 e 765.9390 con ID nodo 1-1.

Copertura totale di tutte le divisioni (sommando attraverso la colonna di copertura nella discarica dell'albero) = 1628.2500 * 2 + 786.3720 * 2

Copertura dell'odore = nessuna nella matrice di importanza = (1628.2500 + 765.9390) / (1628.2500 * 2 + 786.3720 * 2)

Quindi siamo sicuri che la copertura è calcolata su tutte le divisioni!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.