library(tidymodels)
data(ames)
ames <- ames |>
mutate(Sale_Price = log10(Sale_Price))
set.seed(502)
ames_split <- initial_split(ames, prop = 0.8, strata = Sale_Price)
ames_train <- training(ames_split)
ames_test <- testing(ames_split)27 用parsnip创建模型
本章中,我们关注:
下一章 章节 28 中,我们将继续介绍如何将创建模型和预处理组合成一个工作流对象。
- 使用parsnip创建模型。
- 对
parsnip对象进行fit()和predict()。
27.1 创建模型
tidymodels为不同模型提供的统一的语法规则:
-
根据数据结构制定模型类型:parsnip不实现算法,只是提供统一的接口语法,使用相应的R包作为引擎(
engine)进行建模。 - 根据需求,指定模型的模式(`mode of model):部分模型在结果变量不同时,模式会有所不同,例如结果变量为数值型时,模式为回归,结果变量为分类型1时,模式为分类。
- 一旦设定好模型,就可以使用
fit()函数拟合模型。translate()函数可以展示parsnip如何将代码转换为对应包的代码。 -
parsnip将模型参数分为两类:
- 主要参数:常用参数,多数引擎都有的参数。
- 特有参数:某些引擎特有的参数,或不常用的参数。
parsnip_adding()函数可以打开一个可操作界面,方便用户通过鼠标点击生成创建模型的代码linear_reg() |>
set_engine("lm")Linear Regression Model Specification (regression)
Computational engine: lm
# 翻译parsnip代码
linear_reg() |>
set_engine("lm") |>
translate()Linear Regression Model Specification (regression)
Computational engine: lm
Model fit template:
stats::lm(formula = missing_arg(), data = missing_arg(), weights = missing_arg())
lm_model <- linear_reg() |>
set_engine("lm")
lm_fit <- lm_model |>
fit(Sale_Price ~ Longitude + Latitude, data = ames_train)
lm_fitparsnip model object
Call:
stats::lm(formula = Sale_Price ~ Longitude + Latitude, data = data)
Coefficients:
(Intercept) Longitude Latitude
-302.974 -2.075 2.710
27.2 提取模型结果
-
extract_fit_engine()函数可以提取拟合好的模型。 - 提取后,使用
summary()可以输出模型拟合的结果。但更推荐使用broom::tidy()函数来输出整洁的模型拟合结果。
model_res <- lm_fit |>
extract_fit_engine()
model_res
Call:
stats::lm(formula = Sale_Price ~ Longitude + Latitude, data = data)
Coefficients:
(Intercept) Longitude Latitude
-302.974 -2.075 2.710
# tidy model result
lm_fit |>
tidy()# A tibble: 3 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -303. 14.4 -21.0 3.64e-90
2 Longitude -2.07 0.129 -16.1 1.40e-55
3 Latitude 2.71 0.180 15.0 9.29e-49
27.3 进行预测
使用predict()函数进行预测:
ames_test_small <- ames_test |> slice(1:5)
predict(lm_fit, new_data = ames_test_small) # 仅输出预测值# A tibble: 5 × 1
.pred
<dbl>
1 5.22
2 5.21
3 5.28
4 5.27
5 5.28
# A tibble: 5 × 4
Sale_Price .pred .pred_lower .pred_upper
<dbl> <dbl> <dbl> <dbl>
1 5.02 5.22 4.91 5.54
2 5.39 5.21 4.90 5.53
3 5.28 5.28 4.97 5.60
4 5.28 5.27 4.96 5.59
5 5.28 5.28 4.97 5.60
parsnip要求分类数据的结果变量必须为因子型数据。↩︎