python - 大数据回归

标签 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 更有效吗?

建议将不胜感激。提前致谢。

最佳答案

也许不是一个确定的答案,但有一些意见:

  1. 使用逆矩阵在数值上不是很稳定。标准解决方案,如 scipy.linalg.lstsq()使用适当的 matrix decompositions而不是 inv(X'X)X'Y
  2. 由于最小二乘法是线性估计器,因此可以将数据分成 block 并逐步计算结果,从而减少所需的 RAM。据描述here如何将 LQ 分成两个 block ,这可以很容易地推广到更多 block 。 Recursive least squares filter就是基于这个想法。对于您的数据大小,您应该牢记数值稳定性。
  3. Pytables 似乎是个好主意,因为它可以处理无法放入内存的数据。 numpy.save() 将是 CSV 的更简单、更快速的替代方法。

关于python - 大数据回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28647249/

相关文章:

python - 从 python 数据框中获取唯一日期

将函数应用于自身的 Pythonic 方式、语法糖或运算符?

python - 如何用 True、False 和颜色编码 Python 绘图来标记 Y 轴?

python - 等效的 numpy 脚本产生不同的结果

python - 对于其他列中的每次更改,我们如何用这些行的平均值替换多行数据?

python - 用数组索引多维数组

python - 如何根据某些条件连接 pandas 列中的两个单元格?

python - 在 Pandas 中处理 NaN

python - 按 A 列删除重复项,保留 B 列中值最高的行

python - 基于索引和列名的数据框填充条件