基于来自非常大的数据库的样本组合来自(GBM 或任何其他)模型的结果

机器算法验证 r 大数据
2022-04-03 17:57:18

您将如何组合在非常大的数据集的随机样本上执行的模型结果?

我需要在 R 中建模一个非常大的数据库(约 7500 万行),不能直接加载到内存中。我仍处于计划阶段。

我的第一个想法是使用不替换的随机抽样将数据集划分为较小的数据集。然后我可以批量在数据集上运行随机森林模型,然后组合结果。我认为这种方法会给出合理的结果。

我想知道是否可以对 GBM 模型执行相同的方法?我阅读了文档,每次迭代都取决于前一个迭代(与随机森林不同),因此我不知道最终如何组合结果。

您知道在这种并行实现中用于合并模型结果的统计原理吗?我对通用方法感兴趣,而不仅仅是针对 GBM。

3个回答

本文采用的方法与您建议的方法非常相似,但它们对样本进行了分层。在他们的案例中,每个模型都可以看到地理空间的特定部分,这让不同的子模型可以专门化。图 6 和图 8 表明,与试图用单一模型拟合整个国家相比,这种划分可以产生更好的结果。

我还没有详细阅读这篇论文,但是当我上周与第一作者谈论它时,他似乎表示不需要花哨的程序来组合结果——他只是从所有相关的楷模。

不完全是您正在寻找的答案,但是...

你真的需要使用那么多数据吗?你有多少个预测器?如果预测变量的数量很少,那么有多少数据是冗余的并且只是填充预测变量空间?这一切都相关吗?是否存在不在模型应用领域中的数据点(即 20 年前的案例)?仅仅因为你拥有它并不意味着你必须使用它。

我会根据相似性对数据进行采样——找出与训练集中其他点最不相似的点子集。

最后,为什么要使用树集成方法?我喜欢 RF,但它也许是能够为您提供最大可能足迹的模型(即数千棵非常大的未修剪树)。如果您想使用树集合,请尝试 100 棵袋装树。哎呀,提升的 C5 树可能需要比 CART 类提升方法少得多的迭代次数(从我目前看到的情况来看)

您可能不知道进入这个过程哪个模型最好甚至足够好。同样,这取决于p,但从一些高偏差模型(LDA、逻辑回归、朴素贝叶斯)开始,并在推出大型、复杂、计算昂贵(或不可行)的工具之前,看看你能从中得到什么。尝试使用三次平滑样条进行逻辑回归来逼近任何非线性。

本着使用摘要来避免使用所有数据的精神。可能与您最初的要求完全不同。只是一种非常幼稚的开始方式——这可能在一个非常大的 Postgres 实例上完成。这是一个初步的探索步骤,因此它使用粗略的总和和计数来获得一些粗略的见解。您可以从 DBMS 的非常有效的求和/计数功能中获得一些功能,并使用它进行一些粗略的分析。我来自数据库和大规模并行数据分析背景,因此将其视为一种统计新手方法,(我确实有一个 Appl Math 的 MS 直到最近才被积极使用)

所以这里有所有这些警告

a) 天真地考虑将属性(日期、已售商品、价格、邮政编码)作为表格的列。我相信你有更多,但让我们专注于这些。

b) 在数据库中创建一个辅助表,通过添加所有 $ amts 来获得按邮政编码的一天销售额(日期、dailysales、邮政编码)。一些简单的 SQL(select date, zipcode, sum(price) as dailysales from table group by ....)为您提供此表。

一个小得多的表,每个邮政编码 365 行 X # 个邮政编码在您的数据中。
使用此表进行初步探索,并且当您采样时,您可以将其用作现实检查。

根据你给它多少 CPU 和内存,这个步骤可能需要几分钟或几小时。建议不要在笔记本电脑上尝试(当时在大约 2005 年的笔记本电脑上运行了 100 次类似大小的问题后,我的主板炸毁了 :-))

c)为每个邮政编码分别做“你最喜欢的回归”,(dailysales因变量,日期自变量)。如果您想就地执行此操作,请参阅 MADlib 项目http://MADlib.net(MADlib 通过在 Postgres 中嵌入 C++ 数学、数组和统计库来进行数据库内分析)

d) 每个邮政编码一个地块,365 个数据点(如果您有每日数据) - 寻找增加、减少或不确定的结果。或者只是获取相关系数并分成三个桶+,-和“不知道”。

现在,这允许您通过 Pareto 思维分离出销售额增长最多的前 20 个(或 10 个或 ..)邮政编码(按 % 和 $amt 计算)。大多数减少类似...

您现在可以分别制定策略,以分而治之的方式,深入了解增加、不确定和减少的邮政编码桶。

MADlib 还允许您通过 PL/R 运行数据库内 R 例程,但对于线性/逻辑回归和 SVM,嵌入式 C++ 的速度要快 100 倍。C4.5 也可用。

如果您的数据大小对于 Postgres 来说太大了(不要这么认为,但以防万一),那么就有了 Greenplum MPP 数据库。对于 7500 万行,您应该能够在 X-Large EC2 实例或类似的 Postgres 实例上执行此操作。

如果您不想在 dbms 中执行此操作,则可以编写一些 Python 代码并遍历磁盘文件或数据库表,一次将几千或十万行拉入内存。如果您确实将其放入 Postgres 中,则有一些方法可以获取行的小随机样本。

希望这是有道理的,或者至少在您的上下文中不是完全胡说八道:-)