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


R embed step_woe 證據權重變換


step_woe() 創建配方步驟的規範,該步驟將根據針對二進製結果的證據權重將名義數據轉換為其數值轉換。

用法

step_woe(
  recipe,
  ...,
  role = "predictor",
  outcome,
  trained = FALSE,
  dictionary = NULL,
  Laplace = 1e-06,
  prefix = "woe",
  keep_original_cols = FALSE,
  skip = FALSE,
  id = rand_id("woe")
)

參數

recipe

一個菜譜對象。該步驟將添加到此配方的操作序列中。

...

一個或多個選擇器函數用於選擇將使用哪些變量來計算組件。有關更多詳細信息,請參閱selections()。對於tidy 方法,當前未使用這些。

role

對於此步驟創建的模型項,應為它們分配什麽分析角色?默認情況下,該函數假設由原始變量創建的新 woe 分量列將用作模型中的預測變量。

outcome

vars() 中包含的二進製結果的裸名稱。

trained

指示預處理數量是否已估計的邏輯。

dictionary

一表格。等級和痛苦值的Map。它必須具有與 dictionary() 返回的輸出相同的布局。如果 `NULL`` 該函數將構建一個字典,並將這些變量傳遞給 ... 。有關詳細信息,請參閱dictionary()

Laplace

拉普拉斯平滑參數。通常用於避免來自隻有一個結果類別的預測變量類別的 -Inf/Inf 的值。設置為 0 以允許 Inf/-Inf。默認值為 1e-6。也稱為拉普拉斯平滑技術的 'pseudocount' 參數。

prefix

將作為結果新變量的前綴的字符串。請參閱下麵的注釋。

keep_original_cols

將原始變量保留在輸出中的邏輯。默認為 FALSE

skip

一個合乎邏輯的。當recipes::bake() 烘焙食譜時是否應該跳過此步驟?雖然所有操作都是在 recipes::prep() 運行時烘焙的,但某些操作可能無法對新數據進行(例如處理結果變量)。使用skip = TRUE時應小心,因為它可能會影響後續操作的計算

id

該步驟特有的字符串,用於標識它。

recipe 的更新版本,其中新步驟添加到現有步驟(如果有)的序列中。對於 tidy 方法,帶有 woe 字典的 tibble 用於將類別與 woe 值映射。

細節

WoE 是一組變量的轉換,可產生一組新的特征。公式為

woe_c = log((P(X = c|Y = 1))/(P(X = c|Y = 0)))

其中 從給定名義預測變量 的 1 到 級別。

這些組件旨在將名義變量轉換為數值變量,其順序和大小反映了與二元結果的關聯。要將其應用於數值預測變量,建議在運行 WoE 之前對變量進行離散化。在這裏,每個變量都將被二值化,以便稍後關聯災難。這可以通過使用 step_discretize() 來實現。

參數 Laplace 是添加到 1 和 0 比例的一個小量,目的是避免 log(p/0) 或 log(0/p) 結果。數字 woe 版本的名稱以 woe_ 開頭,後跟變量各自的原始名稱。參見《好》(1985)。

可以將自定義 dictionary tibble 傳遞給 step_woe() 。它必須具有與 dictionary() 的輸出相同的結構(參見示例)。如果未提供,它將自動創建。該 tibble 的作用是存儲名義預測變量級別與其 woe 值之間的映射。您可能想要調整此對象,以修複一個給定預測變量的級別之間的順序。一種簡單的方法是調整從 dictionary() 返回的輸出。

整理

當您 tidy() 這一步時,會出現一個包含列 terms (選擇的選擇器或變量) valuen_totn_badn_goodp_badp_goodwoe 和返回outcome。有關詳細信息,請參閱dictionary()

調整參數

此步驟有 1 個調整參數:

  • Laplace:拉普拉斯校正(類型:double,默認:1e-06)

箱重

底層操作不允許使用案例權重。

參考

庫爾貝克,S.(1959)。信息論和統計學。紐約威利。

Hastie, T.、Tibshirani, R. 和 Friedman, J. (1986)。統計學習的要素,第二版,Springer,2009 年。

Good, I. J. (1985),“證據權重:簡要調查”,貝葉斯統計,2,第 249-270 頁。

例子

library(modeldata)
data("credit_data")

set.seed(111)
in_training <- sample(1:nrow(credit_data), 2000)

credit_tr <- credit_data[in_training, ]
credit_te <- credit_data[-in_training, ]

rec <- recipe(Status ~ ., data = credit_tr) %>%
  step_woe(Job, Home, outcome = vars(Status))

woe_models <- prep(rec, training = credit_tr)
#> Warning: Some columns used by `step_woe()` have categories with less than 10 values: 'Home', 'Job'

# the encoding:
bake(woe_models, new_data = credit_te %>% slice(1:5), starts_with("woe"))
#> # A tibble: 5 × 2
#>   woe_Job woe_Home
#>     <dbl>    <dbl>
#> 1  -0.451   0.519 
#> 2   0.187  -0.512 
#> 3  -0.451  -0.512 
#> 4   0.187  -0.512 
#> 5   1.51   -0.0519
# the original data
credit_te %>%
  slice(1:5) %>%
  dplyr::select(Job, Home)
#>         Job    Home
#> 1     fixed    rent
#> 2 freelance   owner
#> 3     fixed   owner
#> 4 freelance   owner
#> 5   partime parents
# the details:
tidy(woe_models, number = 1)
#> # A tibble: 12 × 10
#>    terms value    n_tot n_bad n_good   p_bad  p_good     woe outcome id   
#>    <chr> <chr>    <int> <dbl>  <dbl>   <dbl>   <dbl>   <dbl> <chr>   <chr>
#>  1 Job   fixed     1261   273    988 0.451   0.708   -0.451  Status  woe_…
#>  2 Job   freelan…   463   159    304 0.263   0.218    0.187  Status  woe_…
#>  3 Job   others      74    39     35 0.0645  0.0251   0.944  Status  woe_…
#>  4 Job   partime    201   133     68 0.220   0.0487   1.51   Status  woe_…
#>  5 Job   NA           1     1      0 0.00165 0       14.7    Status  woe_…
#>  6 Home  ignore       8     4      4 0.00661 0.00287  0.835  Status  woe_…
#>  7 Home  other      161    78     83 0.129   0.0595   0.773  Status  woe_…
#>  8 Home  owner      931   192    739 0.317   0.530   -0.512  Status  woe_…
#>  9 Home  parents    336    98    238 0.162   0.171   -0.0519 Status  woe_…
#> 10 Home  priv       113    42     71 0.0694  0.0509   0.310  Status  woe_…
#> 11 Home  rent       446   188    258 0.311   0.185    0.519  Status  woe_…
#> 12 Home  NA           5     3      2 0.00496 0.00143  1.24   Status  woe_…

# Example of custom dictionary + tweaking
# custom dictionary
woe_dict_custom <- credit_tr %>% dictionary(Job, Home, outcome = "Status")
woe_dict_custom[4, "woe"] <- 1.23 # tweak

# passing custom dict to step_woe()
rec_custom <- recipe(Status ~ ., data = credit_tr) %>%
  step_woe(
    Job, Home,
    outcome = vars(Status), dictionary = woe_dict_custom
  ) %>%
  prep()
#> Warning: Some columns used by `step_woe()` have categories with less than 10 values: 'Home', 'Job'

rec_custom_baked <- bake(rec_custom, new_data = credit_te)
rec_custom_baked %>%
  dplyr::filter(woe_Job == 1.23) %>%
  head()
#> # A tibble: 6 × 14
#>   Seniority  Time   Age Marital Records Expenses Income Assets  Debt
#>       <int> <int> <int> <fct>   <fct>      <int>  <int>  <int> <int>
#> 1         0    48    41 married no            90     80      0     0
#> 2         0    18    21 single  yes           35     50      0     0
#> 3         0    36    23 single  no            45    122   2500     0
#> 4        14    24    51 married no            75    198   1000     0
#> 5         1    60    26 single  no            35    120      0     0
#> 6         1    36    24 married no            76    164      0     0
#> # ℹ 5 more variables: Amount <int>, Price <int>, Status <fct>,
#> #   woe_Job <dbl>, woe_Home <dbl>
源代碼:R/woe.R

相關用法


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