当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R workflows add_formula 将公式术语添加到工作流程


  • add_formula() 通过使用公式指定模型的项。

  • remove_formula() 删除公式以及使用公式进行预处理后可能创建的任何下游对象,例如术语。此外,如果模型已经拟合,则拟合将被删除。

  • update_formula() 首先删除公式,然后用新公式替换以前的公式。任何已经根据此公式拟合的模型都需要重新拟合。

用法

add_formula(x, formula, ..., blueprint = NULL)

remove_formula(x)

update_formula(x, formula, ..., blueprint = NULL)

参数

x

工作流程

formula

指定模型项的公式。建议不要在公式中进行预处理,而是在需要时使用配方。

...

不曾用过。

blueprint

用于微调预处理的安全帽蓝图。

如果使用 NULLhardhat::default_formula_blueprint() 并传递与工作流中存在的模型最相符的参数。

请注意,此处完成的预处理与底层模型可能完成的预处理是分开的。例如,如果指定了 indicators = "none" 的蓝图,hardhat 不会创建虚拟变量,但如果底层模型需要内部使用 stats::model.matrix() 的公式接口,则模型仍会将因子扩展为虚拟变量。

x ,使用新的或删除的公式预处理器进行更新。

细节

要适应工作流程,必须指定 add_formula()add_recipe()add_variables() 之一。

配方处理

请注意,对于不同的模型,add_formula() 的公式可能会以不同的方式处理,具体取决于所使用的防风草模型。例如,使用 Ranger 拟合的随机森林模型不会将任何因子预测变量转换为二元指示变量。这与 ranger::ranger() 的做法一致,但与 stats::model.matrix() 的做法不一致。

防风草模型的文档提供了有关如何为模型编码公式中给出的数据(如果它们与标准 model.matrix() 方法不同)的详细信息。我们的目标是与底层模型包的工作方式保持一致。

这个公式是如何使用的呢?

为了进行演示,下面的示例使用 lm() 来拟合模型。给 add_formula() 的公式用于创建模型矩阵,这就是通过 body_mass_g ~ . 的简单公式传递给 lm() 的内容:

library(parsnip)
library(workflows)
library(magrittr)
library(modeldata)
library(hardhat)

data(penguins)

lm_mod <- linear_reg() %>% 
  set_engine("lm")

lm_wflow <- workflow() %>% 
  add_model(lm_mod)

pre_encoded <- lm_wflow %>% 
  add_formula(body_mass_g ~ species + island + bill_depth_mm) %>% 
  fit(data = penguins)

pre_encoded_parsnip_fit <- pre_encoded %>% 
  extract_fit_parsnip()

pre_encoded_fit <- pre_encoded_parsnip_fit$fit

# The `lm()` formula is *not* the same as the `add_formula()` formula: 
pre_encoded_fit
## 
## Call:
## stats::lm(formula = ..y ~ ., data = data)
## 
## Coefficients:
##      (Intercept)  speciesChinstrap     speciesGentoo  
##        -1009.943             1.328          2236.865  
##      islandDream   islandTorgersen     bill_depth_mm  
##            9.221           -18.433           256.913

这可能会影响结果的分析方式。例如,为了获得顺序假设检验,需要测试每个单独的项:

anova(pre_encoded_fit)
## Analysis of Variance Table
## 
## Response: ..y
##                   Df    Sum Sq   Mean Sq  F value Pr(>F)    
## speciesChinstrap   1  18642821  18642821 141.1482 <2e-16 ***
## speciesGentoo      1 128221393 128221393 970.7875 <2e-16 ***
## islandDream        1     13399     13399   0.1014 0.7503    
## islandTorgersen    1       255       255   0.0019 0.9650    
## bill_depth_mm      1  28051023  28051023 212.3794 <2e-16 ***
## Residuals        336  44378805    132080                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

覆盖默认编码

用户可以使用安全帽蓝图覆盖 model-specific 编码。蓝图可以指定因子的编码方式以及是否包含截距。例如,如果您使用公式并希望将数据不受影响地传递到模型:

minimal <- default_formula_blueprint(indicators = "none", intercept = FALSE)

un_encoded <- lm_wflow %>% 
  add_formula(
    body_mass_g ~ species + island + bill_depth_mm, 
    blueprint = minimal
  ) %>% 
  fit(data = penguins)

un_encoded_parsnip_fit <- un_encoded %>% 
  extract_fit_parsnip()

un_encoded_fit <- un_encoded_parsnip_fit$fit

un_encoded_fit
## 
## Call:
## stats::lm(formula = ..y ~ ., data = data)
## 
## Coefficients:
##      (Intercept)     bill_depth_mm  speciesChinstrap  
##        -1009.943           256.913             1.328  
##    speciesGentoo       islandDream   islandTorgersen  
##         2236.865             9.221           -18.433

虽然这看起来相同,但原始列被赋予lm(),并且该函数创建了虚拟变量。因此,顺序方差分析测试参数组以获得 column-level p 值:

anova(un_encoded_fit)
## Analysis of Variance Table
## 
## Response: ..y
##                Df    Sum Sq  Mean Sq F value Pr(>F)    
## bill_depth_mm   1  48840779 48840779 369.782 <2e-16 ***
## species         2 126067249 63033624 477.239 <2e-16 ***
## island          2     20864    10432   0.079 0.9241    
## Residuals     336  44378805   132080                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

覆盖默认模型公式

此外,传递给底层模型的公式也可以定制。在这种情况下,可以使用add_model()formula 参数。为了进行演示,将使用样条函数来表示钞票深度:

library(splines)

custom_formula <- workflow() %>%
  add_model(
    lm_mod, 
    formula = body_mass_g ~ species + island + ns(bill_depth_mm, 3)
  ) %>% 
  add_formula(
    body_mass_g ~ species + island + bill_depth_mm, 
    blueprint = minimal
  ) %>% 
  fit(data = penguins)

custom_parsnip_fit <- custom_formula %>% 
  extract_fit_parsnip()

custom_fit <- custom_parsnip_fit$fit

custom_fit
## 
## Call:
## stats::lm(formula = body_mass_g ~ species + island + ns(bill_depth_mm, 
##     3), data = data)
## 
## Coefficients:
##           (Intercept)       speciesChinstrap          speciesGentoo  
##              1959.090                  8.534               2352.137  
##           islandDream        islandTorgersen  ns(bill_depth_mm, 3)1  
##                 2.425                -12.002               1476.386  
## ns(bill_depth_mm, 3)2  ns(bill_depth_mm, 3)3  
##              3187.839               1686.996

改变公式

最后,当公式被更新或从拟合工作流程中删除时,相应的模型拟合也会被删除。

custom_formula_no_fit <- update_formula(custom_formula, body_mass_g ~ species)

try(extract_fit_parsnip(custom_formula_no_fit))
## Error in extract_fit_parsnip(custom_formula_no_fit) : 
##   Can't extract a model fit from an untrained workflow.
## i Do you need to call `fit()`?

例子

workflow <- workflow()
workflow <- add_formula(workflow, mpg ~ cyl)
workflow
#> ══ Workflow ══════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: None
#> 
#> ── Preprocessor ──────────────────────────────────────────────────────────
#> mpg ~ cyl

remove_formula(workflow)
#> ══ Workflow ══════════════════════════════════════════════════════════════
#> Preprocessor: None
#> Model: None

update_formula(workflow, mpg ~ disp)
#> ══ Workflow ══════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: None
#> 
#> ── Preprocessor ──────────────────────────────────────────────────────────
#> mpg ~ disp

相关用法


注:本文由纯净天空筛选整理自Davis Vaughan等大神的英文原创作品 Add formula terms to a workflow。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。