gpt4 book ai didi

r - 调整 LASSO 模型并使用 tidymodels 进行预测

转载 作者:行者123 更新时间:2023-12-03 22:59:55 31 4
gpt4 key购买 nike

我想对 LASSO 算法执行惩罚选择并使用 tidymodels 预测结果.我将使用波士顿住房数据集来说明这个问题。

library(tidymodels)
library(tidyverse)
library(mlbench)

data("BostonHousing")

dt <- BostonHousing
我首先将数据集拆分为训练/测试子集。
dt_split <- initial_split(dt)
dt_train <- training(dt_split)
dt_test <- testing(dt_split)
使用 recipe 定义预处理包裹。
rec <- recipe(medv ~ ., data = dt_train) %>%
step_center(all_predictors(), -all_nominal()) %>%
step_dummy(all_nominal()) %>%
prep()
模型和工作流的初始化。我使用 glmnet引擎。 mixture = 1意味着我选择了 LASSO 惩罚和 penalty = tune()意味着我稍后将使用交叉验证来选择最佳惩罚参数 lambda .
lasso_mod <- linear_reg(mode = "regression",
penalty = tune(),
mixture = 1) %>%
set_engine("glmnet")

wf <- workflow() %>%
add_model(lasso_mod) %>%
add_recipe(rec)
准备分层 5 折交叉验证和惩罚网格:
folds <- rsample::vfold_cv(dt_train, v = 5, strata = medv, nbreaks = 5)
my_grid <- tibble(penalty = 10^seq(-2, -1, length.out = 10))
让我们运行交叉验证:
my_res <- wf %>% 
tune_grid(resamples = folds,
grid = my_grid,
control = control_grid(verbose = FALSE, save_pred = TRUE),
metrics = metric_set(rmse))
我现在能够从网格中获得最佳惩罚并更新我的工作流程以获得最佳惩罚:
best_mod <- my_res %>% select_best("rmse")
print(best_mod)

final_wf <- finalize_workflow(wf, best_mod)
print(final_wf)

== Workflow ===================================================================================================================
Preprocessor: Recipe
Model: linear_reg()

-- Preprocessor ---------------------------------------------------------------------------------------------------------------
2 Recipe Steps

* step_center()
* step_dummy()

-- Model ----------------------------------------------------------------------------------------------------------------------
Linear Regression Model Specification (regression)

Main Arguments:
penalty = 0.0278255940220712
mixture = 1

Computational engine: glmnet
到现在为止还挺好。现在我想将工作流程应用于训练数据以获得我的最终模型:
final_mod <- fit(final_wf, data = dt_train) %>%
pull_workflow_fit()
现在问题来了。 final_mod$fitelnetglmnet目的。它包含惩罚参数的 75 个值的网格上的完整正则化路径。因此,之前的惩罚调整步骤几乎没有用。所以预测步骤失败: predict(final_mod, new_data = dt)返回错误:
Error in cbind2(1, newx) %*% nbeta : 
invalid class 'NA' to dup_mMatrix_as_dgeMatrix
当然我可以用 glmnet::cv.glmnet得到最好的惩罚,然后使用方法 predict.cv.glmnet但我需要一个通用的工作流程,能够使用相同的界面处理多个机器学习模型。在 documentationparsnip::linear_reg有关于 glmnet 引擎的注释:

For glmnet models, the full regularization path is always fitregardless of the value given to penalty. Also, there is the option topass multiple values (or no values) to the penalty argument. Whenusing the predict() method in these cases, the return value depends onthe value of penalty. When using predict(), only a single value of thepenalty can be used. When predicting on multiple penalties, themulti_predict() function can be used. It returns a tibble with a listcolumn called .pred that contains a tibble with all of the penaltyresults.


但是,我不明白我应该如何使用 tidymodels 来获得调整后的 LASSO 模型的预测。框架。 multi_predict函数抛出与 predict 相同的错误.

最佳答案

你真的很接近让一切正常工作。
让我们读入数据,将其拆分为训练/测试并创建重采样折叠。

library(tidymodels)
library(tidyverse)
library(mlbench)

data("BostonHousing")

dt <- BostonHousing

dt_split <- initial_split(dt)
dt_train <- training(dt_split)
dt_test <- testing(dt_split)
folds <- vfold_cv(dt_train, v = 5, strata = medv, nbreaks = 5)
现在让我们创建一个预处理配方。 (请注意,如果您使用的是 prep(),则不需要 workflow() ;如果您的数据很大,这可能会变慢,所以最好不要这样做,直到 workflow() 稍后为您处理它.)
rec <- recipe(medv ~ ., data = dt_train) %>%
step_center(all_predictors(), -all_nominal()) %>%
step_dummy(all_nominal())
现在让我们制作我们的模型,将它与我们的配方放在一起 workflow() ,并使用网格调整工作流程。
lasso_mod <- linear_reg(mode = "regression",
penalty = tune(),
mixture = 1) %>%
set_engine("glmnet")

wf <- workflow() %>%
add_model(lasso_mod) %>%
add_recipe(rec)

my_grid <- tibble(penalty = 10^seq(-2, -1, length.out = 10))

my_res <- wf %>%
tune_grid(resamples = folds,
grid = my_grid,
control = control_grid(verbose = FALSE, save_pred = TRUE),
metrics = metric_set(rmse))
这是我们得到的最好的惩罚:
best_mod <- my_res %>% select_best("rmse")
best_mod
#> # A tibble: 1 x 2
#> penalty .config
#> <dbl> <chr>
#> 1 0.0215 Preprocessor1_Model04
在这里,我们做的事情与您所做的略有不同。我要去 敲定 我的工作流程有最好的惩罚,然后 适合 最终确定了训练数据的工作流程。这里的输出是 拟合工作流程 .我不想从中拉出底层模型,因为模型需要预处理才能正常工作;它接受了训练,期望进行预处理。
相反,我可以只是 predict()直接进入训练有素的工作流程:
final_fitted <- finalize_workflow(wf, best_mod) %>%
fit(data = dt_train)

predict(final_fitted, dt_train)
#> # A tibble: 379 x 1
#> .pred
#> <dbl>
#> 1 18.5
#> 2 24.2
#> 3 23.3
#> 4 21.6
#> 5 37.6
#> 6 21.5
#> 7 16.7
#> 8 15.6
#> 9 21.3
#> 10 21.3
#> # … with 369 more rows
predict(final_fitted, dt_test)
#> # A tibble: 127 x 1
#> .pred
#> <dbl>
#> 1 30.2
#> 2 25.1
#> 3 19.6
#> 4 17.0
#> 5 13.9
#> 6 15.4
#> 7 13.7
#> 8 20.8
#> 9 31.1
#> 10 21.3
#> # … with 117 more rows
创建于 2021-03-16 由 reprex package (v1.0.0)
如果您调整工作流,那么您通常希望最终确定、拟合和预测工作流。如果您在工作流程中使用非常简单的预处理器(例如可以传递给 fit() 的公式),则可能会出现异常(exception)情况。 ;我 show an example that you could do that with here .

关于r - 调整 LASSO 模型并使用 tidymodels 进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66639452/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com