Comment effectuer la sélection de variables d'algorithme génétique dans R pour les variables d'entrée SVM?

9

J'utilise le package kernlab dans R pour construire un SVM pour classer certaines données.

Le SVM fonctionne bien en ce qu'il fournit des `` prédictions '' d'une précision décente, mais ma liste de variables d'entrée est plus longue que je ne le souhaiterais et je ne suis pas sûr de l'importance relative des différentes variables.

Je voudrais implémenter un algorithme génétique pour sélectionner le sous-ensemble de variables d'entrée qui produit le SVM le mieux formé / le plus adapté.

J'aimerais avoir de l'aide pour choisir le package R à utiliser lors de la tentative de mise en œuvre de GA (et éventuellement un bref exemple de pseudo).

J'ai regardé la plupart des packages R GA / P ( RGP , genalg , subselect , GALGO ), mais je me bats conceptuellement pour voir comment je passerais ma fonction ksvm dans le cadre de la fonction fitness et entrer mon tableau variable comme pool de population ...?

Toute aide, pensée ou coup de coude dans la bonne direction a été reçue avec gratitude.

Merci

code qui résout ce problème ajouté ci-dessous dans une édition ultérieure

# 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
la source

Réponses:

7

Mon conseil serait de ne pas le faire. Les avantages théoriques du SVM qui évitent le sur-ajustement ne s'appliquent qu'à la détermination des multiplicateurs de décalage (les paramètres du modèle). Dès que vous commencez à effectuer la sélection des fonctionnalités, ces avantages sont essentiellement perdus, car il y a peu de théorie qui couvre la sélection du modèle ou la sélection des fonctionnalités, et vous êtes très susceptible de sur-ajuster le critère de sélection des fonctionnalités, surtout si vous effectuez une recherche très difficile à l'aide d'un GÉORGIE. Si la sélection des fonctionnalités est importante, j'utiliserais quelque chose comme LASSO, LARS ou Elastic net, où la sélection des fonctionnalités se fait via la régularisation, où la sélection des fonctionnalités est plus contrainte, donc il y a moins de degrés de liberté effectifs et moins de sur-ajustement.

Notez qu'un avantage clé du SVM est qu'il s'agit d'une implémentation approximative d'une borne de généralisation qui est indépendante de la dimensionnalité de l'espace des fonctionnalités, ce qui suggère que la sélection des fonctionnalités ne devrait peut-être pas nécessairement améliorer les performances, et s'il existe un une insuffisance dans le processus de sélection (par exemple un sur-ajustement du critère de sélection) pourrait bien aggraver les choses!

Dikran Marsupial
la source
5
+1 Un chiot adorable meurt chaque fois que vous sélectionnez une fonctionnalité avec des algorithmes génétiques.
@mbq LOL! (apparemment, j'avais besoin de taper au moins six caractères de plus que je ne le voulais vraiment.)
Dikran Marsupial
1
@mbq chiots ET chatons, il semblerait, si mes résultats sont probants ...
tfb
@mbq Je prévois de faire une sélection de fonctionnalités avec les AG pour un papier que j'écris en ce moment (ne m'attendant pas à ce que cela fonctionne, mais certains des ensembles de données ont trop de fonctionnalités pour une recherche exhaustive). Désolé Fido!
Dikran Marsupial
@DikranMarsupial Eh bien, je ne peux que vous inviter à essayer de les pré-filtrer avec certains de mes outils en bois (;
2

En fin de compte, j'ai fini par utiliser le package `` genalg '' sur R. Cela signifie convertir le chromosome gagnant à partir d'un format binaire pour représenter les variables dans mes données, mais cela est relativement trivial une fois que l'AG a fonctionné. Faites-moi savoir si vous souhaitez plus de détails.

tfb
la source
Pourriez-vous publier le code?
B_Miner
@B_Miner désolé pour le retard, cela fait un moment que je suis sur SO. Cela fait aussi un moment que je me suis battu avec ce problème dans R. J'ai jeté un œil à mes anciens fichiers et je pense que le code ci-dessous l'a résolu - j'espère que cela aide:added above
tfb
2
(Avertissement: les algorithmes génétiques à mon humble avis sont parmi les optimiseurs les plus mauvais pour les modèles statistiques. Ils exploitent la variance dans l'estimation des performances de manière très mauvaise). Donc: vérifiez au moins votre modèle final avec des données de test vraiment indépendantes!
cbeleites mécontents de SX