如何从非常大的数据集中快速选择重要变量?

机器算法验证 机器学习 数据挖掘 大数据
2022-03-09 04:16:14

我有一个包含大约 2,000 个二进制变量/200,000 行的数据集,我试图预测一个二进制因变量。我在这个阶段的主要目标不是获得预测的准确性,而是确定哪些变量是重要的预测变量。我想将最终模型中的变量数量减少到 100 个左右。

有没有一种相对快速的方法来获取最重要的变量?randomForest 似乎需要很长时间。

我不必使用所有 200,000 个观察值,因此可以选择抽样。

3个回答

这听起来像是一个适合 lasso 和做收缩和变量选择的朋友的问题。统计学习要素描述了用于回归的套索和弹性网络,以及与这个问题更相关的逻辑回归。

这本书的作者已经将套索和弹性网络作为一个名为glmnet的 R 包提供了一个有效的实现。我以前使用这个包进行二进制数据分析,数据矩阵大约有 250,000 行,虽然列少了一些,但实际上运行所有列对所有其他列的回归。如果数据矩阵也是稀疏的,那么实现也可以利用这一点,我相信该方法实际上可以适用于 OP 的完整数据集。以下是对 lasso 的一些评论:

  • Lasso 通过使用非平滑的惩罚函数(1-norm),这通常导致参数估计,其中一些参数正好等于 0。估计有多少非零参数,以及非零参数缩小了多少,由调整参数确定。glmnet中实现的效率在很大程度上取决于这样一个事实,即对于较大的惩罚,只有少数参数不同于 0。
  • 调整参数的选择通常通过交叉验证完成,但即使没有交叉验证步骤,该方法也可能能够给出由惩罚参数索引的选定变量的良好序列。
  • 不利的一面是,对于变量选择,套索在变量选择中可能不稳定,特别是如果它们有些相关。发明了更一般的弹性净惩罚来改善这种不稳定性,但它并没有完全解决问题。自适应套索是改进套索变量选择的另一个想法。
  • 稳定性选择是 Meinshausen 和 Bühlmann 提出的一种通用方法,用于通过 lasso 等方法实现所选变量的更大稳定性。它需要对数据集的子样本进行多次拟合,因此对计算的要求更高。
  • 套索的一种合理思考方式是作为一种生成一维“好”模型的方法,范围从单变量模型到由惩罚参数参数化的更复杂的模型(不一定包括所有变量)。相比之下,单变量过滤器仅产生良好的单变量模型的选择或排序。

对于 Python,在scikit-learn中有一个实现方法,例如套索和弹性网络。

您可以从一个简单的单变量过滤器开始,并使用交叉验证来决定要保留哪些变量。R 包中的sbf函数caret非常有用。从第 19 页开始,您可以在此处阅读更多相关信息。

您可以对每个变量进行逻辑回归/卡方关联检验,并仅保留 p 值小于某个值(例如 0.2)的那些。