逻辑回归的特征选择

机器算法验证 回归 物流 特征选择 大数据
2022-04-13 15:04:18

我正在为一家在线电子商务公司运行客户流失预测模型。因为,数据量很大。我有大约(约 100 万客户)的历史数据。根据对市场的了解,我选择了 12 个连续变量作为特征。作为逻辑回归的第一步,我必须对逻辑回归中应考虑的所有特征进行特征选择。

我通过运行逻辑回归来做到这一点,只保留 1 个特征(因此,运行 12 个逻辑回归)。我的目标是选择 p 值 < 0.05 的特征。但是,对于所有 12 个特征,我得到的 p 值 < 0.00001,因此表明每个变量都很重要,我认为这不太可能。我用随机选择的 0.1M 数据点重新运行回归,即使我看到了相同的模式。

我的问题是,当数据量很大时,这种正确的特征选择方法是什么?

4个回答

我的问题是,当数据量很大时,这种正确的特征选择方法是什么?

简单地说,没有。

基于 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 值)。微小的影响大小和大量样本的结合是导致这种现象的原因。

从计算的角度来看,逻辑回归的 1M 数据点和 12 个特征都不算什么,即计算机可以在几秒钟内返回结果。

在 R 中试试这个例子,你会看到我们能适应多快。

d=data.frame(matrix(runif(1e6*12),ncol=12))
d$y=sample(c(0,1),1e6, replace = T)
fit = glm(y~.,d,family='binomial')

因此,如果您关心的是计算。没有必要进行特征选择。


另一方面,如果您进行特征选择,在大多数情况下,性能(分类精度)会更差。这是因为,直观地说,更多的信息不会造成伤害,即使特征与标签完全无关,算法也会将系数设置为零。

如果您的重点是分类准确性而不是可解释性,我会使用带正则化的逻辑回归。有关详细信息,请参阅我的另一个答案

逻辑回归的正则化方法

请注意,“逐步回归,现在被认为是一种统计罪过”。

看到这个帖子

什么是逐步回归的现代、易于使用的替代方案?

我同意其他人的观点,即 p 值在这里没有用,并且正则化回归(岭、弹性网、套索)是潜在的方法(如果变量是相关的,弹性网可能更有用 - 但哪个最好是经验问题)。

我还将决定预测变量中的理论或潜在相互作用或预测变量与结果之间关系中的非线性对您是否重要。如果是这样,您将需要提前创建它们 - 这里有一个资源,可以考虑查看正则化回归中的交互。此外,如果对交互或非线性关系感兴趣,您可以考虑使用或将您的模型与随机森林模型结合使用。我也成功使用的一种流行选择是Boruta,它是随机森林模型的包装器,用于检查您的特征是否优于随机排列的特征版本。正如 Demetri 上面指出的那样,任何具有您的样本量的预测变量都可能与结果有一些非零关系,从而使用于该目的的 p 值没有用。然而,像 Boruta 那样比较这些特征是否明显优于它们的随机排列是一种使用 p 值的显着差异可以再次变得有用的方法。

无论哪种方式,如果您拥有的 12 个变量在理论上被认为是有用的,那么您似乎有三个选项 - 将它们全部保留(这不是很多功能 - 为什么不将它们全部包含在内),试图弄清楚是否可以用两个来删除一些预测精度损失很大),或者试图找出这些预测变量与结果之间的关系对预测最有用。第二个选项似乎是您所要求的,并且可能是最快的,但第三个选项可能会随着时间的推移对您的预测帮助最大。

与任何回归一样,最好要么精通主题,要么与主题专家 (SME) 合作,以帮助确定哪些变量有意义。

该过程中的一个重要步骤是查看逐步结果并查看何时达到收益递减点。换句话说,看看每一步解释的方差量。在某些时候,解释的方差会显着减小,这应该有助于您确定停止点。当然,您应该始终查看预测变量之间的相关性以及系数如何随着新变量的添加而变化,当然还应咨询 SME 以确定哪些变量最有意义。

此外,我始终建议咨询经验丰富的建模师,让他们审查最终产品和沿途的步骤,包括任何初始变量清理和转换。顺便说一句,我总是建议在逻辑回归中考虑分箱。

其他因素是监控和实施变量的难易程度,这应该始终是一个实际的考虑因素。

顺便说一句,我注意到对“逐步出现的问题..”文章的引用,这当然是有效的;然而,逐步、明智地使用可以产生有效、有用的结果。与任何建模技术一样,结果应该在一个独立的(最好是超时的,如果适用的话)样本上进行测试,以验证结果。