27  用parsnip创建模型

本章中,我们关注:

下一章 章节 28 中,我们将继续介绍如何将创建模型和预处理组合成一个工作流对象。
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.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_fit
parsnip 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
ames_test_small |> 
  select(Sale_Price) |> # 选取原始值
  bind_cols(predict(lm_fit, new_data = ames_test_small)) |> # 添加预测值
  bind_cols(predict(lm_fit, new_data = ames_test_small, type = "pred_int")) # 添加置信区间
# 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

  1. parsnip要求分类数据的结果变量必须为因子型数据。↩︎