回归大数据

时间:2015-02-21 15:05:09

标签: python numpy pandas scikit-learn

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

而不是inv(X'X)X'Y,我想将回归分解为8个部分。 回归1使用前10,000个组的数据。这给出X1'X1和X1'y1 回归2使用组10,001到20,000的数据并给出X2'X2,X2'y2 依此类推,其中X_j = x_j + dummies for group_j。

然后我的估计是inv(X1'X1 + .. X8'X8)(X1y1 + ... X8y8)。

问题在于有效地读取数据来执行此操作。 数据位于csv文件中,不按组进行组织。 我正在考虑读取整个数据集并将其转储到有组织的新csv文件中。然后我每次读取10,000 * 360行,并重复8次。

我的问题是

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

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

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

  4. 建议将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

由于看起来不能使用Spark的线性方法(https://spark.apache.org/docs/1.1.1/mllib-linear-methods.html#linear-least-squares-lasso-and-ridge-regression)来在AWS或其他服务器上执行回归,您可能需要考虑执行许多对可用数据(比如100个样本)进行重复回归,每次从下一组随机选择的观察中删除先前样本的观察结果,直到您没有更多样本为止。

这不仅可以让您了解您的数据集是否遵循大数定律(您可以对每个样本进行假设检验),但累积起来,所有样本的平均拟合线可能更准确而不是OLS适合整个数据集。

sm.OLS的一种可能替代方法可能是使用sklean.linear_model.LinearRegression()来运行回归。 http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

答案 2 :(得分:0)

计算矩阵逆不能很好地扩展并且可能在数值上不稳定,尤其是当您的特征集接近(或超过)您拥有的训练样本的数量时。您可能希望使用梯度下降来计算回归系数。查看Andrew Ng的机器学习课程的这些讲义的第5页:

http://cs229.stanford.edu/notes/cs229-notes1.pdf