配方是對應用於數據集以便為數據分析做好準備的步驟的說明。
用法
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
-
step
或check
對象的列表,定義將應用於數據的預處理操作的序列。默認值為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
您還可以使用number
或id
參數來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 recipes recipes_pkg_check 更新包
- R recipes recipes_extension_check 檢查步驟是否具有所有 S3 方法
- R recipes recipes_eval_select 使用特定於食譜的 tidyselect 語義評估選擇
- R recipes roles 手動更改角色
- R recipes step_unknown 將缺失的類別分配給“未知”
- R recipes step_relu 應用(平滑)修正線性變換
- R recipes step_poly_bernstein 廣義伯恩斯坦多項式基
- R recipes step_impute_knn 通過 k 最近鄰進行插補
- R recipes step_impute_mean 使用平均值估算數值數據
- R recipes step_inverse 逆變換
- R recipes step_pls 偏最小二乘特征提取
- R recipes update.step 更新菜譜步驟
- R recipes step_ratio 比率變量創建
- R recipes step_geodist 兩個地點之間的距離
- R recipes step_nzv 近零方差濾波器
- R recipes step_nnmf 非負矩陣分解信號提取
- R recipes step_normalize 中心和比例數值數據
- R recipes step_depth 數據深度
- R recipes step_other 折疊一些分類級別
- R recipes step_harmonic 添加正弦和餘弦項以進行諧波分析
- R recipes step_corr 高相關濾波器
- R recipes step_novel 新因子水平的簡單賦值
- R recipes step_select 使用 dplyr 選擇變量
- R recipes formula.recipe 從準備好的食譜創建配方
- R recipes step_regex 檢測正則表達式
注:本文由純淨天空篩選整理自Max Kuhn等大神的英文原創作品 Create a recipe for preprocessing data。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。