3

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

有没有一种方法来计算的巨大的,非稀疏数据集的逻辑回归不使用的内存量望而却步?我想过把数据分成大块,计算每个数据的回归,然后以某种方式将它们聚合起来,但我不确定这会给出有效的结果。

回答

4

Vowpal Wabbit是专为: 线性模型当数据(或甚至模型)不适合内存。

你可以手工做同样的事情,使用 随机梯度下降(SGD):写你的逻辑回归 (可能的对面)的“损失函数”, 尽量减少它只是在一个组块的位的数据(执行单梯度下降步骤), 在另一块数据上做同样的事情,并继续。 经过数据传递后,您应该有一个很好的解决方案。 如果数据以随机顺序到达,效果会更好。

另一个想法(ADMM,我认为), 相似,你有什么建议,是将数据分割成块, ,尽量减少对每个块的损失函数。 当然,不同块上的解决方案并不相同。 为了解决这个问题,我们可以通过对数据块,平均解决方案增加一个小处罚的解决方案之间的差异改变目标函数 ,并重新优化的一切。 经过几次迭代后,解决方案变得越来越紧密并最终收敛。 这具有可并行化的附加优势。

2

我没有亲自使用过,但StreamStats.jl包是专为这种使用情况。它支持线性和逻辑回归以及其他流式统计功能。

1

继续乔希日的真棒包OnlineStats的眼睛。除了大量用于各种统计,回归,分类,维度降低和分布估计的在线算法外,我们还积极致力于从StreamStats移植所有缺少的功能并合并这两者。

而且,我一直工作在一个非常实验包OnlineAI(延长OnlineStats),将一些网上的算法扩展到机器学习空间。

0

要添加到汤姆的答案,OnlineStats.jl有一个统计学习类型(StatLearn),它依赖随机近似算法,其中每个算法使用O(1)内存。 Logistic回归和支持向量机可用于二进制响应数据。该模型可以使用新批次的数据进行更新,因此您无需一次加载整个数据集。它也非常快。这里有一个简单的例子:

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

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

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

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

coef(o) 
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)