微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R tidymodels 配方接近零方差过滤器的数值属性

如何解决R tidymodels 配方接近零方差过滤器的数值属性

我在 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,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:有没有不提供公式就可以使用食谱的方法在这种情况下,公式是无稽之谈。

解决方法

对于初学者来说,是的,有一种方法可以在不提供公式的情况下使用食谱。为此,您只需将数据作为参数调用 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,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 年 1 月 7 日创建

预测变量 pred2 被移除,因为它的唯一值太少,而且它们几乎全为 0。预测变量 pred1 未被移除,因为它有许多唯一值。我想如果我想做您所描述的那种过滤,我会在数据清理/准备中进行,而不是在模型管道中的特征工程配方中进行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?