error de randomForest y de importancia variable?

10

No obtengo la diferencia entre rfobject$importancey importance(rfobject)en la columna MeanDecreaseAccuracy.

Ejemplo:

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

Obtengo diferentes valores de MeanDecreaseAccuracy pero tengo el mismo orden para las variables de importancia ( fit$importancetanto como para importance(fit)):

  1. Pétalo Ancho

  2. Pétalo Longitud

  3. Sepal longitud

  4. Ancho de sepal

Pero en otros conjuntos de datos a veces recibo diferentes órdenes. ¿Alguien puede explicar lo que está pasando aquí? ¿Es esto posiblemente un error?


Editar (en respuesta a Martin O'Leary )

¡Bien gracias! Noté algo más.

Echando un vistazo a la rfcv()función, noté la línea:

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

con esta línea elegimos la primera columna de la all.rf$importancecual nos da el orden de las medidas específicas de la clase (para el primer factor ) calculadas como disminución de la media en precisión solamente. Esto no siempre tiene el mismo orden que la disminución media de la precisión en todas las clases ( MeanDecreaseAccuracy). ¿No sería mejor elegir ya sea el MeanDecreaseAccuracyo MeanDecreaseGinicolumna, o mejor utilizando la importance()-función de los valores escalados? Por lo tanto, tendríamos un número secuencialmente reducido de predictores clasificados por importancia variable (en todas las clases) y no solo clasificados por importancia variable para la primera clase.

Giuseppe
fuente

Respuestas:

13

No, esto no es un error. Los valores dados en no fit$importanceestán escalados, mientras que los valores dados por importance(fit)se expresan en términos de desviaciones estándar (según lo dado por fit$importanceSD). Esta suele ser una medida más significativa. Si desea los valores "en bruto", puede usar importance(fit, scale=FALSE).

En general, es una muy mala idea confiar en los detalles internos de un objeto ajustado, cuando se proporciona una función extractora. No hay garantías en cuanto al contenido de fit$importance: podrían cambiar drásticamente de una versión a otra sin previo aviso. Siempre debe usar la función de extractor cuando se proporciona.


Editar: Sí, esa línea rfcv()parece un error, o al menos un comportamiento no deseado. En realidad, es un buen ejemplo de por qué no debe confiar en el contenido de cosas como fit$importance. Si el ajuste es para un bosque de regresión, la primera columna de fit$importancees %IncMSE, equivalente a importance(fit, type=1). Sin embargo, esto no se cumple en el caso de clasificación, donde tiene columnas adicionales para cada nivel de factor.

Martin O'Leary
fuente