mlr框架中无法识别classif.lightgbm学习者的解决求助
解决方案
问题根源
mlr核心包并未内置LightGBM的学习器实现,需要安装并加载专门的mlr扩展包mlrLightGBM,才能让makeLearner识别classif.lightgbm。
具体步骤
安装mlrLightGBM包
优先从CRAN安装:install.packages("mlrLightGBM")若CRAN版本不可用,从GitHub安装:
# 先确保安装devtools工具包 install.packages("devtools") devtools::install_github("Laurae2/mlrLightGBM")加载扩展包
在脚本顶部或函数代码开头添加:library(mlrLightGBM)
额外参数修正提示
你的代码存在参数使用错误:lgbm_param_grid是超参数调优的候选值列表,不能直接传入makeLearner的par.vals参数(par.vals仅用于设置固定参数)。若要实现超参数调优,需要用makeParamSet定义参数空间,结合makeTuneWrapper包装学习器,示例如下:
# 定义调参空间 lgbm_param_set <- makeParamSet( makeDiscreteParam("learning_rate", values = c(0.01, 0.05, 0.1, 0.5)), makeDiscreteParam("num_leaves", values = c(3, 5, 10, 20)), makeDiscreteParam("max_depth", values = c(-1, 5, 10)), makeDiscreteParam("bagging_fraction", values = c(0.5, 0.8, 1)), makeDiscreteParam("feature_fraction", values = c(0.5, 0.8, 1)) ) # 定义调参控制器 tune_control <- makeTuneControlRandom(maxit = 50) # 包装学习器用于调参 tuned_lgbm <- makeTuneWrapper(lgbm_learner, resampling = makeResampleDesc("CV", iters = 5), par.set = lgbm_param_set, control = tune_control)
修改后的完整代码示例
library(mlr) library(mlrLightGBM) library(randomForest) ensemble_learner <- function(data, n_models = 10, cpus = 32) { train <- data[[1]] test <- data[[2]] # 定义LightGBM固定参数 lgbm_fixed_params <- list(objective = "binary", boosting_type = "gbdt", verbose = FALSE, num.trees = 1000, early.stopping.rounds = 50, early.stopping.margin = 0.01, nthread = cpus) # 初始化LightGBM学习器 lgbm_learner <- makeLearner("classif.lightgbm", predict.type = "prob", fix.factors.prediction = TRUE, par.vals = lgbm_fixed_params) # 定义超参数调优空间 lgbm_param_set <- makeParamSet( makeDiscreteParam("learning_rate", values = c(0.01, 0.05, 0.1, 0.5)), makeDiscreteParam("num_leaves", values = c(3, 5, 10, 20)), makeDiscreteParam("max_depth", values = c(-1, 5, 10)), makeDiscreteParam("bagging_fraction", values = c(0.5, 0.8, 1)), makeDiscreteParam("feature_fraction", values = c(0.5, 0.8, 1)), makeDiscreteParam("alpha", values = c(0, 1, 3, 7)), makeDiscreteParam("lambda", values = c(0, 1, 3, 7)), makeDiscreteParam("gamma", values = c(0, 1, 3, 7)) ) # 包装学习器实现超参数调优 tuned_lgbm <- makeTuneWrapper(lgbm_learner, resampling = makeResampleDesc("CV", iters = 5), par.set = lgbm_param_set, control = makeTuneControlRandom(maxit = 30), show.info = FALSE) # 随机森林元学习器参数(排除目标变量CR) rf_params <- list(mtry = floor(sqrt(ncol(train) - 1)), importance = TRUE) parallelStartSocket(cpus = cpus) rf_learner <- makeLearner("classif.randomForest", predict.type = "prob", fix.factors.prediction = TRUE, verbose = FALSE, par.vals = rf_params) # 构建堆叠学习器 stack_learner <- makeStackedLearner(learners = list(tuned_lgbm), meta.learner = rf_learner, predict.type = "prob", fix.factors.prediction = TRUE, verbose = FALSE) # 训练堆叠模型 stacked_model <- train(stack_learner, task = makeClassifTask(data = train, target = "CR"), verbose = FALSE) parallelStop() return(stacked_model) }
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

