工作流:组合配方与模型
将预处理和模型打包到单个工作流对象中
工作流:组合配方与模型 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
什么是工作流?
工作流会将配方和模型规范打包成一个对象。这解决了一个关键问题:在交叉验证和最终拟合期间,必须将预处理步骤和建模步骤视为一个整体,否则归一化均值等参数可能会从测试折泄漏出来。
library(workflows)
# Start an empty workflow
wf <- workflow()
print(wf)
# Workflows have two slots: preprocessor and model
# Both must be filled before fittingadd_recipe() 和 add_model()
使用add_recipe(rec)添加配方预处理器,使用add_model(spec)添加 parsnip 模型规范。管道运算符可以让这种写法非常易读。
library(recipes)
library(parsnip)
library(workflows)
rec <- recipe(price ~ ., data = train) |>
step_impute_median(all_numeric_predictors()) |>
step_dummy(all_nominal_predictors()) |>
step_normalize(all_numeric_predictors())
spec <- linear_reg() |> set_engine('lm')
wf <- workflow() |>
add_recipe(rec) |>
add_model(spec)
print(wf)在工作流上使用 fit()
对工作流调用fit(wf, data = train)时,系统会自动使用训练数据对配方调用prep(),然后在预处理后的特征上训练模型。您无需手动调用prep()或bake()。
fitted_wf <- fit(wf, data = housing_train)
# The fitted workflow stores both the prepped recipe
# and the trained model
print(fitted_wf)在已拟合的工作流上使用 predict()
调用predict(fitted_wf, new_data = test)时,工作流会先使用已训练的配方自动对新数据应用bake(),然后生成预测结果。这样可以避免忘记对测试数据进行预处理。
# Predictions automatically preprocess the test data
preds <- predict(fitted_wf, new_data = housing_test)
head(preds)
# For classification
preds_prob <- predict(fitted_wf, new_data = test_df, type = 'prob')
preds_class <- predict(fitted_wf, new_data = test_df, type = 'class')last_fit() — 在全部训练数据上训练并在测试数据上评估
last_fit(wf, split)接收最终工作流和初始训练/测试划分对象。它会在训练部分拟合工作流,并在测试部分进行评估——这是调参完成后的标准最终模型评估步骤。
library(rsample)
split <- initial_split(housing_data, prop = 0.8, strata = price)
# Fit on training, evaluate on test
final_res <- last_fit(wf, split)
# View performance on the held-out test set
collect_metrics(final_res)extract_fit_parsnip()
extract_fit_parsnip(fitted_wf)会从已拟合的工作流中提取已训练的 parsnip 模型对象。随后您可以使用它检查系数、变量重要性,或将其传递给模型解释工具。
fitted_wf <- fit(wf, data = housing_train)
# Extract the parsnip model
parsnip_fit <- extract_fit_parsnip(fitted_wf)
# Now access the underlying model
tidy(parsnip_fit) # coefficients for lm
vip::vip(parsnip_fit) # variable importance plotextract_recipe()
extract_recipe(fitted_wf)会返回已拟合工作流中的已准备配方。这对于检查应用了哪些转换,或提取已训练的预处理步骤并独立应用于外部数据非常有用。
fitted_wf <- fit(wf, data = housing_train)
# Get the prepped recipe
prepped_rec <- extract_recipe(fitted_wf)
# Inspect normalization stats
tidy(prepped_rec, number = 3) # step_normalize details
# Apply recipe to completely new external data
new_baked <- bake(prepped_rec, new_data = brand_new_df)在工作流上使用 augment()
augment(fitted_wf, new_data)会返回追加了预测列的输入数据框。对于回归,它会添加.pred;对于分类,它会添加.pred_class以及每个类别对应的概率列。
fitted_wf <- fit(wf, data = housing_train)
# Append predictions to the test data frame
results <- augment(fitted_wf, new_data = housing_test)
# Now compute metrics directly
library(yardstick)
results |>
metrics(truth = price, estimate = .pred)更新工作流
您可以使用update_recipe()或update_model()更新工作流中的单个组件,而无需从头重新构建。在实验过程中,如果您想更换模型引擎但保留相同配方,这种方式非常方便。
# Original workflow with lm
wf_lm <- workflow() |>
add_recipe(rec) |>
add_model(linear_reg() |> set_engine('lm'))
# Swap model to random forest, keep same recipe
wf_rf <- update_model(
wf_lm,
rand_forest(trees = 300) |>
set_engine('ranger') |>
set_mode('regression')
)
fit_rf <- fit(wf_rf, data = housing_train)add_formula() 与 add_recipe()
如果您不需要配方,可以使用add_formula(outcome ~ .)作为预处理器。它只应用最少的转换(仅使用公式规范)。需要特征工程时使用add_recipe();构建快速基线模型时使用add_formula()。
# Simple baseline — no recipe needed
baseline_wf <- workflow() |>
add_formula(price ~ sqft + bedrooms + bathrooms) |>
add_model(linear_reg() |> set_engine('lm'))
baseline_fit <- fit(baseline_wf, data = housing_train)
baseline_preds <- predict(baseline_fit, new_data = housing_test)
# Compare RMSE to recipe-based model
yardstick::rmse_vec(housing_test$price, baseline_preds$.pred)用于比较的工作流集合
workflowsets程序包中的workflow_set()会创建一个工作流集合,将多个配方和模型规范组合起来。随后,您可以使用workflow_map()一次性调参与评估所有组合。
library(workflowsets)
all_workflows <- workflow_set(
preproc = list(basic = basic_rec, full = full_rec),
models = list(
lm = linear_reg() |> set_engine('lm'),
rf = rand_forest(trees = 200) |> set_engine('ranger') |> set_mode('regression')
)
)
# Fit all 4 combinations on resamples
results <- workflow_map(all_workflows, 'fit_resamples', resamples = cv_folds)
autoplot(results)快速检查
与手动拟合并进行预测相比,使用last_fit(workflow, split)的主要优势是什么?
工作流回顾
工作流:组合配方与模型的要点:
workflow() |> add_recipe(rec) |> add_model(spec)会将预处理和建模打包在一起。fit(wf, data = train)会在一次调用中准备配方并训练模型。predict(fitted_wf, new_data)会在预测前自动对新数据应用bake()。last_fit(wf, split)在训练数据上训练、在测试数据上评估——用于最终模型评估。extract_fit_parsnip()和extract_recipe()可以提取组件进行检查。augment()会将预测结果追加到数据框中,便于计算指标。workflow_set()可以同时比较多个配方和模型组合。
# Canonical tidymodels workflow pattern
split <- initial_split(data, prop = 0.8)
train <- training(split)
test <- testing(split)
rec <- recipe(y ~ ., data = train) |> step_normalize(all_numeric_predictors())
spec <- rand_forest(trees = 300) |> set_engine('ranger') |> set_mode('regression')
wf <- workflow() |> add_recipe(rec) |> add_model(spec)
final_res <- last_fit(wf, split)
collect_metrics(final_res)用 AI 导师学习 R — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 43
- 课程
- 159
常见问题解答
「工作流:组合配方与模型」课时是免费的吗?
是的 — 「工作流:组合配方与模型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「工作流:组合配方与模型」这节课中我会学到什么?
将预处理和模型打包到单个工作流对象中 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「工作流:组合配方与模型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。