大数据回归

hkg*_*166 5 python numpy pandas scikit-learn

我有两个变量 (y,x) 的数据:80,000 个组的 7 年每周数据(364 周)。我需要按组贬低数据,并对 y 进行回归(x 加需要创建的 8 个虚拟变量)。有364*80,000*10,即大约3000万个数据点。我“借”了服务器上的一个帐户,发现回归至少需要 144GB 内存。我通常无法访问该服务器,而且我的计算机只有 24GB 内存。

我正在考虑将回归分解为 8 部分,而不是 inv(X'X)X'Y。回归 1 使用前 10,000 个组的数据。这给出了 X1'X1 和 X1'y1 回归 2 使用组 10,001 到 20,000 的数据并给出 X2'X2、X2'y2 等等,其中 X_j =x_j+ group_j 的虚拟值。

那么我的估计将是 inv(X1'X1+..X8'X8)(X1y1+ ... X8y8)。

问题是如何有效地读取数据来做到这一点。数据位于 csv 文件中,未按组组织。我正在考虑读取整个数据集并将其转储到一个有组织的新 csv 文件中。然后每次读取10000*360行,重复8次。

我的问题是

  1. 有没有更有效的方法来进行这种回归?

  2. 有没有办法绕过创建新的 csv 文件?如果我必须创建一个新的数据文件,第一个格式是什么?(从未使用过pytable或h5py,愿意考虑)

  3. 如果我调整 LASSO 来执行 OLS 而不是正则化回归,scikit-learn 会比 sm.OLS 更有效吗?

如有建议,我们将不胜感激。提前致谢。

Die*_*ich 3

也许不是一个明确的答案,但一些评论:

  1. 使用矩阵逆在数值上不太稳定。像scipy.linalg.lstsq()这样的标准解决方案使用适当的矩阵分解而不是 off inv(X'X)X'Y
  2. 由于最小二乘是一种线性估计器,因此将数据分成块并逐步计算结果是没有问题的,这会减少所需的 RAM。这里描述了如何将 LQ 分成两个块,这可以很容易地推广到更多块。递归最小二乘滤波器就是基于这个想法。对于数据大小,您应该牢记数字稳定性。
  3. Pytables 似乎是一个好主意,因为它可以处理不适合内存的数据。numpy.save()将是 CSV 的更简单、更快的替代方案。