我有两个变量 (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次。
我的问题是
有没有更有效的方法来进行这种回归?
有没有办法绕过创建新的 csv 文件?如果我必须创建一个新的数据文件,第一种格式是什么? (没用过pytable和h5py,愿意考虑)
如果我调整 LASSO 来执行 OLS 而不是正则化回归,scikit-learn 会比 sm.OLS 更有效吗?
建议将不胜感激。提前致谢。
最佳答案
也许不是一个确定的答案,但有一些意见:
- 使用逆矩阵在数值上不是很稳定。标准解决方案,如 scipy.linalg.lstsq()使用适当的 matrix decompositions而不是
inv(X'X)X'Y
。 - 由于最小二乘法是线性估计器,因此可以将数据分成 block 并逐步计算结果,从而减少所需的 RAM。据描述here如何将 LQ 分成两个 block ,这可以很容易地推广到更多 block 。 Recursive least squares filter就是基于这个想法。对于您的数据大小,您应该牢记数值稳定性。
- Pytables 似乎是个好主意,因为它可以处理无法放入内存的数据。
numpy.save()
将是 CSV 的更简单、更快速的替代方法。
关于python - 大数据回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28647249/