當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R recipes recipe 創建預處理數據的配方


配方是對應用於數據集以便為數據分析做好準備的步驟的說明。

用法

recipe(x, ...)

# S3 method for default
recipe(x, ...)

# S3 method for data.frame
recipe(x, formula = NULL, ..., vars = NULL, roles = NULL)

# S3 method for formula
recipe(formula, data, ...)

# S3 method for matrix
recipe(x, ...)

參數

x, data

模板數據集的 DataFrame 或小標題(見下文)。

...

傳遞給其他方法或從其他方法傳遞的更多參數(當前未使用)。

formula

模型公式。這裏不應使用 in-line 函數(例如 log(x)x:y 等),並且不允許使用減號。這些類型的轉換應使用此包中的 step 函數來執行。允許使用點,就像簡單的多元結果項一樣(即不需要 cbind ;請參閱示例)。由於內存問題,模型公式可能不是具有多列的高維數據的最佳選擇。

vars

與將在任何上下文中使用的變量相對應的列名稱的字符串(見下文)

roles

說明變量將扮演的單個角色的字符串(與 vars 相同的長度)。該值可以是任何值,但常見角色是 "outcome""predictor""case_weight""ID"

recipe 和sub-objects 的對象:

var_info

包含原始數據集列信息的 tibble

term_info

包含數據集中當前術語集的小標題。這最初默認為 var_info 中包含的相同數據。

steps

stepcheck 對象的列表,定義將應用於數據的預處理操作的序列。默認值為NULL

template

數據的一小部分。它被初始化為與 data 參數中給出的數據相同,但在配方訓練後可能會有所不同。

細節

定義食譜

配方中的變量可以具有任何類型的作用,包括結果、預測變量、觀察 ID、案例權重、分層變量等。

recipe 對象可以通過多種方式創建。如果分析僅包含結果和預測變量,則創建分析的最簡單方法是使用不包含內聯函數(例如 log(x3))的公式(例如 y ~ x1 + x2 )(請參見下麵的第一個示例)。

或者,可以通過首先指定應使用數據集中的哪些變量,然後按順序定義它們的角色來創建 recipe 對象(請參閱最後一個示例)。當變量數量非常多時,這種替代方法是一個很好的選擇,因為公式方法是memory-inefficient,有很多變量。

有兩種不同類型的操作可以按順序添加到配方中。

  • 步驟可以包括縮放變量、創建虛擬變量或交互等操作。還可以指定計算上更複雜的操作,例如降維或插補。

  • 檢查是對數據進行特定測試的操作。當測試滿足時,數據將被返回,沒有問題或修改。否則,會拋出錯誤。

如果您已定義配方並希望查看其中包含哪些步驟,請對配方對象使用 tidy() 方法。

請注意,傳遞給 recipe() 的數據不必是將用於訓練步驟的完整數據(通過 prep() )。配方隻需要知道將使用的數據的名稱和類型。對於大型數據集,可以使用 head() 傳遞較小的數據集以節省時間和內存。

使用食譜

一旦定義了配方,就需要在應用於數據之前對其進行估計。大多數配方步驟都有必須計算或估計的特定數量。例如,step_normalize() 需要計算所選列的訓練集均值,而 step_dummy() 需要確定所選列的因子水平,以便生成適當的指標列。

配方最常見的兩個應用是建模和stand-alone預處理。如何估計配方取決於它的使用方式。

造型

使用配方進行建模的最佳方法是通過 workflows 包。這將模型和預處理器(例如菜譜)捆綁在一起,並為用戶提供了一種流暢的方式來訓練模型/菜譜並進行預測。

library(dplyr)
library(workflows)
library(recipes)
library(parsnip)

data(biomass, package = "modeldata")

# split data
biomass_tr <- biomass %>% filter(dataset == "Training")
biomass_te <- biomass %>% filter(dataset == "Testing")

# With only predictors and outcomes, use a formula:
rec <- recipe(HHV ~ carbon + hydrogen + oxygen + nitrogen + sulfur,
              data = biomass_tr)

# Now add preprocessing steps to the recipe:
sp_signed <- 
  rec %>%
  step_normalize(all_numeric_predictors()) %>%
  step_spatialsign(all_numeric_predictors())
sp_signed
## 

## -- Recipe ------------------------------------------------------------

## 

## -- Inputs

## Number of variables by role

## outcome:   1
## predictor: 5

## 

## -- Operations

## * Centering and scaling for: all_numeric_predictors()

## * Spatial sign on: all_numeric_predictors()

我們可以創建一個 parsnip 模型,然後使用該模型和配方構建工作流程:

linear_mod <- linear_reg()

linear_sp_sign_wflow <- 
  workflow() %>% 
  add_model(linear_mod) %>% 
  add_recipe(sp_signed)

linear_sp_sign_wflow
## == Workflow ==========================================================
## Preprocessor: Recipe
## Model: linear_reg()
## 
## -- Preprocessor ------------------------------------------------------
## 2 Recipe Steps
## 
## * step_normalize()
## * step_spatialsign()
## 
## -- Model -------------------------------------------------------------
## Linear Regression Model Specification (regression)
## 
## Computational engine: lm

為了估計預處理步驟,然後擬合線性模型,使用對 fit() 的單次調用:

linear_sp_sign_fit <- fit(linear_sp_sign_wflow, data = biomass_tr)

預測時,除了調用 predict() 之外,無需執行任何操作。這以與訓練集相同的方式預處理新數據,然後將數據提供給線性模型預測代碼:

predict(linear_sp_sign_fit, new_data = head(biomass_te))
## # A tibble: 6 x 1
##   .pred
##   <dbl>
## 1  18.1
## 2  17.9
## 3  17.2
## 4  18.8
## 5  19.6
## 6  14.6
Stand-alone食譜的使用

當使用配方生成數據以進行可視化或解決配方的任何問題時,可以使用一些函數來估計配方並將其手動應用到新數據。

定義配方後,prep() 函數可用於使用數據集(也稱為訓練數據)來估計操作所需的數量。 prep() 返回一個配方。

作為使用 PCA 的示例(可能是為了生成繪圖):

# Define the recipe
pca_rec <- 
  rec %>%
  step_normalize(all_numeric_predictors()) %>%
  step_pca(all_numeric_predictors())

現在估計歸一化統計數據和 PCA 負載:

pca_rec <- prep(pca_rec, training = biomass_tr)
pca_rec
## 

## -- Recipe ------------------------------------------------------------

## 

## -- Inputs

## Number of variables by role

## outcome:   1
## predictor: 5

## 

## -- Training information

## Training data contained 456 data points and no incomplete rows.

## 

## -- Operations

## * Centering and scaling for: carbon, hydrogen, oxygen, ... | Trained

## * PCA extraction with: carbon, hydrogen, oxygen, ... | Trained

請注意,估計的配方顯示了選擇器捕獲的實際列名稱。

您可以 tidy.recipe() 配方(無論是已準備還是未準備)來了解有關其組件的更多信息。

tidy(pca_rec)
## # A tibble: 2 x 6
##   number operation type      trained skip  id             
##    <int> <chr>     <chr>     <lgl>   <lgl> <chr>          
## 1      1 step      normalize TRUE    FALSE normalize_AeYA4
## 2      2 step      pca       TRUE    FALSE pca_Zn1yz

您還可以使用numberid 參數來tidy() 配方步驟。

要將準備好的配方應用於數據集,請使用 bake() 函數,其使用方式與 predict() 用於模型的方式相同。這將估計的步驟應用於任何數據集。

bake(pca_rec, head(biomass_te))
## # A tibble: 6 x 6
##     HHV    PC1    PC2     PC3     PC4     PC5
##   <dbl>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>
## 1  18.3 0.730  -0.412 -0.495   0.333   0.253 
## 2  17.6 0.617   1.41   0.118  -0.466   0.815 
## 3  17.2 0.761   1.10  -0.0550 -0.397   0.747 
## 4  18.9 0.0400  0.950  0.158   0.405  -0.143 
## 5  20.5 0.792  -0.732  0.204   0.465  -0.148 
## 6  18.5 0.433  -0.127 -0.354  -0.0168 -0.0888

一般來說,對於大多數應用程序,建議使用配方的工作流程接口。

例子


# formula example with single outcome:
data(biomass, package = "modeldata")

# split data
biomass_tr <- biomass[biomass$dataset == "Training", ]
biomass_te <- biomass[biomass$dataset == "Testing", ]

# With only predictors and outcomes, use a formula
rec <- recipe(
  HHV ~ carbon + hydrogen + oxygen + nitrogen + sulfur,
  data = biomass_tr
)

# Now add preprocessing steps to the recipe
sp_signed <- rec %>%
  step_normalize(all_numeric_predictors()) %>%
  step_spatialsign(all_numeric_predictors())
sp_signed
#> 
#> ── Recipe ────────────────────────────────────────────────────────────────
#> 
#> ── Inputs 
#> Number of variables by role
#> outcome:   1
#> predictor: 5
#> 
#> ── Operations 
#> • Centering and scaling for: all_numeric_predictors()
#> • Spatial sign on: all_numeric_predictors()

# ---------------------------------------------------------------------------
# formula multivariate example:
# no need for `cbind(carbon, hydrogen)` for left-hand side

multi_y <- recipe(carbon + hydrogen ~ oxygen + nitrogen + sulfur,
  data = biomass_tr
)
multi_y <- multi_y %>%
  step_center(all_numeric_predictors()) %>%
  step_scale(all_numeric_predictors())

# ---------------------------------------------------------------------------
# example using `update_role` instead of formula:
# best choice for high-dimensional data

rec <- recipe(biomass_tr) %>%
  update_role(carbon, hydrogen, oxygen, nitrogen, sulfur,
    new_role = "predictor"
  ) %>%
  update_role(HHV, new_role = "outcome") %>%
  update_role(sample, new_role = "id variable") %>%
  update_role(dataset, new_role = "splitting indicator")
rec
#> 
#> ── Recipe ────────────────────────────────────────────────────────────────
#> 
#> ── Inputs 
#> Number of variables by role
#> outcome:             1
#> predictor:           5
#> id variable:         1
#> splitting indicator: 1
源代碼:R/recipe.R

相關用法


注:本文由純淨天空篩選整理自Max Kuhn等大神的英文原創作品 Create a recipe for preprocessing data。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。