Wie führe ich eine Variablenauswahl für genetische Algorithmen in R für SVM-Eingabevariablen durch?


9

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)
}

Antworten:


7

Mein Rat wäre, dies nicht zu tun. Die theoretischen Vorteile der SVM, die eine Überanpassung vermeiden, gelten nur für die Bestimmung der Lagrange-Multiplikatoren (der Parameter des Modells). Sobald Sie mit der Feature-Auswahl beginnen, gehen diese Vorteile im Wesentlichen verloren, da es wenig Theorie gibt, die die Modellauswahl oder Feature-Auswahl abdeckt, und Sie das Kriterium der Feature-Auswahl höchstwahrscheinlich überschreiten, insbesondere wenn Sie mit a wirklich hart suchen GA. Wenn die Merkmalsauswahl wichtig ist, würde ich etwas wie LASSO, LARS oder Elastic Net verwenden, bei dem die Merkmalsauswahl über die Reguarisierung erfolgt, bei dem die Merkmalsauswahl eingeschränkter ist, sodass weniger effektive Freiheitsgrade und weniger Überanpassung vorhanden sind.

Es ist zu beachten, dass ein Hauptvorteil der SVM darin besteht, dass es sich um eine ungefähre Implementierung einer Generalisierungsgrenze handelt, die unabhängig von der Dimensionalität des Merkmalsraums ist, was darauf hindeutet, dass die Merkmalsauswahl möglicherweise nicht unbedingt die Leistung verbessern sollte, und wenn es eine gibt Ein Mangel an Auswahlverfahren (z. B. Überanpassung des Auswahlkriteriums) kann die Situation durchaus verschlimmern!


5
+1 Ein süßer Welpe stirbt jedes Mal, wenn Sie eine Merkmalsauswahl mit genetischen Algorithmen durchführen.

@mbq LOL! (Anscheinend musste ich mindestens sechs Zeichen mehr eingeben, als ich wirklich wollte.)
Dikran Marsupial

1
@mbq Welpen UND Kätzchen es scheint, wenn meine Ergebnisse etwas zu gehen haben ...
tfb

@mbq Ich plane, mit GAs einige Funktionen für ein Papier auszuwählen, das ich gerade schreibe (ich erwarte nicht, dass es funktioniert, aber einige Datensätze enthalten zu viele Funktionen für eine umfassende Suche). Entschuldigung Fido!
Dikran Marsupial

@ DikranMarsupial Nun, ich kann Sie nur einladen, sie mit einigen meiner

2

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.


Würde es Ihnen etwas ausmachen, den Code zu veröffentlichen?
B_Miner

@B_Miner Entschuldigung für die Verzögerung, es ist eine Weile her, seit ich auf SO war. Es ist auch eine Weile her, dass ich mit diesem Problem in R zu kämpfen hatte. Ich habe meine alten Dateien durchgesehen und ich denke, der folgende Code hat es gelöst - hoffe, es hilft:added above
tfb

2
(Haftungsausschluss: IMHO-Genalgorithmen gehören zu den bösartigeren Optimierern für statistische Modelle. Sie nutzen die Varianz bei der Leistungsschätzung auf sehr schlechte Weise aus.) Also: Überprüfen Sie zumindest Ihr endgültiges Modell mit wirklich unabhängigen Testdaten!
cbeleites unglücklich mit SX
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.