回归分析与大数据

5
我有两个变量(y,x)的数据:80,000组的7年每周数据(364周)。我需要按组进行数据去均值,并对(y加上8个需要创建的虚拟变量)的x做回归。共有364*80,000*10,约30百万数据点。我“借用”了服务器上的帐户,发现回归需要至少144GB的内存。我通常无法访问此服务器,我的计算机只有24GB的RAM。
我想把回归分成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+群体_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更有效?
非常感谢您提供建议。预先感谢您。
3个回答

3
也许不是一个确定的答案,但有一些评论:
  1. 使用矩阵逆运算在数值上并不非常稳定。标准解决方案如scipy.linalg.lstsq()使用适当的矩阵分解代替inv(X'X)X'Y
  2. 由于最小二乘法是线性估计器,将数据分块并逐步计算结果没有问题,这可以减少所需的RAM。描述了这里如何将LQ分成两个块,这可以轻松地推广到更多块。基于这个想法的递归最小二乘滤波器。对于您的数据大小,应考虑数值稳定性。
  3. Pytables似乎是一个很好的想法,因为它可以处理内存中无法容纳的数据。numpy.save()是CSV的一个更简单、更快速的替代方案。

0

计算矩阵的逆不具有良好的可扩展性,并且在特征集接近(或超过)您拥有的训练示例数量时可能存在数值不稳定性。您可能希望使用梯度下降来计算回归系数。请查看Andrew Ng机器学习课程的这些讲座笔记第5页:

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


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


感谢您的评论。由于许可协议的限制,我无法将数据放在AWS上。我尝试了很多方法,sklearn的线性回归似乎是目前最好的替代方案。干杯。 - hkg166

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接