大数据回归



我有两个变量(y,x)的数据:80000组的7年每周数据(364周)。我需要按组对数据进行降级,并对y进行回归(x加上需要创建的8个伪变量)。共有364*80000*10个数据点,即约3000万个数据点。我在服务器上"借用"了一个帐户,发现回归至少需要144GB的内存。我通常无法访问这台服务器,我的电脑只有24GB的内存。

我想把回归分解为8个部分,而不是inv(X'X)X'Y。回归1使用前10000组的数据。这给出了X1'X1和X1'y1回归2使用组10001至20000的数据,得出X2'X2,X2'y2其中X_j=X_j+组_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()这样的标准解决方案使用适当的矩阵分解,而不是inv(X'X)X'Y
  2. 由于最小二乘法是一种线性估计器,因此将数据分块并逐步计算结果是没有问题的,这减少了所需的RAM。这里描述了如何将LQ分解为两个块,这两个块可以很容易地推广到更多的块。递归最小二乘滤波器就是基于这个思想。对于您的数据大小,您应该记住数字的稳定性
  3. Pytables似乎是个好主意,因为它可以处理不适合内存的数据。CCD_ 2将是CSV的更简单、更快的替代方案

因为看起来不能使用类似Spark的线性方法(https://spark.apache.org/docs/1.1.1/mllib-linear-methods.html#linear-最小二乘套索和岭回归)在AWS或其他服务器上进行回归时,您可能需要考虑对可用数据(例如100个样本)进行多次重复回归,每次都从下一组随机选择的观测中删除先前样本的观测值,直到您没有更多样本为止。

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

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

计算矩阵逆不能很好地扩展,并且可能在数值上不稳定,尤其是当您的特征集接近(或超过)您的训练示例数量时。您可能想要使用梯度下降来计算回归系数。请参阅吴恩达的机器学习课程的课堂笔记第5页:

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

相关内容

  • 没有找到相关文章

最新更新