为何未指定随机森林(rf)时Caret仍使用该模型?
问题:Caret中未声明随机森林(rf),但mixedModel$method显示"rf"
我在使用Caret时声明了多个模型,其中并未包含随机森林(rf),但最终在mixedModel$method中却出现了"rf"方法。这是怎么回事?以下是我使用公开数据集编写的代码:
mix_dataset_tra<-rock TrainIndex <- createDataPartition(mix_dataset_tra$area, p=0.75, list= FALSE) train<-mix_dataset_tra[TrainIndex,] test<-mix_dataset_tra[-TrainIndex,] rm(TrainIndex) trc<- trainControl(method = "repeatedcv", number=10,repeats=3) AlgoritmList<-c("relaxo","lasso") mixedModel<-caret::train(area~., data=train, methodList=AlgoritmList, trControl=trc) mixedModel$method
原因分析
问题出在你用了一个不存在的参数methodList——caret::train()函数根本没有这个参数。当你传入未定义的参数时,Caret不会抛出错误,而是直接忽略该参数,转而使用默认的模型训练方法,也就是随机森林("rf"),这就是为什么最终结果里会出现它。
正确的多模型训练方式
要同时训练多个模型,你需要用以下两种方式之一:
- 循环逐个训练模型
# 初始化空列表存储模型 model_list <- list() AlgorithmList <- c("relaxo", "lasso") for (alg in AlgorithmList) { model_list[[alg]] <- caret::train(area~., data=train, method=alg, trControl=trc) } # 后续可以用resamples()比较模型性能 model_compare <- resamples(model_list) summary(model_compare)
- 使用
trainList参数传入预配置模型
如果你需要更精细的参数控制,可以先构建每个模型的训练配置,再传入trainList:
# 构建每个模型的训练对象 relaxo_model <- caret::train(area~., data=train, method="relaxo", trControl=trc) lasso_model <- caret::train(area~., data=train, method="lasso", trControl=trc) # 合并为列表传入 train_list <- list(relaxo = relaxo_model, lasso = lasso_model) model_compare <- resamples(train_list)
另外注意:你的变量名AlgoritmList拼写有误(正确应为AlgorithmList),不过这不是导致当前问题的直接原因。
内容的提问来源于stack exchange,提问作者Gaetano C.
相关产品推荐
相关产品推荐

