我需要对庞大的数据集(许多GB数据)运行逻辑回归。我目前正在使用Julia的GLM包。虽然我的回归可以处理数据的子集,但是当我尝试在完整数据集上运行时,我的内存不足。
有没有办法在不使用大量内存的情况下计算庞大的非稀疏数据集的逻辑回归?我想过将数据分成块,计算每个数据的回归并以某种方式聚合它们,但我不确定这会给出有效的结果。
答案 0 :(得分:4)
Vowpal Wabbit专为此而设计: 当数据(甚至模型)不适合内存时的线性模型。
你可以手动做同样的事情,使用 随机梯度下降(SGD):写出"损失函数"你的逻辑回归 (与可能性相反), 在一大块数据上稍微减少它(执行单个梯度下降步骤), 在另一块数据上做同样的事情,然后继续。 在多次传递数据后,您应该有一个很好的解决方案。 如果数据以随机顺序到达,则效果会更好。
另一个想法(ADMM,我认为), 类似于你的建议,将数据分成块, 并最大限度地减少每个块的损失函数。 当然,不同块上的解决方案并不相同。 为了解决这个问题,我们可以改变目标函数 通过为一大块数据和平均解决方案之间的差异添加一个小的惩罚,并重新优化所有内容。 经过几次迭代后,解决方案变得越来越近并最终收敛。 这具有可并行化的附加优势。
答案 1 :(得分:2)
我没有亲自使用它,但StreamStats.jl包是专为此用例设计的。它支持线性和逻辑回归,以及其他流统计功能。
答案 2 :(得分:1)
密切注意Josh Day的精彩套餐OnlineStats。除了大量用于各种统计,回归,分类,降维和分布估算的在线算法外,我们还积极致力于从StreamStats移植所有缺失的功能并将两者合并。
此外,我一直在研究一个非常实验性的包OnlineAI(扩展OnlineStats),它将一些在线算法扩展到机器学习空间。
答案 3 :(得分:0)
为了增加汤姆的答案,OnlineStats.jl有一个统计学习类型(StatLearn
),它依赖于随机近似算法,每个算法都使用O(1)内存。 Logistic回归和支持向量机可用于二进制响应数据。可以使用新批次的数据更新模型,因此您无需一次加载整个数据集。它也非常快。这是一个基本的例子:
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)
答案 4 :(得分:0)
几个scikit估算器,包括逻辑回归,实现partial_fit
,允许批量训练大型的核外数据集。
此类模型可用于使用核外方法进行分类:从不适合主存储器的数据中学习。
伪代码:
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)