błąd randomForest i zmienna ważność?

10

Nie dostaję różnicy między rfobject$importancei importance(rfobject)w kolumnie MeanDecreaseAccuracy.

Przykład:

> 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
> 

Otrzymuję różne wartości MeanDecreaseAccuracy, ale mam tę samą kolejność dla zmiennych ważności (zarówno dla, fit$importancejak i dla importance(fit)):

  1. Płatek. Szerokość

  2. Płatek Długość

  3. Długość osobna

  4. Sepal.Width

Ale w innych zestawach danych czasami otrzymuję różne zamówienia. Czy ktoś może wyjaśnić, co się tutaj dzieje? Czy to prawdopodobnie błąd?


Edytuj (w odpowiedzi na Martin O'Leary )

Ok, dzięki! Zauważyłem coś jeszcze.

Patrząc na rfcv()funkcję, zauważyłem linię:

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

za pomocą tego wiersza wybieramy pierwszą kolumnę, all.rf$importancektóra podaje nam kolejność miar specyficznych dla klasy (dla pierwszego czynnika ) obliczonych jedynie jako średni spadek dokładności. Nie zawsze ma to tę samą kolejność, co średni spadek dokładności we wszystkich klasach ( MeanDecreaseAccuracy). Czy nie byłoby lepiej, wybierając albo MeanDecreaseAccuracyczy MeanDecreaseGinikolumna, albo lepiej za pomocą importance()-function dla skalowane wartości? Mielibyśmy więc sekwencyjnie zmniejszoną liczbę predyktorów uszeregowanych według zmiennej ważności (we wszystkich klasach) i nie tylko uszeregowanych według zmiennej ważności dla pierwszej klasy.

Giuseppe
źródło

Odpowiedzi:

13

Nie, to nie jest błąd. Wartości podane w fit$importancesą nieskalowane, natomiast wartości podane przez importance(fit)są wyrażone jako odchylenia standardowe (podane przez fit$importanceSD). Jest to zwykle bardziej znaczący środek. Jeśli chcesz mieć wartości „surowe”, możesz użyć importance(fit, scale=FALSE).

Ogólnie rzecz biorąc, bardzo złym pomysłem jest poleganie na wewnętrznych szczegółach dopasowanego obiektu, gdy dostępna jest funkcja ekstraktora. Nie ma żadnych gwarancji co do zawartości fit$importance- mogą ulec drastycznej zmianie z wersji na wersję bez uprzedzenia. Zawsze powinieneś używać funkcji ekstraktora, gdy jest ona dostępna.


Edycja: Tak, ten wiersz rfcv()wygląda jak błąd lub przynajmniej niezamierzone zachowanie. To naprawdę dobry przykład, dlaczego nie powinieneś polegać na zawartości takich rzeczy fit$importance. Jeśli dopasowanie dotyczy lasu regresji, pierwsza kolumna fit$importancejest %IncMSErównoważna importance(fit, type=1). Nie dotyczy to jednak przypadku klasyfikacji, w którym masz dodatkowe kolumny dla każdego poziomu czynnika.

Martin O'Leary
źródło