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)
}
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.
la source
added above