【问题标题】:R tidymodels recipes near zero variance filter for numeric attributesR tidymodels 配方接近数字属性的零方差过滤器
【发布时间】:2021-01-04 16:17:04
【问题描述】:

我在使用 R tidymodels 食谱中的 step_nzv 来过滤掉具有小方差但连续值的数字属性时遇到了麻烦。在我看来,该步骤仅适用于名义值,因为它计算唯一值的数量以及最常见与第二常见的比率。但是,我有一个属性,它几乎在任何地方都接近于零,从不为零。我是否必须先装箱(并且使用相同大小的垃圾箱进行离散化会改变一切)? 在下面的代码中,我有一个最小的例子。我希望两个列 low_variance_num 和 low_variance_nom 都被过滤掉,这不会发生:

library(tidymodels)

data <- tibble(num = seq(1000),rand = runif(1000)) %>% 
  mutate(low_variance_num = ifelse(num == 1, 1, rand/10000),
         low_variance_nom = ifelse(num == 1, 1, 0))

data
var(data$low_variance_num)
var(data$low_variance_nom)

recipe <- recipe(formula = num ~., data = data) %>% 
  update_role("num", new_role = "label") %>%
  step_nzv(all_predictors(), freq_cut = 995/5, unique_cut = 10) %>% # 5min bis hier
  prep()
summary(recipe)

P.S:有没有办法在不提供公式的情况下使用食谱?在这种情况下,公式是无稽之谈。

【问题讨论】:

    标签: r tidymodels r-recipes


    【解决方案1】:

    对于初学者,是的,有一种方法可以在不提供公式的情况下使用食谱。为此,您只需将数据作为参数调用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 没有被删除,因为它有许多唯一值。我想如果我想做你描述的那种过滤,我会在数据清理/准备中做,而不是在模型管道的特征工程配方中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2021-12-01
      • 2021-08-31
      • 1970-01-01
      • 2012-01-15
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多