Как выполнить выбор переменных генетического алгоритма в R для входных переменных SVM?


9

Я использую пакет kernlab в R для создания SVM для классификации некоторых данных.

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

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

Мне нужна помощь в выборе пакета R для использования при реализации этой GA (и, возможно, краткий псевдо-пример).

Я выглядел большинство / P пакетов R GA там ( РГП , genalg , подвыборки , Galgo ), но я изо всех сил концептуально , чтобы увидеть , как я хотел бы передать в моей функции ksvm как часть функции пригодности и ввода моей переменный массив как совокупность населения ...?

С благодарностью принимается любая помощь, мысли или подталкивания в правильном направлении.

Спасибо

код, который решает это, добавлено ниже в более поздней редакции

# 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, позволяющие избежать переоснащения, применимы только к определению множителей лагранжа (параметров модели). Как только вы начинаете выполнять выбор функции, эти преимущества по существу теряются, поскольку существует небольшая теория, которая охватывает выбор модели или выбор функции, и вы, скорее всего, переопределите критерий выбора функции, особенно если вы действительно интенсивно выполняете поиск, используя калибр Если важен выбор объекта, я бы использовал что-то вроде LASSO, LARS или Elastic net, где выбор объекта возникает посредством регуляризации, где выбор объекта более ограничен, поэтому существует меньше эффективных степеней свободы и меньше перегонки.

Обратите внимание, что ключевым преимуществом SVM является то, что он является приблизительной реализацией границы обобщения, которая не зависит от размерности пространства объектов, что предполагает, что выбор объектов не обязательно должен улучшать производительность, и если есть Недостаток процесса выбора (например, чрезмерное соответствие критерию выбора) может усугубить ситуацию!


5
+1 Милый щенок умирает каждый раз, когда вы делаете выбор функции с помощью генетических алгоритмов.

@mbq LOL! (очевидно, мне нужно было набрать как минимум на шесть символов больше, чем мне бы хотелось.)
Дикран Marsupial

1
@mbq щенки и котята, если бы мои результаты были чем-то
интересным

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

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

2

В конце концов я использовал пакет genalg для R. Это означает преобразование выигрышной хромосомы из двоичного формата для представления переменных в моих данных, но это сравнительно тривиально после запуска GA. Дайте мне знать, если вы хотите получить более подробную информацию.


Не могли бы вы опубликовать код?
B_Miner

@B_Miner извините за задержку, я давно на SO. Прошло также много времени с тех пор, как я боролся с этой проблемой в R. Я просмотрел свои старые файлы, и я думаю, что ниже приведен код, который решил эту проблему - надеюсь, это поможет:added above
tfb

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