R中使用caret包运行GBM报RMSE全缺失错误及RF调ntrees参数咨询
一、
gbm.fit 导出报错的解决 你观测到的全折RMSE为NA的提示,是所有交叉验证折的模型训练因函数接口兼容问题完全失败的连锁反应,并非训练数据本身存在缺失或格式问题,核心触发原因是新版本gbm包调整了内部函数的导出规则,与现有版本caret的调用逻辑不匹配,按以下方案处理即可:
- 优先升级两个包到当前最新稳定版:
执行install.packages(c("caret", "gbm")),新版caret已适配gbm新的函数导出结构,不再硬调用旧版本的非导出gbm.fit接口 - 升级后仍报错的场景,可安装与旧版caret完全兼容的gbm版本(2.1.8为最后一个保留
gbm.fit导出接口的稳定版),安装命令为remotes::install_version("gbm", version = "2.1.8") - 临时兼容方案(不调整现有包版本时使用):在调用caret训练代码前,手动将gbm内部的拟合函数暴露到包命名空间,代码为:
# 加载gbm包 library(gbm) # 将内部的gbm.fit函数挂到包导出列表 pkg_env <- as.environment("package:gbm") assign("gbm.fit", getFromNamespace("gbm.fit", "gbm"), pkg_env) - 兼容校验:执行
getModelInfo("gbm", regex = FALSE)$parameters,能正常输出n.trees、interaction.depth、shrinkage、n.minobsinnode四个默认调参参数时,说明接口已打通,不会再触发导出报错。
二、Caret 调用随机森林时纳入
ntrees参数调优的实现 caret内置的method = "rf"封装逻辑基于randomForest包,默认仅将mtry纳入交叉验证调优范围,ntree(即构建树的数量)默认作为固定透传参数,不参与自动调优。要实现两个参数联合调优,按以下步骤修改模型配置即可:
- 第一步:基于caret内置的rf模型配置,扩展可调参数列表
library(caret) # 获取原有rf的基础配置 rf_config <- getModelInfo("rf", regex = FALSE)[[1]] # 将ntree参数追加到原有的参数集合中(原集合仅包含mtry) rf_config$parameters <- rbind( rf_config$parameters, data.frame( parameter = "ntree", class = "numeric", label = "Number of Trees" ) ) - 第二步:重写模型拟合逻辑,将调优得到的
ntree值传入randomForest接口rf_config$fit <- function(x, y, wts, param, lev, last, classProbs, ...) { randomForest( x = x, y = y, mtry = param$mtry, ntree = param$ntree, # 透传调优得到的ntree值 ... ) } - 第三步:手动构建覆盖两个参数的调优网格
tune_grid <- expand.grid( mtry = c(2, 4, 6, 8), # 每次分裂时的候选特征数搜索范围 ntree = c(100, 500, 1000, 2000) # 树数量的搜索范围 ) - 第四步:训练时将自定义的配置对象传入method参数
caret::train( x = train_data_x, y = train_data_y, method = rf_config, # 替换原来的字符串"rf",传入自定义的带ntree调优的配置 trControl = fitControl, tuneGrid = tune_grid )
注:这种自定义模型配置的方式,不会修改caret内置的rf默认行为,仅影响当前训练调用的配置,也不会破坏其他模型的使用。
内容的提问来源于stack exchange,提问作者bhalla_17
相关产品推荐
相关产品推荐

