- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码用于使用 lightgbm
模型创建 tidymodels
工作流。但是,当我尝试保存到 .rds
对象并进行预测时出现了一些问题
library(AmesHousing)
library(treesnip)
library(lightgbm)
library(tidymodels)
tidymodels_prefer()
### Model ###
# data
data <- make_ames() %>%
janitor::clean_names()
data <- subset(data, select = c(sale_price, bedroom_abv_gr, bsmt_full_bath, bsmt_half_bath, enclosed_porch, fireplaces,
full_bath, half_bath, kitchen_abv_gr, garage_area, garage_cars, gr_liv_area, lot_area,
lot_frontage, year_built, year_remod_add, year_sold))
data$id <- c(1:nrow(data))
data <- data %>%
mutate(id = as.character(id)) %>%
select(id, everything())
# model specification
lgbm_model <- boost_tree(
mtry = 7,
trees = 347,
min_n = 10,
tree_depth = 12,
learn_rate = 0.0106430579211173,
loss_reduction = 0.000337948798058139,
) %>%
set_mode("regression") %>%
set_engine("lightgbm", objective = "regression")
# recipe and workflow
lgbm_recipe <- recipe(sale_price ~., data = data) %>%
update_role(id, new_role = "ID") %>%
step_corr(all_predictors(), threshold = 0.7) %>%
prep()
lgbm_workflow <- workflow() %>%
add_recipe(lgbm_recipe) %>%
add_model(lgbm_model)
# fit workflow
fit_lgbm_workflow <- lgbm_workflow %>%
fit(data = data)
# predict
data_predict <- subset(data, select = -c(sale_price))
predict(fit_lgbm_workflow, new_data = data_predict)
### CASE 1: Save the workflow with SaveRDS()
saveRDS(object = fit_lgbm_workflow, file = "lgbm_workflow.rds")
new_lgbm_workflow <- readRDS(file = "lgbm_workflow.rds")
# Predict - error: Attempting to use a Booster which no longer exists
predict(new_lgbm_workflow, new_data = data_predict)
### CASE 2: Save the workflow and the fitted model separately
fitted_model <- (fit_lgbm_workflow %>% extract_fit_parsnip())$fit
saveRDS(object = fit_lgbm_workflow, file = "lgbm_workflow.rds")
lightgbm::saveRDS.lgb.Booster(object = fitted_model, file = "lgbm_model.rds")
new_lgbm_workflow <- readRDS(file = "lgbm_workflow.rds")
new_lgbm_model <- lightgbm::readRDS.lgb.Booster(file = "lgbm_model.rds")
new_lgbm_workflow$fit$fit <- new_lgbm_model
# Predict - error: cannot predict on data of class ‘tbl_df’‘tbl’‘data.frame’
predict(new_lgbm_workflow, new_data = data_predict)
只有 lightgbm
模型的工作流似乎有这个问题。对于其他类型的模型(随机森林、xgboost、glm 等),我可以使用 saveRDS()
保存拟合工作流,使用 readRDS()
读取,并使用预测新数据就好了
对于案例 2,显然底层预测函数将更改为 predict.lgb.Booster()
,它以 matrix
作为输入。但是我的 id 变量具有 character
格式,而 matrix
中的所有列必须具有相同的格式
有没有办法保存整个工作流程
以供将来使用?
最佳答案
经过大量挖掘,我在这个 closed issue 中找到了解决方案.
library(tidymodels)
#> Warning: package 'tidymodels' was built under R version 4.2.1
#> Warning: package 'broom' was built under R version 4.2.1
#> Warning: package 'scales' was built under R version 4.2.1
#> Warning: package 'infer' was built under R version 4.2.1
#> Warning: package 'modeldata' was built under R version 4.2.1
#> Warning: package 'parsnip' was built under R version 4.2.1
#> Warning: package 'rsample' was built under R version 4.2.1
#> Warning: package 'tibble' was built under R version 4.2.1
#> Warning: package 'workflows' was built under R version 4.2.1
#> Warning: package 'workflowsets' was built under R version 4.2.1
library(bonsai)
library(lightgbm)
#> Warning: package 'lightgbm' was built under R version 4.2.1
#> Loading required package: R6
#>
#> Attaching package: 'lightgbm'
#> The following object is masked from 'package:dplyr':
#>
#> slice
# data
data <- modeldata::ames %>%
janitor::clean_names()
data <- subset(data, select = c(sale_price, bedroom_abv_gr, bsmt_full_bath, bsmt_half_bath, enclosed_porch, fireplaces,
full_bath, half_bath, kitchen_abv_gr, garage_area, garage_cars, gr_liv_area, lot_area,
lot_frontage, year_built, year_remod_add, year_sold))
data$id <- c(1:nrow(data))
data <- data %>%
mutate(id = as.character(id)) %>%
select(id, everything())
# model specification
lgbm_model <- boost_tree(
mtry = 7,
trees = 347,
min_n = 10,
tree_depth = 12,
learn_rate = 0.0106430579211173,
loss_reduction = 0.000337948798058139,
) %>%
set_mode("regression") %>%
set_engine("lightgbm", objective = "regression")
# recipe and workflow
lgbm_recipe <- recipe(sale_price ~., data = data) %>%
update_role(id, new_role = "ID") %>%
step_corr(all_predictors(), threshold = 0.7)
lgbm_workflow <- workflow(preprocessor = lgbm_recipe,
spec = lgbm_model)
# fit workflow
fit_lgbm_workflow <- lgbm_workflow %>%
fit(data = data)
# predict
data_predict <- subset(data, select = -c(sale_price))
predict(fit_lgbm_workflow, new_data = data_predict)
#> # A tibble: 2,930 × 1
#> .pred
#> <dbl>
#> 1 201911.
#> 2 124695.
#> 3 138983.
#> 4 221095.
#> 5 198972.
#> 6 188613.
#> 7 198730.
#> 8 170893.
#> 9 243899.
#> 10 196875.
#> # … with 2,920 more rows
# save the trained workflow and lgb.booster object separately
saveRDS(fit_lgbm_workflow, "lgbm_wflw.rds")
saveRDS.lgb.Booster(extract_fit_engine(fit_lgbm_workflow), "lgbm_booster.rds")
# load trained workflow and merge it with lgb.booster
new_lgbm_wflow <- readRDS("lgbm_wflw.rds")
new_lgbm_wflow$fit$fit$fit <- readRDS.lgb.Booster("lgbm_booster.rds")
predict(new_lgbm_wflow, data_predict)
#> # A tibble: 2,930 × 1
#> .pred
#> <dbl>
#> 1 201911.
#> 2 124695.
#> 3 138983.
#> 4 221095.
#> 5 198972.
#> 6 188613.
#> 7 198730.
#> 8 170893.
#> 9 243899.
#> 10 196875.
#> # … with 2,920 more rows
创建于 2022-09-07 reprex v2.0.2
在我上面的 reprex 中,我使用了一个工作流来适应。如果您使用欧洲防风草对象来适应,请改用这种方法:
saveRDS(bonsai_fit, path1)
saveRDS.lgb.Booster(extract_fit_engine(bonsai_fit), path2)
bonsai_fit_read <- readRDS(path1)
bonsai_fit_engine_read <- readRDS.lgb.Booster(path2)
bonsai_fit_read$fit <- bonsai_fit_engine_read
引用this comment了解更多详情。
只想在此对话中补充一点,自 2021 年 12 月以来,{lightgbm} 的开发版本已支持直接对 {lightgbm} 模型使用 readsRDS()/saveRDS()
关于r - 如何保存 Tidymodels Lightgbm 模型以供重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72027360/
我有以下代码,我在其中对不同的 mtry 和 min_n 进行了一些网格搜索。我知道如何提取精度最高的参数(参见第二个代码框)。如何提取训练数据集中每个特征的重要性?我在网上找到的指南显示了如何使用“
我正在使用 tidymodels创建随机森林预测。我的测试数据包含训练数据中不存在的新因子水平,这会导致错误: 1: Novel levels found in column 'Siblings':
我最近一直在使用 tidymodels 来运行模型并选择最能满足某些目标函数的参数。例如对 mtcars 数据使用假设回归 ( using the regression examples from t
有没有办法在 tidy 模型中获取逻辑回归的标准误差和 p 值? 我可以通过下面的代码获得系数..但我想计算每个特征的优势比,我还需要标准误差.. glm.fit % set_engine(eng
数据集可以在这里找到: https://www.kaggle.com/mlg-ulb/creditcardfraud 我正在尝试使用 tidymodels 在此数据集上运行具有 5 折交叉验证的游侠。
通过 tidymodels 和 R 中的 vip 包,我计算了变量重要性。就代码而言,它看起来像这样: rf_vi_fit %>% pull_workflow_fit() %>% vip(geom =
我使用 tidymodels 在 R 中训练和测试了一个随机森林模型。现在我想使用相同的模型来预测一个全新的数据集(不是训练数据集)。 例如 Julia silge,在这篇博文中解释了训练、测试和评估
下面的代码工作正常,没有我所知道的错误,但我想添加更多内容。 我想补充的两件事是: 1 - 模型对训练数据对最终图的预测。我想在适合训练数据的模型上运行 collect_predictions()。
我尝试使用 tidymodels 来调整配方和模型参数的工作流程。调整单个工作流时没有问题。但是当使用多个工作流调整工作流集时,它总是失败。这是我的代码: # read the training da
我想使用 tidymodels 调整岭回归.我看过这个 nested sampling tutorial ,但不确定如何将调整从一个超参数增加到两个。请看下面的例子: 示例数据: library("m
我已经设法使用 tidymodels 构建了一个决策树模型。包,但我不确定如何提取结果并绘制树。我知道我可以使用 rpart和 rpart.plot包来实现同样的事情,但我宁愿使用 tidymodel
我想使用 recipes 创建一个食谱该软件包既可以估算缺失的数据,又可以添加指示哪些值缺失的指标列。如果有一个选项可以选择为原始数据框中的每一列包含一个指标列,或者只包含原始数据框中缺少数据的列的指
我真的很喜欢 tidymodels,但我不清楚我如何才能将该模型工作流适合嵌套分组依据之类的东西。例如,tidyr 在 mtcars 的圆柱体之类的东西上勾勒出一个简单的嵌套,然后为每个圆柱体拟合一个
我有以下代码用于使用 lightgbm 模型创建 tidymodels 工作流。但是,当我尝试保存到 .rds 对象并进行预测时出现了一些问题 library(AmesHousing) library
如何使用此 tidymodels 工作流程拟合模型? library(tidymodels) workflow() %>% add_model(linear_reg() %>% set_engin
我正在尝试对一个模型进行 k 折交叉验证,该模型根据卫星图像预测树种断面积比例的联合分布。这需要使用 DiricihletReg::DirichReg() 函数,这反过来又需要使用 Dirichlet
我可以在经典 Iris 数据集上应用 PCA 以获得每个维度的累积比例: library(tidyverse) x % as.matrix() pca % select(-Species) iris_
仍然习惯于 stackoverflow,所以如果发布不正确,我们深表歉意。 最近,我发现自己不得不运行许多预测变量略有不同的模型来衡量模型性能(我确信有一种更优雅的方法可以做到这一点),我正在考虑创建
我有一个二元分类问题,使用了随机森林和逻辑回归。根据 conf_mat、collect_metrics() 和 collect_predictions 的结果,我想更改我的模型,仅当模型“确定”时才分
我想对 LASSO 算法执行惩罚选择并使用 tidymodels 预测结果.我将使用波士顿住房数据集来说明这个问题。 library(tidymodels) library(tidyverse) li
我是一名优秀的程序员,十分优秀!