Как правильно сохранить модель mlr3 lightgbm?

#lightgbm #mlr3

Вопрос:

У меня есть несколько следующих кодов. Я столкнулся с ошибкой при сохранении обученной модели. Это только ошибка, когда я использую lightgbm .

 library(mlr3)
library(mlr3pipelines)
library(mlr3extralearners)

data = tsk("german_credit")$data()
data = data[, c("credit_risk", "amount", "purpose", "age")]
task = TaskClassif$new("boston", backend = data, target = "credit_risk")

g = po("imputemedian") %>>%
  po("imputeoor") %>>%
  po("fixfactors") %>>%
  po("encodeimpact") %>>% 
  lrn("classif.lightgbm")

gl = GraphLearner$new(g)

gl$train(task)

# predict 
newdata <- data[1,]
gl$predict_newdata(newdata) 
saveRDS(gl, "gl.rds")
 
 # read model from disk ----------------
gl <- readRDS("gl.rds")
newdata <- data[1,]

# error when predict ------------------
gl$predict_newdata(newdata)
 

Ответ №1:

lightgbm использует специальные функции для сохранения и чтения моделей. Вы должны извлечь модель перед сохранением и добавить ее в обучающий график после загрузки. Однако это может оказаться непрактичным для контрольных показателей. Мы займемся этим вопросом.

 library(mlr3)
library(mlr3pipelines)
library(mlr3extralearners)
library(lightgbm)

data = tsk("german_credit")$data()
data = data[, c("credit_risk", "amount", "purpose", "age")]
task = TaskClassif$new("boston", backend = data, target = "credit_risk")

g = po("imputemedian") %>>%
  po("imputeoor") %>>%
  po("fixfactors") %>>%
  po("encodeimpact") %>>% 
  lrn("classif.lightgbm")

gl = GraphLearner$new(g)

gl$train(task)

# save model
saveRDS.lgb.Booster(gl$model$classif.lightgbm$model, "model.rda")

# save graph learner
saveRDS(gl, "gl.rda")

# load model
model = readRDS.lgb.Booster("model.rda")

# load graph learner
gl = readRDS("gl.rda")

# add model to graph learner
gl$state$model$classif.lightgbm$model = model

# predict
newdata <- data[1,]
gl$predict_newdata(newdata)