Ich verwende das Kernlab- Paket in R, um eine SVM zum Klassifizieren einiger Daten zu erstellen.
Die SVM funktioniert insofern gut, als sie "Vorhersagen" für eine anständige Genauigkeit liefert. Meine Liste der Eingabevariablen ist jedoch größer als ich möchte, und ich bin mir nicht sicher, welche relative Bedeutung die verschiedenen Variablen haben.
Ich möchte einen genetischen Algorithmus implementieren, um die Teilmenge der Eingabevariablen auszuwählen, die die am besten trainierte / am besten geeignete SVM erzeugt.
Ich hätte gerne Hilfe bei der Auswahl des R-Pakets, das beim Versuch dieser GA-Implementierung verwendet werden soll (und möglicherweise ein kurzes Pseudo-Beispiel).
Ich habe mir die meisten R GA / P-Pakete ( RGP , Genalg , Subselect , GALGO ) angesehen, aber ich habe konzeptionell Probleme zu sehen, wie ich meine ksvm-Funktion als Teil der Fitnessfunktion übergeben und meine eingeben würde variables Array als Bevölkerungspool ...?
Jede Hilfe, Gedanken oder Stupser in die richtige Richtung dankbar aufgenommen.
Vielen Dank
Code, der dieses Problem löst, wird unten in einer späteren BEARBEITUNG hinzugefügt
# 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)
}
Am Ende habe ich das 'Genalg'-Paket für R verwendet. Es bedeutet, das gewinnende Chromosom von einem Binärformat zu konvertieren, um die Variablen in meinen Daten darzustellen, aber dies ist relativ trivial, sobald die GA ausgeführt wurde. Lassen Sie mich wissen, wenn Sie weitere Details wünschen.
quelle
added above