在 Tidymodels 中指定组合的单热编码

Specifying One-hot Encoding on Combinations in Tidymodels

我有一个包含两列值和模式的数据集。值采用两个值 0 或 1 之一。模式列是一个三字符字符串。三字符字符串或模式源自 7 个字符(X、4、3、2、1、0、T)中的 1 个字符,这些字符可以重复,因此有 (7 x 7 x 7) = 343 种可能的模式。

我想使用 tidymodels 做一些分类建模,并计划在 Pattern 列上使用 one-hot encoding,但有以下问题:

  1. tidymodel 可以处理的列数是否有限制?
  2. 我如何处理数据集中未表示所有模式或测试数据集中的模式在训练数据集中找不到的情况。
  3. one-hot encoding 是去这里的最佳方式还是 tidymodels 提供了一种更适合我的用例的替代方法。
  1. {tidymodels} 本身对它可以处理的列数没有限制。您更有可能看到的瓶颈是防风草引擎无法处理许多列。 {tidymodels} 也会抱怨,如果您在应用单热编码的列中有太多级别,结果 data.frame 不适合您的 RAM。
  2. 只要您提供给 recipe() 的 data.frame 中的 Pattern 列是所有可能级别的一个因素,那么 step_dummy() 将确保所有级别将在训练数据集和测试数据集中创建。由于您知道 Pattern 可以采用的所有可能值,因此您应该在提供给 recipe().
  3. 的训练数据集中手动指定级别
library(tidymodels)

patterns <- c("X", "4", "3", "2", "1", "0", "T")
  
patern_constructor <- function(x) {
  paste(sample(patterns, size = 3, replace = FALSE, prob = seq_along(patterns)), 
      collapse = "")
}

all_patterns <- expand.grid(patterns, patterns, patterns) %>%
  tidyr::unite(pattern, sep = "") %>%
  pull(pattern)

data_patterns <- tibble(value = factor(sample(c(0,1), 10000, TRUE), c(0, 1)),
       pattern = factor(map_chr(seq_len(10000), patern_constructor), 
                        levels = all_patterns))

rec_patterns <- recipe(value ~ pattern, data = data_patterns) %>%
  step_dummy(pattern, one_hot = TRUE) %>%
  prep()

bake(rec_patterns, new_data = data_patterns)
#> # A tibble: 10,000 x 344
#>    value pattern_XXX pattern_X4XX pattern_X3XX pattern_X2XX pattern_X1XX
#>    <fct>       <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
#>  1 1               0            0            0            0            0
#>  2 0               0            0            0            0            0
#>  3 1               0            0            0            0            0
#>  4 1               0            0            0            0            0
#>  5 1               0            0            0            0            0
#>  6 0               0            0            0            0            0
#>  7 0               0            0            0            0            0
#>  8 1               0            0            0            0            0
#>  9 1               0            0            0            0            0
#> 10 1               0            0            0            0            0
#> # … with 9,990 more rows, and 338 more variables: pattern_X0XX <dbl>,
#> #   pattern_TXX <dbl>, pattern_X4X <dbl>, pattern_X44X <dbl>,
#> #   pattern_X34X <dbl>, pattern_X24X <dbl>, pattern_X14X <dbl>, …

bake(rec_patterns, new_data = tibble(value = factor(1), 
                                     pattern = factor("000")))
#> # A tibble: 1 x 344
#>   value pattern_XXX pattern_X4XX pattern_X3XX pattern_X2XX pattern_X1XX
#>   <fct>       <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
#> 1 1               0            0            0            0            0
#> # … with 338 more variables: pattern_X0XX <dbl>, pattern_TXX <dbl>,
#> #   pattern_X4X <dbl>, pattern_X44X <dbl>, pattern_X34X <dbl>,
#> #   pattern_X24X <dbl>, pattern_X14X <dbl>, pattern_X04X <dbl>, …

reprex package (v0.3.0)

于 2021-03-04 创建
  1. 这将取决于您在数据中看到的模式分布。您可能必须使用 step_zv() if the model you are using can't handle zero variance predictors. If you are having a highly skewed distribution you could use step_other() to collapse infrequent levels into one level. The embed package 删除未出现在训练数据中的模式,还包括一些将多个级别组合成较低级别的步骤 space。