Як виконати вибір змінної генетичного алгоритму в R для вхідних змінних SVM?


9

Я використовую пакет kernlab в R, щоб створити SVM для класифікації деяких даних.

SVM добре працює в тому, що забезпечує «передбачення» пристойної точності, проте мій список змінних вхідних даних більший, ніж я хотів би, і я не впевнений у відносній важливості різних змінних.

Я хотів би реалізувати генетичний алгоритм для вибору підмножини вхідних змінних, що створює найкраще підготовлений / придатний SVM.

Мені хотілося б допомогти у виборі пакета R, який потрібно використовувати при спробі реалізації цієї програми GA (і, можливо, короткого прикладу psuedo).

Я переглянув більшість пакетів R GA / P там ( RGP , genalg , підселекція , GALGO ), але концептуально намагаюся зрозуміти, як я міг би передати свою функцію ksvm як частину функції фітнесу та ввести свій змінний масив як пул населення ...?

Будь-яка допомога, думки чи спонукання в потрібному напрямку вдячно отримані.

Дякую

код, який вирішує це, доданий нижче в подальшому 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)
}

Відповіді:


7

Моя порада була б цього не робити. Теоретичні переваги SVM, які уникають перенапруги, стосуються лише визначення множників лагранжу (параметрів моделі). Щойно ви починаєте виконувати вибір функції, ці переваги по суті втрачаються, оскільки існує мало теорії, яка б охоплювала вибір моделі чи вибір функцій, і ви, ймовірно, перевищуєте критерій вибору функції, особливо якщо ви шукаєте дуже важко за допомогою GA. Якщо вибір функції важливий, я б використав щось на кшталт LASSO, LARS або Elastic net, де вибір функцій відбувається за допомогою регуляризації, де вибір функцій обмежений, тому менше ефективних ступенів свободи і менше перенапруги.

Зауважимо, що ключовою перевагою SVM є те, що це наближена реалізація межі узагальнення, яка не залежить від розмірності простору ознак, що дозволяє припустити, що на вибір функції, можливо, не слід очікувати підвищення продуктивності, а якщо є дефіцитність вибору відбору (наприклад, перевиконання критерію відбору), це може погіршити ситуацію!


5
+1 Милий щеня помирає щоразу, коли ви робите вибір генетичними алгоритмами.

@mbq LOL! (мабуть, мені потрібно було набрати принаймні шість символів, ніж я дійсно хотів.)
Дікран Марсупіал

1
@mbq щенята та кошенята, як виявиться, якщо мої результати будуть що-небудь пройти ...
tfb

@mbq Я планую зробити деякий вибір функцій з GA для документа, про який я зараз пишу (не очікуючи, що він буде працювати, але деякі набори даних мають занадто багато функцій для вичерпного пошуку). Вибачте Фідо!
Дікран Марсупіал

@DikranMarsupial Ну, я можу запропонувати вам лише спробувати попередньо відфільтрувати їх за допомогою деяких моїх інструментів для деревини (;

2

Зрештою, я в кінцевому підсумку використовував пакет 'genalg' на R. Це означає перетворення виграшної хромосоми з бінарного формату для представлення змінних моїх даних, але це відносно тривіально, коли GA запуститься. Повідомте мене, якщо ви хочете отримати детальнішу інформацію.


Ви б не хотіли розмістити код?
B_Miner

@B_Miner вибачте за затримку, пройшов деякий час, так як я перебуваю на SO. Також минуло деякий час, оскільки я боровся з цією проблемою в Р. Я переглянув свої старі файли, і я думаю, що нижче був код, який вирішив її - сподіваюся, що це допомагає:added above
tfb

2
(Відмова: генетичні алгоритми ІМХО є одними з найбільш злих оптимізаторів для статистичних моделей. Вони дуже погано використовують відмінності в оцінці ефективності). Отже: принаймні перевіряйте остаточну модель із справді незалежними тестовими даними!
cbeleites незадоволений SX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.