机器学习&大数据

时间:2012-12-07 10:10:58

标签: machine-learning bigdata

一开始,我想描述一下我目前的立场和想要实现的目标。

我是一名处理机器学习的研究员。到目前为止,已经完成了几个涵盖机器学习算法和社交网络分析的理论课程,因此获得了一些理论概念,可用于实现机器学习算法和实际数据。

在简单的例子中,算法运行良好,运行时间可以接受,而大数据表示如果尝试在我的PC上运行algoritghms则会出现问题。关于软件我有足够的经验来实现文章中的任何算法或使用任何语言或IDE设计我自己(迄今为止使用过Matlab,Java与Eclipse,.NET ......)但到目前为止还没有太多的设置经验 - 基础设施。我已经开始了解Hadoop,NoSQL数据库等,但我不确定哪种策略最好考虑学习时间限制。

最终目标是能够建立一个分析大数据的工作平台,专注于实现我自己的机器学习算法,并将所有这些算法投入生产,为处理大数据解决有用的问题做好准备。

由于主要关注的是实现机器学习算法,我想问一下是否有任何现有的运行平台,提供足够的CPU资源来提供大量数据,上传自己的算法并简单地处理数据而不考虑分布式处理。

然而,这个平台是否存在,我想获得足够大的图片,以便能够在一个团队中工作,该团队可以根据特定的客户需求量身定制整个系统。例如,零售商希望分析每日购买情况,因此所有日常记录都必须上传到某些基础设施,足以通过使用自定义机器学习算法处理数据。

将上述所有内容置于简单的问题中:如何针对现实生活中的问题设计自定义数据挖掘解决方案,主要关注机器学习算法,并尽可能使用现有基础架构将其投入生产不,设计分布式系统(通过使用Hadoop或任何框架)。

我非常感谢有关书籍或其他有用资源的任何建议或建议。

3 个答案:

答案 0 :(得分:25)

首先,您的问题需要更清楚地定义大数据的意图。

事实上,大数据是一个流行语,可能涉及各种规模的问题。我倾向于将大数据定义为问题的类别,其中数据大小或计算时间足够大,以便硬件抽象被破坏",这意味着单个商品机器无法在没有密集的情况下执行计算关心计算和记忆。

因此,数据成为大数据的比例阈值不清楚,并且对您的实施很敏感。您的算法是否受硬盘带宽限制?是否需要记忆?您是否尝试避免不必要的二次成本?您是否已努力提高缓存效率等。

从运行中等大规模机器学习挑战(多达250台商用机器)的几年经验来看,我坚信许多似乎需要分布式基础设施的问题实际上可以在单个商品机上运行,​​如果问题表达正确。例如,您提到零售商的大规模数据。几年来,我一直在研究这个确切的主题,我经常设法在一台机器上运行所有的计算,提供一些优化。我的公司一直致力于简单的自定义数据格式,允许一年的大型零售商的所有数据存储在50GB以内,这意味着单个商品硬盘可以保存20年的历史。您可以查看以下示例:https://github.com/Lokad/lokad-receiptstream

根据我的经验,值得花时间尝试优化算法和内存,以便您可以避免使用分布式架构。实际上,分布式架构需要三倍的成本。首先,强大的知识要求。其次,它在代码中带来了大量的复杂性开销。最后,分布式体系结构具有显着的延迟开销(本地多线程分发除外)。

从实践者的角度来看,能够在30秒内执行给定的数据挖掘或机器学习算法是提高效率的关键因素之一。我注意到,当某些计算(无论是顺序计算还是分布式计算)花费10分钟时,我的注意力和效率往往会迅速下降,因为快速迭代并快速测试新想法变得更加复杂。许多分布式框架引入的延迟开销使您不可避免地陷入这种低效率的情况。

如果问题的严重程度如此,即使你付出了很大努力就无法在一台机器上执行它,那么我强烈建议求助于现成的分布式框架而不是构建自己的框架。最着名的框架之一是MapReduce抽象,可通过Apache Hadoop获得。 Hadoop可以在10万个节点集群上运行,可能比您需要的更多。如果你不拥有硬件,你可以租用"使用Hadoop集群,例如通过Amazon MapReduce。

不幸的是,MapReduce抽象并不适合所有机器学习计算。 就机器学习而言,MapReduce是一个严格的框架,许多案例已经证明难以适应这个框架:

- MapReduce框架本身与函数式编程有关。该 映射过程独立地应用于每个数据块。因此, MapReduce框架不适合应用程序所在的算法 映射程序到一些数据块需要相同程序的结果 其他数据块作为先决条件。换句话说,就是MapReduce框架 当不同数据片段之间的计算结果不合适时 不独立并强加特定的年代表。

- MapReduce旨在提供地图和地图的单次执行 减少步骤,不直接提供迭代调用。因此不是 直接适用于隐含迭代的众多机器学习问题 处理(期望最大化(EM),信念传播等)。该 在MapReduce框架中实现这些算法意味着 用户必须设计一个组织结果检索和调度的解决方案 多次迭代,以便在reduce之后启动每个map迭代 完成上一次迭代的阶段,因此每次迭代都被馈送 结果由前一次迭代的reduce阶段提供。

- 大多数MapReduce实施都是为满足生产需求而设计的 鲁棒性。因此,该框架的主要关注点是处理 硬件故障并保证计算结果。 MapReduce的效率 因此,部分地降低了这些可靠性约束。例如, 计算结果在硬盘上的序列化变得相当昂贵 在某些情况下。

- MapReduce不适合异步算法。

对MapReduce框架的质疑导致了更丰富的分布式框架,其中更多的控制和自由留给框架用户,代价是该用户更加复杂。在这些框架中,GraphLab和Dryad(均基于计算的直接非循环图)是众所周知的。

因此,没有"一个尺寸适合所有"框架,例如没有"一个尺寸适合所有"数据存储解决方案。

要从Hadoop开始,您可以查看书籍Hadoop: The Definitive Guide by Tom White

如果您对大规模框架如何适应机器学习要求感兴趣,您可能会对我博士的第二章(英文)感兴趣,可在此处获取:http://tel.archives-ouvertes.fr/docs/00/74/47/68/ANNEX/texfiles/PhD%20Main/PhD.pdf

如果您提供有关您要处理的特定挑战的更多信息(算法类型,数据大小,时间和金钱限制等),我们可能会为您提供更具体的答案。

编辑:另一个可能被证明有用的参考:Scaling-up Machine Learning

答案 1 :(得分:4)

我必须实现一些数据挖掘算法才能使用BigData,最后我使用了Hadoop。 我不知道你是否熟悉Mahout(http://mahout.apache.org/),它已经有几种算法可以用于Hadoop。

然而,如果你想实现自己的算法,你仍然可以使它适应Hadoop的MapReduce范例并获得良好的结果。这是一本关于如何使人工智能算法适应MapReduce的优秀书籍:

挖掘海量数据集 - http://infolab.stanford.edu/~ullman/mmds.html

答案 2 :(得分:1)

这似乎是个老问题。然而,考虑到您的用例,专注于大数据域中的机器学习的主要框架是Mahout,Spark(MLlib),H2O等。但是要在大数据上运行机器学习算法,您必须将它们转换为基于Map Reduce范例的并行程序。这是一篇很好的文章,简要介绍了主要(不是全部)大数据框架:

http://www.codophile.com/big-data-frameworks-every-programmer-should-know/

我希望这会有所帮助。