randomForest e bug de importância variável?

10

Não obtenho a diferença entre the rfobject$importancee importance(rfobject)na coluna MeanDecreaseAccuracy.

Exemplo:

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

Eu recebo diferentes valores de MeanDecreaseAccuracy, mas tenho a mesma ordem para as variáveis ​​de importância (para fit$importancee para importance(fit)):

  1. Petal.Width

  2. Comprimento da pétala

  3. Sepal.Length

  4. Sepal.Width

Mas em outros conjuntos de dados às vezes recebo pedidos diferentes. Alguém pode explicar o que está acontecendo aqui? Isso é possivelmente um bug?


Editar (em resposta a Martin O'Leary )

Ok, obrigado! Eu notei outra coisa.

Dando uma olhada na rfcv()função, notei a linha:

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

com essa linha, escolhemos a primeira coluna, all.rf$importanceque nos dá a ordem das medidas específicas da classe (para o primeiro fator ) calculadas como decréscimo médio apenas na precisão. Isso nem sempre tem a mesma ordem que a diminuição média da precisão em todas as classes ( MeanDecreaseAccuracy). Não seria melhor escolher tanto o MeanDecreaseAccuracyou MeanDecreaseGinicoluna, ou melhor usando o importance()-função para os valores escalonados? Portanto, teríamos um número sequencialmente reduzido de preditores classificados por importância variável (em todas as classes) e não apenas por importância variável para a primeira classe.

Giuseppe
fonte

Respostas:

13

Não, isso não é um bug. Os valores dados em fit$importancenão são escalados, enquanto os valores dados por importance(fit)são expressos em termos de desvios padrão (conforme dados por fit$importanceSD). Geralmente, essa é uma medida mais significativa. Se você deseja os valores "brutos", pode usar importance(fit, scale=FALSE).

Em geral, é uma péssima idéia confiar nos detalhes internos de um objeto de ajuste, quando há uma função extrator fornecida. Não há garantias quanto ao conteúdo fit$importance- elas podem mudar drasticamente de versão para versão sem aviso prévio. Você sempre deve usar a função extrator quando fornecida.


Edit: Sim, essa linha rfcv()parece um bug, ou pelo menos um comportamento não intencional. Na verdade, é um bom exemplo de por que você não deve confiar no conteúdo de coisas assim fit$importance. Se o ajuste for para uma floresta de regressão, a primeira coluna de fit$importanceé %IncMSEequivalente a importance(fit, type=1). No entanto, isso não se aplica ao caso de classificação, onde você tem colunas extras para cada nível de fator.

Martin O'Leary
fonte