使用Caret同时调用多模型报错:模型不在内置库
问题
在经典Iris数据集上以Sepal.Length为目标变量,使用caret包同时训练多个模型时,出现以下错误及警告:
Error: Model gbm is not in caret's built-in libraryModel knn is not in caret's built-in libraryModel lm is not in caret's built-in libraryModel bstSm is not in caret's built-in libraryModel rf is not in caret's built-in library
警告信息:In model == names(models): longer object length is not a multiple of shorter object length
使用的代码如下:
mix_dataset_tra <-iris TrainIndex <- createDataPartition(mix_dataset_tra$Sepal.Length, p=0.75, list= FALSE) train <- mix_dataset_tra[TrainIndex,] test <-mix_dataset_tra[-TrainIndex,] trc <- trainControl(method = "repeatedcv", number=10,repeats=3) AlgoritmListReg <- c("gbm","knn","lm","bstSm","rf") mixedModel<- caret::train(Sepal.Length~., data=train, method=AlgoritmListReg, trControl=trc)
解决方法
核心问题
caret原生的train()函数不支持直接传入模型列表实现批量训练,必须借助caretEnsemble包中的caretList()函数完成。此外,模型列表中的bstSm为拼写错误,需修正为正确的模型名称。
具体修正步骤
- 安装并加载依赖包
部分模型需要额外的依赖库支持,先完成安装和加载:
install.packages(c("caret", "caretEnsemble", "gbm", "randomForest", "kknn", "smotefamily")) library(caret) library(caretEnsemble)
注:gbm对应梯度提升树包,randomForest对应随机森林包,kknn对应K近邻包,smotefamily是bstSmote的依赖。
- 修正模型列表
将错误的bstSm改为正确的模型名,这里以bstSmote为例(若实际需求为其他模型,需对应调整名称):
AlgoritmListReg <- c("gbm","knn","lm","bstSmote","rf")
- 使用
caretList()训练多模型
替换原代码中的train()函数,改用caretList()实现批量训练:
mixedModel <- caretList(Sepal.Length~., data=train, trControl=trc, methodList=AlgoritmListReg)
- (可选)模型集成
如果需要对训练好的多个模型进行集成,可使用caretEnsemble():
ensemble_model <- caretEnsemble(mixedModel) summary(ensemble_model)
内容的提问来源于stack exchange,提问作者Gaetano C.
相关产品推荐
相关产品推荐

