如何在R中为SVM输入变量执行遗传算法变量选择?


9

我在R中使用kernlab软件包来构建SVM,以对某些数据进行分类。

SVM运行良好,因为它提供了不错的准确性的“预测”,但是我的输入变量列表比我想要的要大,而且我不确定不同变量的相对重要性。

我想实现一个遗传算法,以选择产生最佳训练/最适合的SVM的输入变量子集。

在尝试此GA实施时(可能是一个简短的psuedo示例),我想选择使用哪个R包时需要一些帮助。

我已经查看了大部分R GA / P软件包(RGPgenalgsubselectGALGO),但是我在概念上很难解决如何将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)
}

Answers:


7

我的建议是不要这样做。SVM避免过度拟合的理论优势仅适用于确定滞后距离乘数(模型的参数)。一旦开始执行特征选择,这些优势就基本上消失了,因为几乎没有涵盖模型选择或特征选择的理论,而且您极有可能过度拟合特征选择标准,尤其是如果您使用GA。如果特征选择很重要,我会使用LASSO,LARS或Elastic net之类的东西,其中特征选择是通过再担保而产生的,其中特征选择受到更多限制,因此有效自由度较小,过拟合也较少。

请注意,SVM的一个关键优势在于,它是概化范围的近似实现,它与特征空间的维数无关,这表明可能不必一定要期望选择特征来提高性能,并且如果存在选择过程的效率低下(例如,过度符合选择标准)可能会使情况变得更糟!


5
+1每次使用遗传算法进行特征选择时,一只甜蜜的小狗都会死亡。

@mbq哈哈!(显然,我需要输入的字符至少比我想要输入的字符多六个。)
Dikran Marsupial 2012年

1
@mbq幼犬和小猫,如果我的结果有待改善,它将出现……
tfb 2012年

@mbq我打算针对目前正在写的论文使用GA进行某些功能选择(并不期望它能起作用,但是某些数据集具有太多的功能,无法穷举搜索)。抱歉,菲多!
迪克兰有袋博物馆,2014年

@DikranMarsupial好吧,我只能邀请您尝试使用一些木材工具对它们进行预过滤(;

2

最后,我最终在R上使用了'genalg'软件包。这意味着将获胜的染色体从二进制格式转换为代表数据中的变量,但是一旦运行了GA,这相对来说就变得微不足道了。如果您需要其他详细信息,请告诉我。


您介意发布代码吗?
B_Miner

@B_Miner很抱歉延迟,自从我开始讲以来已经有一段时间了。自从我在R中解决此问题以来已有一段时间了。我已经浏览了我的旧文件,并且我认为以下是解决该问题的代码-希望对您added above
有所

2
(免责声明:恕我直言,遗传算法是统计模型中最邪恶的优化器之一。它们以非常糟糕的方式利用性能估计中的差异)。因此:至少要使用真正独立的测试数据来检查最终模型!
cbeleites对SX不满意,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.