- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对 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$fit
是
elnet
和
glmnet
目的。它包含惩罚参数的 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
但我需要一个通用的工作流程,能够使用相同的界面处理多个机器学习模型。在
documentation的
parsnip::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/
我试图将 javascript 数组从 jquery ajax 调用传递到 lasso 脚本,但在尝试在 lasso 脚本中访问它时,它返回空记录。 我确信我在代码中遗漏了一些东西,但无法弄清楚它是什
我想创建一个模型来描述我的数据行为。我尝试了简单线性回归、简单多项式回归和正则化和交叉验证的多项式回归。 我发现最后一种方法允许自动特征选择(带度数),我实际上需要它,因为简单的线性回归表现不佳。我关
这是我的代码。当我运行它时,山脊很好,但是对于套索,我收到错误消息: ConvergenceWarning: Objective did not converge. You might want to
我有一个非常大的数据集,其中包含 100 多个系数和数千个条目。因此,我想使用 Lasso 方法进行模型训练。 我目前正在研究以下 sci-kit 文档: Lasso LassoCV 虽然实现看起来很
我想一次选择多个标记,并通过绘制套索来选择标记,然后选择套索区域旁边的标记,但实际上我不知道该怎么做,而且我没有找到任何包或教程这样做我想知道是否有人可以帮助我,即使只是告诉我逻辑而不是完整的代码。
我正在尝试使用 LASSO 确定我的特征在分类中的重要性。但是,我找不到任何关于这样做的引用或指南。我知道 LASSO 主要适用于回归,但是,有什么方法或指南可以解决吗? 如果没有办法,有没有其他类似
我正在寻找在 scikit-learn 的 Lasso/LassoCV 中添加交互项。如果是两个连续变量之间或两个分类变量之间的交互作用,我可以添加与交互中每个元素的乘法相对应的列。但是当我们在分类变
我有这个套索回归代码,当我打印 beta 系数时,我得到许多组 beta 值,而不仅仅是一组。我没有为 lambda 指定任何值,但当我这样做时,我只得到一组 beta 值。我知道如何找到 lambd
我正在 sklearn 中进行回归项目,我在其中对各种数字和分类变量使用了 LASSO 回归。使用 One-hot-encoder 方法转换分类变量。 由于一开始对特征矩阵进行了归一化处理,所以最终L
我目前使用 sklearn.linear_model 模块实现了 Ridge 和 Lasso 回归。 但是,套索回归在同一数据集上的效果似乎差了 3 个数量级! 我不确定哪里出了问题,因为从数学上讲,
我想用 lasso 在 python 中执行多元线性回归。我不确定输入观察矩阵 X 是否可以包含分类变量。我从这里阅读了说明:lasso in python 但它很简单,并没有指明允许的类型。例如,我
glmnet 中有没有办法进行一阶交互? 例如,如果我的 X 矩阵是: V1 V2 V3 0 1 0 1 0 1 1 0 0 ... 有没有办法指定它在不手动创建列的情况下按照 `y
我正在尝试在网页上实现这种功能: 通过拖动鼠标选择正方形区域 选取所选区域中的所有元素 处理它们 => 所以我基本上想创建类似“photoshop 方形选择工具”的东西,它可以获取所选区域中的所有 H
我有大约 22 个数据预测变量 x_i,我想减少到一定数量以便最好地描述 y。基本问题...但是,我很不清楚如何使用 scikit 和 Linearmodel.lassoLars 来执行此任务。 从他
我正在尝试弄清楚如何在使用 RobustScalar 和 Lasso 后取消缩放数据(大概使用 inverse_transform)以进行预测。下面的数据只是一个例子。我的实际数据更大、更复杂,但我希
我认为下面的 Lasso 问题有简单的解决方案 [1,2,0,0] 因为 np.dot(x, [1,2,0,0]) 返回 [[5,7,6,8]]。 clf = linear_model.Lasso(a
我目前正在高维情况下用scikit试验Lasso。标签是 Y_i(实数),特征是 X_i(X_i 是大小为 d=112 的向量)。我只有三对 (Y_i,X_i)。 d>>n=3 所以我们处于高维情况。
我很想在 statsmodels 中使用线性 LASSO 回归,以便能够使用“公式”符号来编写模型,这将在处理许多分类变量及其交互时节省我相当多的编码时间。但是,它似乎还没有在统计模型中实现? 最佳答
在我重新发明轮子之前...... 我正在用 C# 编写代码,因此需要一个 .NET 解决方案。我想处理一个灰度图像,它可以被分解成多个区域,这些区域可以被定义为具有较低和较高的颜色阈值(或“暗度”)—
我想获得 LASSO 回归的置信区间。为此,我使用了 selective inference R 中的包。 此包中的 fixedLassoInf 函数为给定的 lambda 值提供套索回归的置信区间。
我是一名优秀的程序员,十分优秀!