¿Cómo realizar la selección de variables del algoritmo genético en R para las variables de entrada SVM?

9

Estoy usando el paquete kernlab en R para construir un SVM para clasificar algunos datos.

El SVM está funcionando bien ya que proporciona 'predicciones' de una precisión decente, sin embargo, mi lista de variables de entrada es más grande de lo que quisiera y no estoy seguro de la importancia relativa de las diferentes variables.

Me gustaría implementar un algoritmo genético para seleccionar el subconjunto de variables de entrada que produce el SVM mejor capacitado / más apto.

Me gustaría recibir ayuda para elegir qué paquete R usar al intentar esta implementación de GA (y posiblemente un breve ejemplo de psuedo).

He visto la mayoría de los paquetes R GA / P ( RGP , genalg , subselect , GALGO ), pero estoy luchando conceptualmente para ver cómo pasaría mi función ksvm como parte de la función fitness e ingresar mi matriz variable como el grupo de población ...?

Cualquier ayuda, pensamientos o empujones en la dirección correcta recibidos con gratitud.

Gracias

código que resuelve esto agregado a continuación en una EDICIÓN posterior

# Prediction function to be used for backtesting
pred1pd = function(t) {
print(t)
##add section to select the best variable set from those available using GA
  # evaluation function - selects the best indicators based on miminsied training error
mi.evaluate <- function(string=c()) {
    tmp <- data[(t-lookback):t,-1]
    x <- string
    tmp <- tmp[,x==1]
    tmp <- cbind(data[(t-lookback):t,1],tmp)
    colnames(tmp)[1] <- "targets"
    trainedmodel = ksvm(targets ~ ., data = tmp, type = ktype, kernel="rbfdot", kpar=list(sigma=0.1), C = C, prob.model = FALSE, cross = crossvalid)
    result <- error(trainedmodel)
    print(result)
    }

## monitor tge GA process
monitor <- function(obj) {
minEval = min(obj$evaluations);
plot(obj, type="hist");
}

## pass out the GA results; size is set to be the number of potential indicators
gaResults <- rbga.bin(size=39, mutationChance=0.10, zeroToOneRatio=10, evalFunc=mi.evaluate, verbose=TRUE, monitorFunc=monitor, popSize=50, iters=3, elitism=10)

## now need to pull out the best chromosome and rebuild the data frame based on these results so that we can train the model

bestChro <- gaResults$population[1,]
newData <- data[,-1]
newData <- newData[,bestChro==1]
newData <- cbind(data[,1],newData)
colnames(newData)[1] <- "targets"
print(colnames(newData))

# Train model using new data set
model = trainSVM(newData[(t-lookback):t, ], ktype, C, crossvalid)
# Prediction
pred = as.numeric(as.vector(predict(model, newData[t+1, -1], type="response")))
# Print for user inspection
print(pred)
}
tfb
fuente

Respuestas:

7

Mi consejo sería no hacer esto. Las ventajas teóricas de la SVM que evitan el sobreajuste se aplican solo a la determinación de los multiplicadores de lagrange (los parámetros del modelo). Tan pronto como comience a realizar la selección de características, esas ventajas se pierden esencialmente, ya que existe poca teoría que cubra la selección de modelos o la selección de características, y es muy probable que se ajuste demasiado al criterio de selección de características, especialmente si busca realmente con un GEORGIA. Si la selección de características es importante, usaría algo como LASSO, LARS o Elastic net, donde la selección de características surge a través de la reguarización, donde la selección de características es más restringida, por lo que hay menos grados efectivos de libertad y menos ajuste.

Tenga en cuenta que una ventaja clave de la SVM es que es una implementación aproximada de un límite de generalización que es independiente de la dimensionalidad del espacio de características, lo que sugiere que la selección de características no necesariamente debería mejorar el rendimiento, y si hay un La deficiencia en el proceso de selección (por ejemplo, el ajuste excesivo del criterio de selección) puede empeorar las cosas.

Dikran Marsupial
fuente
55
+1 Un dulce cachorro muere cada vez que haces una selección de características con algoritmos genéticos.
@mbq LOL! (aparentemente necesitaba escribir al menos seis caracteres más de los que realmente quería).
Dikran Marsupial
1
@mbq cachorros Y gatitos parecería, si mis resultados son algo para pasar ...
tfb
@mbq Estoy planeando hacer una selección de funciones con GA para un documento que estoy escribiendo en este momento (no espero que funcione, pero algunos de los conjuntos de datos tienen demasiadas funciones para una búsqueda exhaustiva). Lo siento Fido!
Dikran Marsupial
@DikranMarsupial Bueno, solo puedo invitarlos a que intenten prefiltrarlos con algunas de mis herramientas de madera (;
2

Al final, terminé usando el paquete 'genalg' en R. Significa convertir el cromosoma ganador de un formato binario para representar las variables en mis datos, pero esto es relativamente trivial una vez que el GA se ha ejecutado. Avíseme si desea más detalles.

tfb
fuente
¿Te importaría publicar el código?
B_Miner
@B_Miner perdón por la demora, ha pasado un tiempo desde que he estado en SO. También ha pasado un tiempo desde que tuve problemas con este problema en R. He echado un vistazo a mis viejos archivos y creo que el siguiente fue el código que lo resolvió, espero que ayude:added above
tfb
2
(Descargo de responsabilidad: los algoritmos genéticos de la OMI están entre los optimizadores más malvados para los modelos estadísticos. Están explotando la varianza en la estimación del rendimiento de una manera muy mala). Entonces: ¡al menos verifique su modelo final con datos de prueba verdaderamente independientes!
Cbeleites descontento con SX