对于初学者,是的,有一种方法可以在不提供公式的情况下使用食谱。为此,您只需将数据作为参数调用recipe(),然后通过update_role() 手动更新角色。当变量数量非常多时,这是推荐的方法,因为公式方法在变量众多时内存效率低。
接下来,我想澄清一下what we mean in tidymodels by "nominal":
名义变量包括字符和因子。
全 1 和 0 的数值变量不会在 tidymodels 中是名义变量(all_nominal() 等不会选择)。
接下来,我想指出,我认为step_nzv() 不会像您在这里所希望的那样做,因为您在不同意义上使用了“方差”一词。如果你check out the docs,它描述了我们在这里所说的接近零方差的意思:
例如,近零方差预测器的示例是,对于 1000 个样本,有两个不同的值,其中 999 个是单个值。
要被标记,首先,最常见值相对于第二常见值的频率(称为“频率比”)必须高于freq_cut。其次,“唯一值的百分比”,即唯一值的数量除以样本总数(乘以 100),也必须低于unique_cut。
您创建的示例low_variance_num 变量在此步骤中使用的定义并不是特别低的方差;它有很多独特的价值。
作为参考,这里有一个演示如何在没有公式的情况下构建配方:
library(recipes)
#> Loading required package: dplyr
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
#>
#> Attaching package: 'recipes'
#> The following object is masked from 'package:stats':
#>
#> step
df <- tibble(num = seq(1000), rand = runif(1000)) %>%
mutate(pred1 = ifelse(num == 1, 1, rand/10000),
pred2 = ifelse(num == 1, 1, 0))
rec <- recipe(df) %>%
update_role(num, new_role = "label") %>%
update_role(rand, pred1, pred2, new_role = "predictor") %>%
step_nzv(all_predictors())
rec %>% prep() %>% bake(new_data = NULL)
#> # A tibble: 1,000 x 3
#> num rand pred1
#> <int> <dbl> <dbl>
#> 1 1 0.842 1
#> 2 2 0.942 0.0000942
#> 3 3 0.977 0.0000977
#> 4 4 0.595 0.0000595
#> 5 5 0.259 0.0000259
#> 6 6 0.454 0.0000454
#> 7 7 0.550 0.0000550
#> 8 8 0.388 0.0000388
#> 9 9 0.702 0.0000702
#> 10 10 0.481 0.0000481
#> # … with 990 more rows
由reprex package (v0.3.0) 于 2021-01-07 创建
预测变量 pred2 已被删除,因为它的唯一值太少而且几乎全为 0。预测变量 pred1 没有被删除,因为它有许多唯一值。我想如果我想做你描述的那种过滤,我会在数据清理/准备中做,而不是在模型管道的特征工程配方中。