Memory 大数据集上的Logistic回归

Memory 大数据集上的Logistic回归,memory,memory-management,regression,julia,logistic-regression,Memory,Memory Management,Regression,Julia,Logistic Regression,我需要在一个巨大的数据集(许多GB的数据)上运行逻辑回归。我目前正在为此使用Julia的GLM包。虽然我的回归工作在数据子集上,但当我尝试在完整的数据集上运行时,我的内存不足 有没有一种方法可以在不使用大量内存的情况下,在庞大的非稀疏数据集上计算逻辑回归?我曾考虑过将数据分成几块,计算每一块的回归,并以某种方式将其聚合,但我不确定这是否会给出有效的结果。就是为此而设计的: 当数据(甚至模型)不适合内存时的线性模型 你可以用手做同样的事情,使用 随机梯度下降(SGD):写下逻辑回归的“损失函数”

我需要在一个巨大的数据集(许多GB的数据)上运行逻辑回归。我目前正在为此使用Julia的GLM包。虽然我的回归工作在数据子集上,但当我尝试在完整的数据集上运行时,我的内存不足

有没有一种方法可以在不使用大量内存的情况下,在庞大的非稀疏数据集上计算逻辑回归?我曾考虑过将数据分成几块,计算每一块的回归,并以某种方式将其聚合,但我不确定这是否会给出有效的结果。

就是为此而设计的: 当数据(甚至模型)不适合内存时的线性模型

你可以用手做同样的事情,使用 随机梯度下降(SGD):写下逻辑回归的“损失函数” (与可能性相反), 在数据块上将其最小化一点(执行单个梯度下降步骤), 对另一块数据执行相同的操作,然后继续。 在多次传递数据之后,您应该有一个好的解决方案。 如果数据以随机顺序到达,效果会更好

另一个想法(,我想), 与您的建议类似,将数据拆分为块, 并最小化每个块上的损失函数。 当然,不同区块上的解决方案并不相同。 为了解决这个问题,我们可以改变目标函数 通过为数据块上的解决方案与平均解决方案之间的差异增加一点惩罚,并重新优化所有内容。 经过几次迭代,解变得越来越近,并最终收敛。
这具有可并行化的额外优势。

我个人没有使用过它,但该包是为这个用例设计的。它支持线性回归和逻辑回归,以及其他流式统计功能。

关注Josh Day令人敬畏的软件包。除了用于各种统计、回归、分类、降维和分布估计的大量在线算法外,我们还积极致力于移植和合并这两种算法中所有缺失的功能

另外,我一直在研究一个非常实验性的软件包(扩展OnlineStats),它将一些在线算法扩展到机器学习领域。

为了补充Tom的答案,有一种统计学习类型(),它依赖于随机近似算法,每种算法都使用O(1)内存。逻辑回归和支持向量机可用于二进制响应数据。模型可以用新的数据批进行更新,因此您不需要一次加载整个数据集。它也非常快。以下是一个基本示例:

using OnlineStats, StatsBase
o = StatLearn(n_predictors, LogitMarginLoss())

# load batch 1
fit!(o, (x1, y1))

# load batch 2
fit!(o, (x2, y2))

# load batch 3
fit!(o, (x3, y3))
...

coef(o)

一些scikit估计器,包括逻辑回归,实现了
部分拟合
,允许对大型核心外数据集进行批量培训

这样的模型可以用于使用核心外方法的分类:从不适合主内存的数据中学习

伪代码:

from sklearn.linear_model import SGDClassifier

clf = SGDClassifier(loss='log')
for batch_x, batch_y in some_generator:  # lazily read data in chunks
    clf.partial_fit(batch_x, batch_y)