8 votos

Paquete Caret en R - obtener la variable de mayor importancia

Me encuentro con dos problemas al utilizar caret en R. A continuación reproduzco un ejemplo:

library(mlbench)
library(caret)
set.seed(998)

data(Sonar)   #Random data, just for illustration purpose
Sonar= Sonar[, 1:6] #Selected first 6 columsn only for showing an example. I am assuming V6 to be response.
head(Sonar)
inTraining <- createDataPartition(Sonar$V6, p = 0.75, list = FALSE)
training <- Sonar[inTraining, ]
testing <- Sonar[-inTraining, ]
modelFit <- train( V6~.,data=training, method="rpart" )  
varImp(modelFit)

a. Cómo extraer las tres (3) principales variables de varImp ¿salida? He intentado ordenar las variables pero por alguna razón no me funciona.

b. Además, ¿por qué el siguiente código no funciona para "randomForest"?

modelFit <- train( V6~.,data=training, method="rf" )  
varImp(modelFit)

> varImp(modelFit)

 Rerun with Debug
 Error in varImp[, "%IncMSE"] : subscript out of bounds

23voto

Psycho Bob Puntos 661

¿Cuál es el problema con el número 1? A mí me funciona bien y el resultado de la llamada a varImp() produce lo siguiente, ordenado de mayor a menor importancia:

> varImp(modelFit)
rpart variable importance

   Overall
V5 100.000
V4  38.390
V3  38.362
V2   5.581
V1   0.000

EDITAR A partir de la aclaración de la pregunta:

Estoy seguro de que hay formas mejores, pero así es como yo lo haría:

ImpMeasure<-data.frame(varImp(modelFit)$importance)
    ImpMeasure$Vars<-row.names(ImpMeasure)
ImpMeasure[order(-ImpMeasure$Overall),][1:3,]

En cuanto a #2, hay que añadir importance=TRUE para decir randomForest para calcularlos.

> modelFit <- train( V6~.,data=training, method="rf" ,importance = TRUE)
> varImp(modelFit)
rf variable importance

   Overall
V5 100.000
V3  22.746
V2  21.136
V4   3.797
V1   0.000

4voto

Moc Puntos 11

A continuación se muestra una opción de dplyr utilizando tuberías. Parece extraño que esto sea tan difícil de acceder.

library(dplyr)

col_index <- varImp(modelFit)$importance %>% 
  mutate(names=row.names(.)) %>%
  arrange(-Overall)

Si quieres los tres primeros, entonces esto debería funcionar:

imp_names <- col_index$names[1:3]

También se puede hacer un subconjunto del marco de datos original de esta manera:

Sonar_imp <- Sonar[,imp_names]

-1voto

Chipmunk Puntos 9

Esto debería servir:

rownames(varImp(modelFit)$importance)[1:3]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X