使用 parsnip 定义模型规格
独立于训练步骤指定模型类型和引擎
使用 parsnip 定义模型规格 是 CoddyKit 上的免费 R Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
什么是 parsnip?
parsnip 为数百种模型引擎提供统一接口。您无需学习每个程序包各自的语法(glm()、randomForest()、e1071::svm()),只需编写一个一致的模型规格,并告知 parsnip 在底层使用哪个引擎。
这意味着您可以通过更改一个参数来切换引擎——例如,从 glm 切换到 stan 来进行贝叶斯逻辑回归。
library(parsnip)
# The same interface, different engines
logistic_reg() |> set_engine('glm') # base R
logistic_reg() |> set_engine('glmnet') # regularized
logistic_reg() |> set_engine('stan') # Bayesian使用 logistic_reg() 进行分类
logistic_reg() 指定用于二元分类的逻辑回归模型。接着调用 set_engine('glm') 以使用 R 内置的 GLM 引擎,并调用 set_mode('classification') 明确声明任务类型。
对于同时支持两种任务的模型类型,必须指定模式('classification' 或 'regression')。
log_spec <- logistic_reg() |>
set_engine('glm') |>
set_mode('classification')
print(log_spec)
# Logistic Regression Model Specification (classification)
# Computational engine: glm使用 tune() 调整 rand_forest()
rand_forest() 指定随机森林。mtry(每次分裂使用的特征数量)和 trees 等参数可以固定,也可以设为 tune(),作为超参数搜索的占位符。
传入 tune() 后,tidymodels 会在交叉验证调优期间搜索一组参数值。
rf_spec <- rand_forest(
mtry = tune(),
trees = 500,
min_n = tune()
) |>
set_engine('ranger', importance = 'impurity') |>
set_mode('classification')
print(rf_spec)用于回归的 linear_reg()
linear_reg()用于指定线性回归模型。使用set_engine('lm')时采用普通最小二乘法,而使用set_engine('glmnet')则可通过惩罚和混合参数启用 L1/L2 正则化。
# OLS linear regression
lm_spec <- linear_reg() |>
set_engine('lm')
# Ridge regression (penalty > 0, mixture = 0)
ridge_spec <- linear_reg(penalty = 0.01, mixture = 0) |>
set_engine('glmnet')
# Lasso (penalty > 0, mixture = 1)
lasso_spec <- linear_reg(penalty = tune(), mixture = 1) |>
set_engine('glmnet')boost_tree() — 梯度提升
boost_tree()用于指定梯度提升树模型。您可以选择xgboost、lightgbm或C5.0引擎。可调参数包括tree_depth、learn_rate和loss_reduction。
xgb_spec <- boost_tree(
trees = 500,
tree_depth = tune(),
learn_rate = tune(),
loss_reduction = tune()
) |>
set_engine('xgboost') |>
set_mode('classification')
print(xgb_spec)fit() — 训练模型
fit(spec, formula, data)会在实际数据上训练模型规范。parsnip 会在内部将该规范转换为相应的引擎调用。结果是一个已拟合的 parsnip 模型对象。
lm_spec <- linear_reg() |> set_engine('lm')
# Fit the model on training data
lm_fit <- fit(lm_spec, mpg ~ wt + hp + cyl, data = mtcars)
# The fitted object wraps the engine result
print(lm_fit)
# Access the underlying lm object
extract_fit_engine(lm_fit)fit_xy() — 矩阵接口
fit_xy(spec, x, y)是fit(spec, formula, data)的替代方式。它直接接受预测变量矩阵x和响应向量y;当您的数据已经预处理为数值矩阵时,这种方式非常有用(神经网络或 XGBoost 中很常见)。
x_train <- train_baked |> select(-price)
y_train <- train_baked$price
lm_spec <- linear_reg() |> set_engine('lm')
# Matrix-style fit
lm_fit_xy <- fit_xy(lm_spec, x = x_train, y = y_train)
print(lm_fit_xy)translate() — 查看引擎代码
translate(spec)会准确显示 parsnip 针对指定引擎将在底层调用的内容。调试问题或了解 parsnip 规范如何映射到引擎原生接口时,这项功能非常有价值。
rf_spec <- rand_forest(mtry = 3, trees = 500) |>
set_engine('ranger') |>
set_mode('classification')
# See what ranger() call will be generated
translate(rf_spec)
# ranger::ranger(formula = ..., data = ...,
# num.trees = 500, mtry = 3, ...)在 parsnip 中使用 predict()
所有已拟合的 parsnip 模型都共享相同的predict()接口。在分类任务中,type = 'class'会返回预测类别,而type = 'prob'会返回各类别的概率。这种一致性是 parsnip 的主要优势之一。
log_fit <- fit(logistic_reg() |> set_engine('glm') |> set_mode('classification'),
species ~ ., data = train_df)
# Predicted classes
predict(log_fit, new_data = test_df, type = 'class')
# Predicted probabilities
predict(log_fit, new_data = test_df, type = 'prob')augment() — 将预测结果合并到数据中
augment(fitted_model, new_data)会直接将预测列追加到输入数据框中。这对于评估非常方便:结果会并排包含真实值和预测值,可以直接用于计算指标。
log_fit <- fit(
logistic_reg() |> set_engine('glm') |> set_mode('classification'),
species ~ ., data = train_df
)
# Get predictions joined to test data
results <- augment(log_fit, new_data = test_df)
head(results[, c('species', '.pred_class', '.pred_setosa')])比较模型规范
parsnip 的主要优点之一是可以快速比较模型。您可以定义多个规范,在相同数据上分别拟合,然后比较指标。由于接口完全一致,切换模型时只需修改规范定义。
specs <- list(
lm = linear_reg() |> set_engine('lm'),
ridge = linear_reg(penalty = 0.01, mixture = 0) |> set_engine('glmnet'),
rf = rand_forest(trees = 200) |> set_engine('ranger') |> set_mode('regression')
)
fits <- lapply(specs, fit, mpg ~ ., data = train_mtcars)
preds <- lapply(fits, predict, new_data = test_mtcars)
rmse_vals <- sapply(preds, function(p) {
sqrt(mean((p$.pred - test_mtcars$mpg)^2))
})
print(rmse_vals)快速检查
在 parsnip 中,translate(spec)会返回什么?
parsnip 回顾
使用 parsnip 定义模型规范的要点:
- parsnip 提供统一接口:分别指定模型类型、引擎和模式。
set_engine()选择底层程序包;set_mode()选择分类或回归。- 将
tune()用作占位符,以便稍后搜索超参数。 fit(spec, formula, data)训练模型;fit_xy(spec, x, y)接受矩阵。predict(fit, new_data, type)在所有引擎中都保持一致。translate(spec)显示引擎调用,便于调试。augment(fit, new_data)会将预测结果追加到数据框中。
# Parsnip model comparison template
spec <- rand_forest(trees = 500, mtry = tune()) |>
set_engine('ranger', importance = 'impurity') |>
set_mode('classification')
print(translate(spec))
# When mtry is fixed:
spec_fixed <- rand_forest(trees = 500, mtry = 5) |>
set_engine('ranger') |>
set_mode('classification')
fit_fixed <- fit(spec_fixed, label ~ ., data = train_df)常见问题解答
「使用 parsnip 定义模型规格」课时是免费的吗?
是的 — 「使用 parsnip 定义模型规格」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「使用 parsnip 定义模型规格」这节课中我会学到什么?
独立于训练步骤指定模型类型和引擎 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 parsnip 定义模型规格」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 recipes 进行特征工程
- 使用 parsnip 定义模型规格
- 工作流:组合配方与模型
- 使用 rsample 进行重抽样与交叉验证