Como executar a seleção de variáveis ​​do algoritmo genético em R para variáveis ​​de entrada SVM?


9

Estou usando o pacote kernlab no R para criar um SVM para classificar alguns dados.

O SVM está funcionando bem, pois fornece 'previsões' de uma precisão decente, no entanto, minha lista de variáveis ​​de entrada é maior do que eu gostaria e não tenho certeza quanto à importância relativa das diferentes variáveis.

Eu gostaria de implementar um algoritmo genético para selecionar o subconjunto de variáveis ​​de entrada que produz o SVM mais bem treinado / mais apto.

Gostaria de alguma ajuda para escolher qual pacote R usar ao tentar esta implementação do GA (e possivelmente um breve exemplo de psuedo).

Eu procurei a maioria dos pacotes R GA / P por aí ( RGP , genalg , subselect , GALGO ), mas estou lutando conceitualmente para ver como eu passaria na minha função ksvm como parte da função de fitness e inseri o meu matriz variável como o pool de população ...?

Qualquer ajuda, pensamentos ou cutucadas na direção certa, recebidas com gratidão.

obrigado

código que resolve isso adicionado abaixo em uma edição posterior

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

Respostas:


7

Meu conselho seria não fazer isso. As vantagens teóricas do SVM que evitam o excesso de ajuste se aplicam apenas à determinação dos multiplicadores de intervalo (os parâmetros do modelo). Assim que você começa a executar a seleção de recursos, essas vantagens são essencialmente perdidas, pois há pouca teoria que cubra a seleção de modelos ou a seleção de recursos, e é muito provável que você se ajuste demais ao critério de seleção de recursos, especialmente se você pesquisar muito GA. Se a seleção de recursos for importante, eu usaria algo como LASSO, LARS ou Elastic net, onde a seleção de recursos ocorre via reguarização, onde a seleção de recursos é mais restrita, para que haja menos graus efetivos de liberdade e menos ajuste.

Observe que uma das principais vantagens do SVM é que é uma implementação aproximada de um limite de generalização independente da dimensionalidade do espaço de recurso, o que sugere que talvez a seleção de recursos não deva necessariamente ser esperada para melhorar o desempenho e, se houver um insuficiência no processo de seleção (por exemplo, superajustando o critério de seleção), pode muito bem piorar as coisas!


5
+1 Um filhote de cachorro doce morre cada vez que você seleciona recursos com algoritmos genéticos.

@mbq LOL! (aparentemente eu precisava para escrever pelo menos mais seis caracteres do que eu realmente queria.)
Dikran Marsupial

11
@mbq cachorros e gatinhos ao que parece, se os meus resultados são qualquer coisa ir perto ...
TFB

@mbq Estou planejando fazer uma seleção de recursos com os GAs para um artigo que estou escrevendo no momento (sem esperar que funcione, mas alguns conjuntos de dados têm muitos recursos para uma pesquisa exaustiva). Desculpe Fido!
Dikran Marsupial

@DikranMarsupial Bem, só posso convidá-lo para tentar pré-filtrá-los com algumas das minhas ferramentas de madeira (;

2

No final, acabei usando o pacote 'genalg' em R. Isso significa converter o cromossomo vencedor de um formato binário para representar as variáveis ​​em meus dados, mas isso é relativamente trivial quando o GA é executado. Entre em contato se desejar mais detalhes.


Você se importaria de publicar o código?
B_Miner

@B_Miner desculpe pelo atraso, já faz um tempo desde que estive no SO. É também um tempo desde que eu estava lutando com este problema na R. Eu tinha um olhar através de meus arquivos antigos e acho que a seguir era o código que resolveu - espero que ajude:added above
TFB

2
(Aviso: os algoritmos genéticos da IMHO estão entre os otimizadores mais maléficos para os modelos estatísticos. Eles estão explorando de maneira muito ruim a variação na estimativa de desempenho). Portanto: pelo menos verifique seu modelo final com dados de teste verdadeiramente independentes!
cbeleites descontente com SX
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.