randomForest e bug di importanza variabile?


10

Non ottengo la differenza tra rfobject$importancee importance(rfobject)nella colonna MeanDecreaseAccuracy.

Esempio:

> data("iris")
> fit <- randomForest(Species~., data=iris, importance=TRUE)
> fit$importance
                  setosa  versicolor   virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 0.027078501 0.019418330 0.040497602           0.02898837         9.173648
Sepal.Width  0.008553449 0.001962036 0.006951771           0.00575489         2.472105
Petal.Length 0.313303381 0.291818815 0.280981959           0.29216790        41.284869
Petal.Width  0.349686983 0.318527008 0.270975757           0.31054451        46.323415
> importance(fit)
               setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 1.277324   1.632586  1.758101            1.2233029         9.173648
Sepal.Width  1.007943   0.252736  1.014141            0.6293145         2.472105
Petal.Length 3.685513   4.434083  4.133621            2.5139980        41.284869
Petal.Width  3.896375   4.421567  4.385642            2.5371353        46.323415
> 

Ottengo valori MeanDecreaseAccuracy diversi ma ho lo stesso ordine per le variabili di importanza (sia per fit$importanceche per importance(fit)):

  1. Petal.Width

  2. Petal.Length

  3. Sepal.Length

  4. Sepal.Width

Ma in altri set di dati a volte ricevo ordini diversi. Qualcuno può spiegare cosa sta succedendo qui? È forse un bug?


Modifica (in risposta a Martin O'Leary )

Va bene, grazie! Ho notato qualcos'altro.

Dando un'occhiata alla rfcv()funzione ho notato la linea:

impvar <- (1:p)[order(all.rf$importance[, 1], decreasing = TRUE)]

con questa linea scegliamo la prima colonna della all.rf$importancequale ci fornisce l'ordine delle misure specifiche della classe (per il primo fattore ) calcolate come diminuzione media solo in precisione. Questo non ha sempre lo stesso ordine della diminuzione media della precisione su tutte le classi ( MeanDecreaseAccuracy). Non sarebbe meglio scegliere sia la MeanDecreaseAccuracyo MeanDecreaseGinicolonna, o meglio con il importance()-funzione per i valori scalati? Quindi avremmo un numero progressivamente ridotto di predittori classificati per importanza variabile (su tutte le classi) e non solo per importanza variabile per la prima classe.

Risposte:


13

No, questo non è un bug. I valori indicati fit$importancesono non scalati, mentre i valori indicati da importance(fit)sono espressi in termini di deviazioni standard (come indicato da fit$importanceSD). Questa è di solito una misura più significativa. Se vuoi i valori "grezzi", puoi usare importance(fit, scale=FALSE).

In generale, è una pessima idea fare affidamento sui dettagli interni di un oggetto adatto, quando è disponibile una funzione di estrazione. Non ci sono garanzie sul contenuto di fit$importance: potrebbero cambiare drasticamente da una versione all'altra senza preavviso. Dovresti sempre usare la funzione di estrazione quando viene fornita.


Modifica: Sì, quella linea rfcv()sembra un bug, o almeno un comportamento non intenzionale. In realtà è un buon esempio del perché non dovresti fare affidamento sul contenuto di cose come fit$importance. Se l'adattamento è per una foresta di regressione, la prima colonna di fit$importanceè %IncMSE, equivalente a importance(fit, type=1). Tuttavia, ciò non vale nel caso della classificazione, in cui sono presenti colonne aggiuntive per ogni livello di fattore.

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.