Come eseguire la selezione delle variabili dell'algoritmo genetico in R per le variabili di input SVM?


9

Sto usando il pacchetto kernlab in R per creare un SVM per classificare alcuni dati.

SVM sta funzionando bene in quanto fornisce "previsioni" di un'accuratezza decente, tuttavia il mio elenco di variabili di input è più grande di quello che vorrei e non sono sicuro dell'importanza relativa delle diverse variabili.

Vorrei implementare un algoritmo genetico per selezionare il sottoinsieme di variabili di input che produce l'SVM meglio addestrato / più adatto.

Vorrei un aiuto per scegliere quale pacchetto R usare quando si tenta questa implementazione di GA (e possibilmente un breve esempio psuedo).

Ho cercato la maggior parte dei pacchetti R GA / P disponibili ( RGP , genalg , subselect , GALGO ), ma sto lottando concettualmente per vedere come passerei nella mia funzione ksvm come parte della funzione fitness e inserisco il mio array variabile come pool di popolazione ...?

Qualsiasi aiuto, pensiero o spintone nella giusta direzione ricevuto con gratitudine.

Grazie

codice che risolve questo aggiunto di seguito in una successiva EDIT

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

Risposte:


7

Il mio consiglio sarebbe di non farlo. I vantaggi teorici dell'SVM che evitano l'eccessivo adattamento si applicano solo alla determinazione dei moltiplicatori di lagrange (i parametri del modello). Non appena si inizia a eseguire la selezione delle funzionalità, tali vantaggi vengono sostanzialmente persi, poiché esiste poca teoria che copre la selezione del modello o la selezione delle funzionalità e si rischia molto di soddisfare troppo il criterio di selezione delle funzionalità, soprattutto se si esegue una ricerca molto difficile utilizzando un GA. Se la selezione della funzione è importante, utilizzerei qualcosa come LASSO, LARS o Rete elastica, in cui la selezione della funzione viene generata tramite riguarizzazione, in cui la selezione della funzione è più limitata, quindi vi sono meno gradi effettivi di libertà e meno sovra-adattamento.

Si noti che un vantaggio chiave di SVM è che è un'implementazione approssimativa di un limite di generalizzazione che è indipendente dalla dimensionalità dello spazio delle caratteristiche, il che suggerisce che forse la selezione delle caratteristiche non dovrebbe necessariamente prevedere di migliorare le prestazioni, e se c'è un defficienza nel processo di selezione (es. sovra-adattamento al criterio di selezione) potrebbe peggiorare le cose!


5
+1 Un dolce cucciolo muore ogni volta che esegui la selezione di funzionalità con algoritmi genetici.

@mbq LOL! (apparentemente dovevo digitare almeno altri sei personaggi di quanti ne volessi davvero.)
Dikran Marsupial

1
@mbq cuccioli E gattini sembrerebbe, se i miei risultati sono qualcosa da fare ...
tfb

@mbq Sto pianificando di selezionare alcune funzionalità con GA per un documento che sto scrivendo al momento (non mi aspetto che funzioni, ma alcuni set di dati hanno troppe funzionalità per una ricerca esaustiva). Scusa Fido!
Dikran Marsupial,

@DikranMarsupial Bene, posso solo invitarti a provare a pre-filtrarli con alcuni dei miei strumenti di legname (;

2

Alla fine ho finito per usare il pacchetto 'genalg' su R. Significa convertire il cromosoma vincente da un formato binario per rappresentare le variabili nei miei dati, ma questo è relativamente banale una volta eseguito GA. Fammi sapere se desideri ulteriori dettagli.


Ti dispiacerebbe pubblicare il codice?
B_Miner

@B_Miner scusate il ritardo, è da un po 'che non mi occupo di SO. È anche un po 'che non riesco a risolvere questo problema in R. Ho dato un'occhiata ai miei vecchi file e penso che il codice che lo ha risolto sia il seguente: spero che mi aiuti:added above
tfb

2
(Dichiarazione di non responsabilità: gli algoritmi genetici IMHO sono tra gli ottimizzatori più malvagi per i modelli statistici. Stanno sfruttando la varianza nella stima delle prestazioni in modo pessimo). Quindi: almeno controlla il tuo modello finale con dati di test veramente indipendenti!
cbeleites insoddisfatto di SX il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.