RStudio中SVM大样本参数调优卡顿,求解决方案或工具库
大样本SVM参数调优卡顿问题的解决方案
针对你用e1071包的tune.svm处理59000行训练集时卡顿的问题,本质是径向核SVM的网格搜索交叉验证计算量随样本量呈指数级增长,以下是几个实用的解决思路:
1. 精简调参配置,降低计算负荷
先缩小参数搜索范围、减少交叉验证折数,快速定位最优参数的大致区间:
set.seed(123) # 减少参数组合数量,将交叉验证折数从默认10降到3 tune_r = tune.svm(MH7A~., data=train, kernel="radial", cost = c(0.1, 1, 10), # 先跳过极端小值,锁定有效区间 gamma = c(0.01, 0.1), # 减少gamma测试数量 cross = 3) summary(tune_r)
2. 换用更高效的SVM实现库
e1071的SVM实现对大样本友好度一般,推荐以下两个高效替代方案:
kernlab包:优化了核函数计算效率,可手动结合网格搜索与交叉验证:library(kernlab) # 构建参数网格 param_grid = expand.grid(cost = c(0.1,1,10), gamma = c(0.01,0.1)) # 遍历参数组合计算交叉验证误差 results = lapply(1:nrow(param_grid), function(i){ model = ksvm(MH7A~., data=train, kernel="rbfdot", C=param_grid$cost[i], kpar=list(sigma=param_grid$gamma[i])) cv_error = crossval(model, data=train, folds=3) data.frame(cost=param_grid$cost[i], gamma=param_grid$gamma[i], error=cv_error@error) }) # 筛选最优参数 best_params = do.call(rbind, results)[which.min(do.call(rbind, results)$error),]caret包:支持并行计算,可调用kernlab作为后端,优化调参流程:library(caret) library(doParallel) # 启动并行计算,占用除1核外的所有CPU cl = makeCluster(detectCores()-1) registerDoParallel(cl) # 设置3折交叉验证 train_control = trainControl(method="cv", number=3) # 训练并调参 svm_model = train(MH7A~., data=train, method="svmRadial", trControl=train_control, tuneGrid=expand.grid(C=c(0.1,1,10), sigma=c(0.01,0.1))) # 关闭并行集群 stopCluster(cl) # 输出最优参数 print(svm_model$bestTune)
3. 抽样调参+全量训练
从训练集中抽取小样本做参数调优,找到最优参数后再用全量数据训练最终模型:
set.seed(123) # 抽取10%的训练样本用于调参 train_sample = train[sample(nrow(train), 5900), ] # 在小样本上完成全参数网格搜索 tune_r = tune.svm(MH7A~., data=train_sample, kernel="radial", cost = c(0.001,0.01,0.1,1,5,10), gamma = c(0.01,0.1,1,5), cross=5) # 用最优参数训练全量训练集 best_svm = svm(MH7A~., data=train, kernel="radial", cost=tune_r$best.parameters$cost, gamma=tune_r$best.parameters$gamma)
4. 特征降维减少输入维度
针对50列特征,先通过PCA降维压缩特征空间,再进行SVM调参:
# 对特征做PCA,保留95%的方差 pca = prcomp(train[, -which(colnames(train)=="MH7A")], scale.=TRUE) # 筛选累计方差占比95%的主成分 pca_dim = which(cumsum(pca$sdev^2/sum(pca$sdev^2))>=0.95)[1] pca_train = cbind(pca$x[,1:pca_dim], MH7A=train$MH7A) # 用降维后的数据调参 tune_r = tune.svm(MH7A~., data=pca_train, kernel="radial", cost=c(0.1,1,10), gamma=c(0.01,0.1), cross=3)
内容的提问来源于stack exchange,提问作者José Fernando Márquez
相关产品推荐
相关产品推荐

