Jak przeprowadzić selekcję zmiennych algorytmu genetycznego w R dla zmiennych wejściowych SVM?


9

Używam kernlab paczkę w R zbudować SVM klasyfikowania niektórych danych.

SVM działa dobrze, ponieważ zapewnia „przewidywania” przyzwoitej dokładności, jednak moja lista zmiennych wejściowych jest większa niż chciałbym i nie jestem pewien co do względnej ważności różnych zmiennych.

Chciałbym zaimplementować algorytm genetyczny, aby wybrać podzestaw zmiennych wejściowych, który tworzy najlepiej wyszkolony / najlepiej przystosowany SVM.

Chciałbym pomóc w wyborze pakietu R, który będzie używany podczas próby implementacji GA (i ewentualnie krótki przykład psuedo).

Szukałem większości dostępnych pakietów R GA / P ( RGP , genalg , subselect , GALGO ), ale staram się koncepcyjnie zobaczyć, jak mógłbym przekazać moją funkcję ksvm jako część funkcji fitness i wprowadzić mój tablica zmiennych jako pula populacji ...?

Każda pomoc, przemyślenia lub troski we właściwym kierunku z wdzięcznością otrzymane.

Dzięki

kod, który rozwiązuje ten problem dodany poniżej w późniejszej edycji

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

Odpowiedzi:


7

Radzę, aby tego nie robić. Teoretyczne zalety SVM, które pozwalają uniknąć nadmiernego dopasowania, dotyczą tylko wyznaczania mnożników lagrange (parametrów modelu). Jak tylko zaczniesz dokonywać wyboru funkcji, zalety te zostaną w zasadzie utracone, ponieważ niewiele jest teorii obejmującej wybór modelu lub wybór funkcji, i istnieje duże prawdopodobieństwo, że przesadzisz z kryterium wyboru funkcji, szczególnie jeśli naprawdę ciężko wyszukujesz za pomocą GA. Jeśli wybór funkcji jest ważny, użyłbym czegoś takiego jak LASSO, LARS lub elastyczna siatka, gdzie wybór funkcji powstaje w wyniku reguaryzacji, gdzie wybór funkcji jest bardziej ograniczony, więc jest mniej skutecznych stopni swobody i mniej nadmierne dopasowanie.

Należy zauważyć, że kluczową zaletą SVM jest to, że jest przybliżoną implementacją ograniczenia generalizacji, która jest niezależna od wymiarów przestrzeni cech, co sugeruje, że wybór funkcji może niekoniecznie poprawić wydajność, a jeśli istnieje niedobór w procesie selekcji (np. przeregulowanie kryterium selekcji) może pogorszyć sytuację!


5
+1 Słodki szczeniak umiera za każdym razem, gdy dokonujesz wyboru funkcji za pomocą algorytmów genetycznych.

@mbq LOL! (najwyraźniej musiałem wpisać co najmniej sześć więcej znaków, niż naprawdę chciałem.)
Dikran Marsupial

1
@mbq szczeniaki ORAZ kocięta by się pojawiły, gdyby moje wyniki były czymś innym ...
tfb

@mbq Planuję dokonać wyboru funkcji za pomocą GA dla artykułu, który piszę w tej chwili (nie spodziewając się, że zadziała, ale niektóre zestawy danych mają zbyt wiele funkcji do wyczerpującego wyszukiwania). Przepraszam Fido!
Dikran Marsupial

@DikranMarsupial Cóż, mogę tylko zaprosić Cię do wypróbowania ich wstępnego filtrowania za pomocą niektórych moich narzędzi do drewna (;

2

W końcu ostatecznie użyłem pakietu „genalg” na R. Oznacza to konwersję zwycięskiego chromosomu z formatu binarnego do reprezentowania zmiennych w moich danych, ale jest to stosunkowo trywialne po uruchomieniu GA. Daj mi znać, jeśli chcesz uzyskać dodatkowe informacje.


Czy mógłbyś opublikować kod?
B_Miner

@B_Miner przepraszam za opóźnienie, minęło trochę czasu, odkąd jestem na SO. Minęło trochę czasu, odkąd zmagałem się z tym problemem w R. Przejrzałem moje stare pliki i myślę, że poniżej był kod, który go rozwiązał - mam nadzieję, że to pomaga:added above
tfb

2
(Oświadczenie: algorytmy genetyczne IMHO należą do bardziej złych optymalizatorów modeli statystycznych. Wykorzystują wariancję w szacowaniu wydajności w bardzo zły sposób). Tak więc: przynajmniej sprawdź swój ostateczny model z prawdziwie niezależnymi danymi testowymi!
cbeleites niezadowoleni z SX
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.