randomForest и ошибка важности переменной?

10

Я не получаю разницу между rfobject$importanceи importance(rfobject)в столбце MeanDecreaseAccuracy.

Пример:

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

Я получаю разные значения MeanDecreaseAccuracy, но в том же порядке для переменных важности ( fit$importanceкак и для importance(fit)):

  1. Petal.Width

  2. Petal.Length

  3. Sepal.Length

  4. Sepal.Width

Но в других наборах данных я иногда получаю разные заказы. Может кто-нибудь объяснить, что здесь происходит? Это возможно ошибка?


Изменить (в ответ на Мартина О'Лири )

Хорошо спасибо! Я заметил кое-что еще.

Взглянув на rfcv()функцию, я заметил строку:

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

с помощью этой строки мы выбираем первый столбец, all.rf$importanceкоторый дает нам порядок специфичных для класса (для первого фактора ) мер, рассчитанных только как среднее снижение точности. Это не всегда тот же порядок, что и среднее снижение точности по всем классам ( MeanDecreaseAccuracy). Не было бы лучше выбрать либо MeanDecreaseAccuracyили MeanDecreaseGiniстолбец, или лучше , используя importance()-функции для масштабируемых значений? Таким образом, у нас будет последовательно уменьшенное количество предикторов, ранжированных по важности переменных (по всем классам), а не только ранжированных по важности переменных для первого класса.

Giuseppe
источник

Ответы:

13

Нет, это не ошибка. Значения, указанные в, fit$importanceявляются немасштабированными, в то время как значения importance(fit), выраженные как, выражаются в единицах стандартных отклонений (как указано в fit$importanceSD). Обычно это более значимая мера. Если вы хотите «сырые» значения, вы можете использовать importance(fit, scale=FALSE).

В общем, очень плохая идея полагаться на внутренние детали объекта подгонки, когда предусмотрена функция извлечения. Нет никаких гарантий относительно содержания fit$importance- они могут резко измениться от версии к версии без предварительного уведомления. Вы всегда должны использовать функцию экстрактора, когда она предоставляется.


Изменить: Да, эта строка rfcv()выглядит как ошибка или, по крайней мере, непреднамеренное поведение. На самом деле это довольно хороший пример того, почему вы не должны полагаться на содержание таких вещей, как fit$importance. Если подходит для регрессионного леса, первый столбец fit$importanceявляется %IncMSE, что эквивалентно importance(fit, type=1). Однако это не относится к случаю классификации, где у вас есть дополнительные столбцы для каждого уровня фактора.

Мартин О'Лири
источник