Tengo un conjunto de datos que son 200k filas X 50 columnas. Estoy tratando de usar un knn
pero hay una enorme variación en el rendimiento dependiendo de las variables que se utilicen (es decir.., rsqd
va de 0,01 (usando todas las variables) a 0,98 (usando sólo 5 variables)).
Este tipo de problema se agrava, ya que ahora tengo que determinar k
y qué variables utilizar.
¿Hay un paquete en R que ayuda a seleccionar las variables para un knn
modelo, mientras se afina k
? He mirado rfe()
en caret
pero parece estar construido sólo para la regresión lineal, randomforest
bayes ingenuos, etc., pero no knn
.
Como un aparte, he intentado construir manualmente un bucle para usar la función de tren de carros de esta manera:
for(i in 2:50){
knnFit <- train(x[,i],y,...) ## trains model using single variable
}
Mi problema es que knnFit$results
imprime todos los resultados y knnFit$bestTune
sólo imprime el parámetro final de k
.
> data1 <- data.frame(col1=runif(20), col2=runif(20), col3=runif(20), col4=runif(20), col5=runif(20))
> bootControl <- trainControl(number = 1)
> knnGrid <- expand.grid(.k=c(2:5))
> set.seed(2)
> knnFit1 <- train(data1[,-c(1)], data1[,1]
+ , method = "knn", trControl = bootControl, verbose = FALSE,
+ tuneGrid = knnGrid )
> knnFit1
20 samples
4 predictors
No pre-processing
Resampling: Bootstrap (1 reps)
Summary of sample sizes: 20
Resampling results across tuning parameters:
k RMSE Rsquared
2 0.485 0.124
3 0.54 0.369
4 0.52 0.241
5 0.528 0.232
RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 2.
> knnFit1$results
k RMSE Rsquared RMSESD RsquaredSD
1 2 0.4845428 0.1241031 NA NA
2 3 0.5401009 0.3690569 NA NA
3 4 0.5197262 0.2410814 NA NA
4 5 0.5277939 0.2317607 NA NA
> knnFit1$bestTune
.k
1 2
Necesito alguna forma de imprimir la métrica RMSE/rsqd/otras métricas para el mejor modelo de rendimiento individual (es decir, sólo "R-cuadrado: 0,91").
¿Alguna sugerencia?
1 votos
Este es uno de mis problemas con R. ¿Qué biblioteca es
train()
de? Sin ellibrary(...)
es increíblemente difícil de entender en este caso con una función de nombre tan vago comotrain
. Si la convención fuera llamar a funciones como lib.name::function() entonces esto no sería tan difícil...0 votos
@wordsforthewise:
train
es de lacaret
paquete.0 votos
Sí, debería haber sido capaz de ver que a partir de las etiquetas, pero no creo que mirar allí. gracias