我有两个变量(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次。
我的问题是
有更有效的方法来进行这种回归吗?
有没有办法绕过创建新的csv文件?如果我必须创建一个新的数据文件,那么第一种格式是什么? (从未使用pytable或h5py,并愿意考虑)
如果我调整LASSO做OLS而不是正则化回归,scikit-learn会比sm.OLS更有效吗?
建议将不胜感激。提前谢谢。
答案 0 :(得分:2)
也许不是一个明确的答案,但有些评论:
inv(X'X)X'Y
。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页: