我的问题是,当数据量很大时,这种正确的特征选择方法是什么?
简单地说,没有。
基于 p 值的特征选择是一个坏主意,尤其是当数据很大时。首先,p 值无法告诉您变量的影响。我总是可以构建一个具有高度显着特征的模型,但它在您选择的任何分类指标方面的表现几乎可以忽略不计。这是因为显着影响可能非常小。
当数据很大时,null 本质上是一个稻草人。您拥有如此多的数据,以至于您可以检测到微小的影响,因为您拥有强大的能力来做到这一点。任何变量的影响永远不会完全为 0,而您正在发现这一点。
我的建议是使用一些有原则的建模方法。人们似乎喜欢 AIC(我不是其中之一),您可以进行前向特征选择(同样,不是我的那杯茶),您可以进行 lasso 或岭回归(我更热衷于此),或者坦率地说你什么都做不了(我的偏好来自你在帖子中所说的)。如果您有 12 个您知道很重要的变量,为什么不使用所有变量?这是一个反问。
简而言之,当您拥有如此多的数据时,推理就会失败。null 变成了稻草人,所以你几乎拒绝一切。人们对 p 值的痴迷导致他们将 p 值用于他们不打算用于的事物(模型选择)。您应该依靠通过验证集评估您关心的内容的方法或依靠您的业务知识。
编辑:
我声称即使 p 值很大,我也总是可以制作一个性能可以忽略不计的模型。这是使用线性回归的示例:
library(tidyverse)
library(Metrics)
set.seed(0)
X = rnorm(1000000)
Z = rnorm(1000000)
y = 2*X + 0.01*Z + rnorm(1000000, 0, 0.3)
d = tibble(X = X, Z = Z, y = y, set =
sample(c('test','train'), replace = T,
size = 1000000))
test = filter(d, set=='test')
train = filter(d, set=='train')
model1 = lm(y~X + Z, data = train)
model2 = lm(y~X, data= train)
rmse(test$y, predict(model1, newdata = test))
#> [1] 0.2996978
rmse(test$y, predict(model2, newdata = test))
#> [1] 0.2998523
由reprex 包(v2.0.1)于 2022 年 1 月 6 日创建
,两种模型的 rmse 最多允许小数点后 3 位。在我看来,这对所有意图和目的都有好处。请注意,Z 的系数非常重要(它给出了 R 可以给出的最小 p 值)。微小的影响大小和大量样本的结合是导致这种现象的原因。