在 R 中保存并加载 lightGBM 模型

Save and load a lightGBM model in R

提问人:Abner Mácola 提问时间:9/25/2023 最后编辑:UseR10085Abner Mácola 更新时间:9/27/2023 访问量:97

问:

我正在尝试保存并稍后加载 lightGBM 模型,但我无法做到。 我已经尝试过 saveRDS() 和 readRDS 函数,但是当我预测时,我收到此错误:

predictor$predict(data = data, start_iteration = start_iteration, : 尝试使用不再使用的助推器 存在。如果您调用了 Booster$finalize() 或如果 这个 Booster 是用 saveRDS() 保存的。要避免在 将来,请使用 saveRDS.lgb.Booster() 或 Booster$save_model() 来保存 lightgbm 助推器。

如果我在训练模型后立即使用该模型,或者在将模型加载到工作区的会话中使用该模型,则该模型工作正常。 问题是当我尝试在另一个应用程序上使用该模型时。这是我如何编码的:

library(tidymodels)
library(lightgbm)
library(bonsai)

TMA_model <- data.frame(
  age = c(50, 45, 60, 55, 70, 34, 55, 48, 58, 42,
          52, 47, 62, 57, 72, 36, 53, 49, 59, 44,
          51, 46, 61, 56, 71, 35, 54, 50, 60, 43), 
  delta_creat = c(1.2, 1.0, 1.5, 1.3, 1.8, 1.2, 1.3, 1.4, 1.1, 1.6,
                  1.2, 1.0, 1.5, 1.3, 1.8, 1.2, 1.3, 1.4, 1.1, 1.6,
                  1.2, 1.0, 1.5, 1.3, 1.8, 1.2, 1.3, 1.4, 1.1, 1.6), 
  max_LDH = c(300, 280, 320, 310, 330, 295, 325, 290, 315, 305,
              305, 315, 290, 320, 300, 325, 280, 330, 310, 295,
              310, 295, 330, 280, 320, 305, 310, 325, 315, 290), 
  min_plat = c(150, 140, 160, 155, 170, 145, 165, 150, 135, 160,
               160, 155, 170, 145, 150, 160, 140, 170, 155, 145,
               155, 145, 170, 140, 160, 150, 155, 160, 165, 135),
  min_hb = c(12, 11.5, 13, 12.5, 14, 11.8, 13.2, 12.2, 12.6, 11.9,
             12.4, 11.7, 13.1, 12.3, 13.5, 11.6, 12.8, 12.1, 13.4, 12.0,
             12.9, 11.6, 13.2, 12.8, 13.0, 11.5, 12.7, 12.3, 12.5, 11.8), 
  max_ast = c(40, 38, 42, 41, 45, 37, 43, 39, 44, 40,
              42, 38, 44, 41, 40, 39, 43, 38, 45, 37,
              44, 37, 42, 38, 41, 40, 43, 39, 44, 38), 
  max_bt = c(37, 37.2, 37.5, 37.3, 37.8, 37.1, 37.4, 37.6, 37.0, 37.7,
             37.2, 37.1, 37.5, 37.4, 37.3, 37.0, 37.6, 37.8, 37.2, 37.4,
             37.7, 37.1, 37.3, 37.8, 37.0, 37.4, 37.2, 37.6, 37.5, 37.1), 
  max_ttap = c(100, 95, 105, 102, 110, 97, 108, 93, 103, 98,
               105, 100, 95, 110, 102, 108, 97, 93, 103, 95,
               100, 97, 105, 93, 108, 102, 110, 98, 103, 100), 
  max_tp = c(12, 12.2, 12.5, 12.3, 12.8, 12.1, 12.4, 12.6, 12.0, 12.7,
             12.3, 12.2, 12.1, 12.8, 12.4, 12.0, 12.6, 12.7, 12.5, 12.3,
             12.1, 12.4, 12.7, 12.8, 12.0, 12.2, 12.3, 12.6, 12.5, 12.4), 
  hypertension = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 0,
                   1, 0, 1, 0, 1, 0, 0, 1, 1, 0,
                   0, 1, 0, 1, 0, 0, 1, 1, 0, 1),  
  MAP = c(90, 92, 88, 91, 89, 93, 87, 94, 86, 90,
          92, 94, 88, 90, 91, 89, 87, 93, 86, 92,
          91, 90, 93, 94, 86, 88, 89, 87, 92, 91),  
  TMA_class = factor(c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5,
                       1, 2, 3, 4, 5, 1, 2, 3, 4, 5,
                       1, 2, 3, 4, 5, 1, 2, 3, 4, 5))
)

new_data <- data.frame(
  age = c(48, 55, 62, 54, 67),  
  delta_creat = c(1.2, 1.3, 1.1, 1.4, 1.6),  
  max_LDH = c(305, 290, 320, 310, 295),  
  min_plat = c(150, 160, 135, 155, 145),  
  min_hb = c(12.2, 12.6, 11.9, 12.4, 11.7),  
  max_ast = c(38, 43, 39, 44, 40),  
  max_bt = c(37.2, 37.4, 37.0, 37.6, 37.1),  
  max_ttap = c(95, 108, 93, 103, 98),  
  max_tp = c(12.2, 12.4, 12.0, 12.6, 12.7),  
  hypertension = c(1, 0, 1, 0, 1),  
  MAP = c(92, 87, 94, 86, 90)  
)

model_spec <- 
  boost_tree(mode = 'classification',
             mtry = 6,  
             trees = 50, 
             min_n = 50,  
             tree_depth = 5) %>%
  set_engine('lightgbm')

recipe <- recipe(TMA_class ~ ., data = TMA_model)

model_fit <- workflow() %>%
  add_recipe(recipe) %>%
  add_model(model_spec) %>%
  fit(data = TMA_model)

saveRDS(model_fit, "model_fit.rds")
model_b <- readRDS("model_fit.rds")

new_data_predictions <- predict(model_b, new_data)

print(new_data_predictions)

我在保存或加载它时没有遇到任何错误,但我无法使用加载的模型进行预测。 此外,我对其他模型(例如套索或 xgboost)没有问题,它们工作正常,但 lightGBM 没有。

R xgboost LightGBM

评论

0赞 UseR10085 9/25/2023
您的代码不可重现。请访问如何制作出色的 R 可重现示例。以格式提供已用于数据的包。你也没有定义。dput()TMA_model
0赞 Abner Mácola 9/26/2023
使代码可重现,这有同样的问题。如果我使用“model_fit”来预测,它可以正常工作,但是如果我使用model_b(保存model_fit版本),它不起作用。

答:

1赞 UseR10085 9/26/2023 #1

您必须使用 的开发版本来保存和加载模型,并按照此处报告的 / 正常方式加载模型。但是安装开发版并不是那么简单。您必须按照以下步骤在 Windows 中安装lightgbmsaveRDS()readRDS()lightgbmlightgbm

使用 CMake 从源代码安装

您需要安装并首先形成 https://git-scm.com/downloadshttps://cmake.org/download/gitCMake

注意:此方法仅在 64 位系统上受支持。如果需要在 32 位 Windows (i386) 上运行 LightGBM,请按照“安装 CRAN 软件包”中的说明进行操作。

Windows 准备

注意:Windows 用户可能需要使用管理员权限(R 或命令提示符,具体取决于安装此软件包的方式)运行。

必须安装 64 位版本。 安装 和 后,请确保将以下路径添加到环境变量 PATH 中。RtoolsRtoolsCMake

• Rtools:如果您有 Rtools 4.3,示例:

C:\rtools43\mingw64\bin

C:\rtools43\usr\bin

• CMake 示例:

C:\Program Files\CMake\bin

• R 示例:

C:\Program Files\R\R-4.3.1\bin

安装 MSYS2 (R 4.x)

https://www.msys2.org/ 安装 MSYS2

安装 Pandoc

https://pandoc.org/installing.html 下载 Pandoc 并安装它

在 Windows 上,可以使用经典命令提示符或更现代的 PowerShell 终端。如果在桌面模式下使用 Windows,请从“开始”菜单运行 cmd 或 powershell 命令,并在使用 pandoc 之前键入,以将编码设置为 UTF-8。 让我们验证是否安装了 pandoc。类型chcp 65001

pandoc --version

并按回车键。您应该会看到一条消息,告诉您安装了哪个版本的 pandoc,并为您提供了一些其他信息。

使用 CMake 安装

对操作系统执行上述“准备”步骤后,在命令提示符下使用以下命令生成并安装 R 包,以管理员权限运行:

git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
Rscript build_r.R --use-msys2

之后,您的代码将运行,而不会出现任何错误。我花了一整天的时间才弄清楚如何安装开发版。lightgbm

评论

0赞 Abner Mácola 9/28/2023
我的朋友,对不起,我花了比预期更长的时间,但我终于完成了一切。我花了很多天试图解决这个问题,所以非常感谢!