R语言如何合并拆分数据集训练的两个RandomForest模型实现联合预测
问题描述
现有220万行记录的数据集,训练随机森林(RandomForest)模型时,训练集行数超过100万就会触发报错,因此将数据集拆分为两个子集分别训练模型,需要通过combine()方法合并两个子模型,融合二者的学习结果完成预测。
初始编写的实现代码如下:
rtask <- makeClassifTask(data=Originaldaten,target="geklaut") set.seed(1) ho = makeResampleInstance("CV",task=rtask, iters = 20) rtask.train = subsetTask(rtask, subset = 1:1000000) rtask.train2 = subsetTask(rtask, subset = 1000001:2000000) rtask.test = subsetTask(rtask, subset = 2000000:2227502) rlearn_lm <- makeWeightedClassesWrapper(makeLearner("classif.randomForest"), wcw.weight = 0.1209123724417812) param_lm <- makeParamSet( makeIntegerParam("ntree", 500, 500), makeLogicalParam("norm.votes", FALSE, FALSE), makeLogicalParam("importance", TRUE, TRUE), makeIntegerParam("maxnodes" ,4,4) ) tune_lm <- tuneParams(rlearn_lm, rtask.train, cv5, # 5折交叉验证 mmce, # 误差计算指标 param_lm, makeTuneControlGrid(resolution=5)) # 参数搜索范围 rlearn_lm <- setHyperPars(rlearn_lm,par.vals = tune_lm$x) model_lm <- train(rlearn_lm,rtask.train) model_lm2 <- train(rlearn_lm,rtask.train2) modelGesamt <- combine(model_lm$,model_lm2)
实现要点
- 初始代码的
combine()调用写法有误:mlr框架训练返回的是封装后的模型对象,randomForest::combine()仅支持传入原生randomForest类的模型对象,需要先用getLearnerModel()提取子模型内部的原生随机森林对象,再执行合并:# 提取mlr模型内嵌的原生随机森林对象 rf_model1 <- getLearnerModel(model_lm) rf_model2 <- getLearnerModel(model_lm2) # 合并两个子模型的所有决策树 combined_model <- randomForest::combine(rf_model1, rf_model2) - 手动按连续行号切分数据集容易造成训练集、测试集的样本分布偏移,甚至引入数据泄露问题,建议使用mlr内置的重采样方法完成数据集拆分。
补充参考代码
经调试可用的重采样拆分实现如下,供同类场景参考:
ho = makeResampleInstance("CV",task=rtask, iters = 20) rtask.train = subsetTask(rtask,ho$train.inds[[1]]) rtask.test = subsetTask(rtask,ho$test.inds[[1]] )
合并后的模型会整合两个子模型的全部决策树,预测时通过汇总所有树的投票结果输出最终预测值,效果等价于在全量数据集上训练得到的同参数随机森林。
内容的提问来源于stack exchange,提问作者user19338638
相关产品推荐
相关产品推荐

