我为 TidyTuesday 上的最新咖啡数据集整理了一个数据预处理方法。我的目的是生成一个工作流,然后从那里调整一个超参数。我对通过各种update_role()函数手动声明预测变量和结果特别感兴趣,而不是使用公式,因为我对这种类型的变量选择有一些很好的计划(这是一个非常好的主意!)。
下面的示例生成了一个与prep和一起工作的配方bake(coffee_test)。如果我取消选择结果列,它甚至可以工作,例如。coffee_recipe %>% bake(select(coffee_test, -cupper_points)). 但是,当我运行工作流程时tune_grid,出现如图所示的错误。看起来tune_grid找不到没有“预测者”角色的变量,即使bake做得很好。
现在,如果我改为使用公式和step_rm我不关心的变量以正常方式做事,那么事情大多会奏效——我会收到一些缺少country_of_origin值的行的警告,我觉得这很奇怪,因为我应该进行估算那些。我完全有可能误解了角色的目的以及如何使用它们。
library(tidyverse)
library(tidymodels)
#> ?? Attaching packages ????????????????????????????????????????????????????? tidymodels 0.1.1 ??
#> ? broom 0.7.0 ? recipes 0.1.13
#> ? dials 0.0.8 ? rsample 0.0.7
#> ? infer 0.5.3 ? tune 0.1.1
#> ? modeldata 0.0.2 ? workflows 0.1.2
#> ? parsnip 0.1.2 ? yardstick 0.0.7
#> ?? Conflicts ???????????????????????????????????????????????????????? tidymodels_conflicts() ??
#> x …Run Code Online (Sandbox Code Playgroud) 我想使用recipes包创建一个配方,该包既可以估算缺失的数据,又可以添加指示哪些值缺失的指标列。如果有一个选项可以选择为原始数据框中的每一列包含一个指标列,或者只包含原始数据框中缺少数据的列的指标列,那也很好。我知道我可以使用recipes轻松估算缺失值,但是是否有内置方法来添加缺失的指标列?
例如,如果我有一个这样的数据框:
> data.frame(x = c(1, NA, 3), y = 4:6)
x y
1 1 4
2 NA 5
3 3 6
Run Code Online (Sandbox Code Playgroud)
我希望插补和添加缺失的指标列后的输出看起来像这样:
x y x_missing
1 1 4 FALSE
2 2 5 TRUE
3 3 6 FALSE
Run Code Online (Sandbox Code Playgroud)
当然,对于这样的简单示例,我可以手动完成。但是在机器学习管道中处理大型数据集时,有一种自动化的方式来做到这一点会很有帮助。
根据 docs for recipes::check_missing,有一个columns论点,
列将(最终)由terms 参数填充的变量名称字符串。
但我不确定这意味着什么,因为没有terms论据check_missing.
作为参考,我正在寻找的功能由MissingIndicator类在scikit-learn 中实现。
我总是完成我的模型来拟合和预测,而不使用prep()、bake()或juice():
rec_wflow <-
workflow() %>%
add_model(lr_mod) %>%
add_recipe(rec)
data_fit <-
rec_wflow %>%
fit(data = train_data)
Run Code Online (Sandbox Code Playgroud)
这些 ( prep, bake, juice) 函数是否仅用于直观地检查数据的预处理结果,而不是拟合/训练过程所必需的?
R包“recipes”中的prep/bake/juice有什么区别?
上面的代码是我在官方教程中学习的。
我在另一篇博客中读到,如果使用train_data,就会产生数据泄漏。我想听听更多相关信息;这些功能是否与数据泄露有关?
我最近一直在使用 tidymodels 来运行模型并选择最能满足某些目标函数的参数。例如,对 mtcars 数据使用假设回归(使用此问题底部答案中的回归示例作为示例)
library(tidymodels)
library(tidyverse)
#some regression model
cars_recipe <- recipe(mpg ~ disp + drat, data = mtcars)
wf <- workflow() %>%
add_recipe(cars_recipe)
Run Code Online (Sandbox Code Playgroud)
(粗略地使用此博客文章中的语法进行比较;在此示例中,为了清晰起见,我没有执行诸如拆分测试/训练之类的各种步骤)
然后,我可以运行许多模型并从这些模型中获取指标(在这种情况下,针对某些弹性网络的各种惩罚)
#run over a parameter space and find metrics as an objective
mtcars_bootstrap <- bootstraps(mtcars)
tune_spec <- linear_reg(penalty = tune(), mixture = 1) %>%
set_engine("glmnet")
lambda_grid <- grid_regular(penalty(), levels = 50)
lasso_grid <- tune_grid(
wf %>% add_model(tune_spec),
resamples = mtcars_bootstrap,
grid = lambda_grid
)
Run Code Online (Sandbox Code Playgroud)
但是可以说我有充分的理由认为有两个单独的模型可以最好地捕捉对汽车的(例如)mpg 的影响,所以我创建了第二个模型作为配方
cars_recipe2 <- recipe(mpg ~ …Run Code Online (Sandbox Code Playgroud) 我想对 LASSO 算法执行惩罚选择并使用 预测结果tidymodels。我将使用波士顿住房数据集来说明这个问题。
library(tidymodels)
library(tidyverse)
library(mlbench)
data("BostonHousing")
dt <- BostonHousing
Run Code Online (Sandbox Code Playgroud)
我首先将数据集分成训练/测试子集。
dt_split <- initial_split(dt)
dt_train <- training(dt_split)
dt_test <- testing(dt_split)
Run Code Online (Sandbox Code Playgroud)
使用recipe包定义预处理。
rec <- recipe(medv ~ ., data = dt_train) %>%
step_center(all_predictors(), -all_nominal()) %>%
step_dummy(all_nominal()) %>%
prep()
Run Code Online (Sandbox Code Playgroud)
模型和工作流程的初始化。我用的是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)
Run Code Online (Sandbox Code Playgroud)
准备分层5折交叉验证和惩罚网格:
folds <- rsample::vfold_cv(dt_train, …Run Code Online (Sandbox Code Playgroud) 我有一个二元分类问题,并使用了随机森林和逻辑回归。根据 的结果conf_mat,collect_metrics()我collect_predictions想更改我的模型,仅当模型“确定”为 75% 或更高的概率时才分类为 TRUE。我只是不知道在哪里指定这个更改。如果有人能给我提示,那就太好了。我的直觉告诉我,它应该在模型规范的某个地方,例如这里的某个地方,但也许我错了。
canc_rf_model <- rand_forest(
mtry = tune(),
min_n = tune(),
trees = 500) %>%
set_engine("ranger") %>%
set_mode("classification")
canc_log_model <- logistic_reg() %>%
set_engine("glm") %>%
set_mode("classification")
Run Code Online (Sandbox Code Playgroud)
预先非常感谢您!M。
我有以下代码用于使用模型创建tidymodels工作流程lightgbm。但是,当我尝试保存到.rds对象并预测时出现了一些问题
library(AmesHousing)\nlibrary(treesnip)\nlibrary(lightgbm)\nlibrary(tidymodels)\ntidymodels_prefer()\n\n### Model ###\n\n# data\ndata <- make_ames() %>%\n janitor::clean_names()\n\ndata <- subset(data, select = c(sale_price, bedroom_abv_gr, bsmt_full_bath, bsmt_half_bath, enclosed_porch, fireplaces,\n full_bath, half_bath, kitchen_abv_gr, garage_area, garage_cars, gr_liv_area, lot_area,\n lot_frontage, year_built, year_remod_add, year_sold))\n\ndata$id <- c(1:nrow(data))\n\ndata <- data %>%\n mutate(id = as.character(id)) %>%\n select(id, everything())\n\n# model specification\n\nlgbm_model <- boost_tree(\n mtry = 7,\n trees = 347,\n min_n = 10,\n tree_depth = 12,\n learn_rate = 0.0106430579211173,\n loss_reduction = 0.000337948798058139,\n) %>%\n set_mode("regression") %>%\n set_engine("lightgbm", objective = "regression")\n\n# recipe and workflow\n\nlgbm_recipe …Run Code Online (Sandbox Code Playgroud) 我正在尝试观看Julia Silge MLOps视频,其中她使用 Vetiver 和 Tidymodels 部署到 AWS Sagemaker,但是在 AWS 上花费了数百美元的账单后:( 我已转向 GCP,因为他们提供 300 美元的免费积分。
我正处于尝试创建 docker 映像以推送到 GCP 的阶段,但是当我运行时:
docker run --env-file C:/Users/John/Documents/.Renviron --rm -p 8000:8000 penguins
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
我有点困惑,因为我已将 .Renviron 设置为包含服务帐户 json 文件,如下所示:
根据 VonC 的回复,我添加了/path/in/container“/documents/”
在下面的屏幕截图中,我可以看到该路径/in/container已被推送到图像:
由于我可以运行gcs_list_buckets(projectId = "my-project-id")并查看我创建的存储桶,因此看起来好像我已完全连接到我的云环境。
经过几天的研究,我似乎必须提供环境变量的完整路径才能启用身份验证,我是否遗漏了什么?
下面的代码工作正常,没有我所知的错误,但我想添加更多内容。
我想补充的两件事是:
1 - 模型根据训练数据对最终图的预测。我想在适合训练数据的模型上运行collect_predictions()。
2 - 用于查看模型在训练数据上的指标的代码。我想在适合训练数据的模型上运行collect_metrics()。
我如何获得这些信息?
# Setup
library(tidyverse)
library(tidymodels)
parks <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-06-22/parks.csv')
modeling_df <- parks %>%
select(pct_near_park_data, spend_per_resident_data, med_park_size_data) %>%
rename(nearness = "pct_near_park_data",
spending = "spend_per_resident_data",
acres = "med_park_size_data") %>%
mutate(nearness = (parse_number(nearness)/100)) %>%
mutate(spending = parse_number(spending))
# Start building models
set.seed(123)
park_split <- initial_split(modeling_df)
park_train <- training(park_split)
park_test <- testing(park_split)
tree_rec <- recipe(nearness ~., data = park_train)
tree_prep <- prep(tree_rec)
juiced <- juice(tree_prep)
tune_spec <- rand_forest(
mtry = tune(),
trees = 1000,
min_n = tune() …Run Code Online (Sandbox Code Playgroud) 我有以下使用 tidymodels\' agua包的脚本:
\nlibrary(tidymodels)\nlibrary(agua)\nlibrary(ggplot2)\ntheme_set(theme_bw())\nh2o_start()\n\ndata(concrete)\nset.seed(4595)\nconcrete_split <- initial_split(concrete, strata = compressive_strength)\nconcrete_train <- training(concrete_split)\nconcrete_test <- testing(concrete_split)\n\n# run for a maximum of 120 seconds\nauto_spec <-\n auto_ml() %>%\n set_engine("h2o", max_runtime_secs = 120, seed = 1) %>%\n set_mode("regression")\n\nnormalized_rec <-\n recipe(compressive_strength ~ ., data = concrete_train) %>%\n step_normalize(all_predictors())\n\nauto_wflow <-\n workflow() %>%\n add_model(auto_spec) %>%\n add_recipe(normalized_rec)\n\nauto_fit <- fit(auto_wflow, data = concrete_train)\nsaveRDS(auto_fit, file = "test.h2o.auto_fit.rds") #save the object\nh2o_end()\nRun Code Online (Sandbox Code Playgroud)\n在那里,我尝试将auto_fit对象保存到文件中。\n但是当我尝试检索它并使用它来预测测试数据时:
h2o_start()\nauto_fit <- readRDS("test.h2o.auto_fit.rds")\npredict(auto_fit, new_data = concrete_test)\nRun Code Online (Sandbox Code Playgroud)\n我收到一个错误:
\nError in `h2o_get_model()`:\n! Model id …Run Code Online (Sandbox Code Playgroud) r ×10
tidymodels ×10
r-recipes ×3
docker ×1
h2o ×1
lightgbm ×1
parsnip ×1
prediction ×1
regression ×1
save ×1
vetiver ×1