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

机器算法验证 r 机器学习 支持向量机 遗传算法
2022-03-04 16:23:59

我正在使用 R 中的kernlab包来构建一个 SVM 来对一些数据进行分类。

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

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

在尝试此 GA 实现时,我需要一些帮助来选择要使用的 R 包(可能还有一个简短的伪示例)。

我已经查看了大多数 R GA/P 包(RGPgenalgsubselectGALGO),但我在概念上正在努力了解如何将我的 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)
}
2个回答

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

请注意,SVM 的一个关键优势是它是与特征空间的维数无关的泛化边界的近似实现,这表明特征选择可能不一定会提高性能,并且如果存在选择过程中的不足(例如过度拟合选择标准)可能会使事情变得更糟!

最后,我最终在 R 上使用了“genalg”包。这意味着将获胜的染色体从二进制格式转换为表示我数据中的变量,但是一旦 GA 运行,这相对微不足道。如果您想了解更多详情,请告诉我。