机器学习和大数据

38
在开始之前,我想描述一下我的当前位置以及我想要实现的目标。
我是一名从事机器学习研究的人员。到目前为止,我已经学习了几门涵盖机器学习算法和社交网络分析的理论课程,因此掌握了一些对实现机器学习算法和处理真实数据有用的理论概念。
在简单的例子中,这些算法表现良好且运行时间可接受,但如果尝试在我的个人电脑上运行算法处理大数据时会遇到问题。关于软件方面,我有足够的经验来实现任何文章中的算法,或者使用任何语言或IDE(目前我已经使用过Matlab、Java与Eclipse、.NET...)自己设计算法,但我对设置基础设施的经验不多。我已经开始学习Hadoop、NoSQL数据库等,但考虑到学习时间的限制,我不确定哪种策略是最好的。 最终目标是能够建立一个工作平台,用于分析大数据,重点是实现我自己的机器学习算法,并将所有内容整合到生产环境中,可以通过处理大数据来解决有用的问题。 由于主要关注的是实现机器学习算法,我想问一下是否存在任何现有的运行平台,提供足够的CPU资源来处理大数据,上传自己的算法,并简单地处理数据而不需要考虑分布式处理。
无论这样的平台是否存在,我都希望能够获得一个足够全面的画面,以便能够与团队合作,根据特定客户需求开发整个系统。例如,零售商希望分析每日购买情况,因此所有每日记录都需要上传到某个基础设施中,该基础设施必须足够强大,能够使用定制的机器学习算法处理数据。
简单来说,如何设计一个针对现实问题的定制数据挖掘解决方案,主要关注机器学习算法,并将其投入生产,如果可能的话,利用现有基础设施;如果不行,则设计分布式系统(使用Hadoop或其他框架)。

我自己想看到你问题的好答案。但是你试过Mahoot吗?如果它太基础了,Oracle刚刚推出了对他们的DB中R的支持。 - Ivan Koblik
1
也许以下文章可以帮助您的研究: http://techcrunch.com/2012/10/27/big-data-right-now-five-trendy-open-source-technologies - Ram
3个回答

26
首先,你的问题需要更清晰地定义你对大数据的意图。
事实上,大数据是一个可能涉及各种规模问题的流行词汇。我倾向于将大数据定义为数据大小或计算时间足够大,以至于“硬件抽象变得破碎”,这意味着单个普通机器无法在没有计算和内存的密集关注下执行计算。
因此,数据变成大数据的规模门槛不明确,并且对你的实现非常敏感。你的算法是否受到硬盘带宽限制?它是否必须适合内存?你是否尝试避免不必要的二次成本?你是否做出任何提高缓存效率的努力等。
通过多年管理中大型机器学习挑战的经验(最多使用250台普通计算机),我强烈相信,许多看似需要分布式基础架构的问题实际上可以在单个普通计算机上运行,只要问题表达正确。例如,您提到了零售商的大规模数据。我已经在这个确切的主题上工作了几年,并且经常设法使所有计算都在单台机器上运行,只要稍微优化一下即可。我的公司一直在开发一种简单的自定义数据格式,可以将来自非常大型零售商的所有数据存储一年,仅需50GB,这意味着单个普通硬盘可以容纳20年的历史。例如,您可以查看:https://github.com/Lokad/lokad-receiptstream 根据我的经验,值得花时间优化算法和内存,以避免采用分布式架构。事实上,分布式架构有三倍的成本。首先是强大的知识需求。其次,它带来了代码的高复杂度开销。最后,分布式架构带来了显着的延迟开销(除了本地多线程分配)。
从实践者的角度来看,能够在30秒内执行给定的数据挖掘或机器学习算法是效率的关键因素之一。我注意到,当某些计算(无论是顺序还是分布式)需要10分钟时,我的专注力和效率往往会迅速下降,因为快速迭代和测试新想法变得更加复杂。许多分布式框架引入的延迟开销使您不可避免地处于低效状态。
如果问题的规模如此之大,即使尽最大努力也无法在单台机器上执行,则强烈建议使用现成的分布式框架而不是构建自己的框架。最著名的框架之一是MapReduce抽象,可通过Apache Hadoop获得。 Hadoop可以在10,000个节点集群上运行,可能比您需要的还要多得多。如果您没有硬件,可以通过Amazon MapReduce“租用”使用Hadoop集群。
不幸的是,MapReduce抽象并不适用于所有机器学习计算。就机器学习而言,MapReduce是一个刻板的框架,许多情况已被证明难以或低效地适应该框架。
- MapReduce框架本身与函数式编程有关。Map过程独立地应用于每个数据块。因此,当将Map过程应用于某些数据块需要同一过程的结果作为先决条件时,MapReduce框架不适用于算法。换句话说,当不同数据之间的计算不是独立的并强制执行特定的时间顺序时,MapReduce框架不适用。
- MapReduce旨在提供地图和缩小步骤的单次执行,并不直接提供迭代调用。因此,它不适用于涉及迭代处理的众多机器学习问题(期望最大化(EM),信念传播等)。在MapReduce框架中实现这些算法意味着用户必须设计一个解决方案,以组织结果检索和多次迭代的调度,以便在完成前一个迭代的缩小阶段后启动每个地图迭代,并且每个地图迭代都提供了前一个迭代的缩小阶段提供的结果。
- 大多数MapReduce实现都是为了解决生产需求和可靠性而设计的。因此,框架的主要关注点是处理硬件故障并保证计算结果的准确性。这些可靠性约束条件在一定程度上降低了MapReduce的效率。例如,在某些情况下,将计算结果序列化到硬盘上会非常昂贵。
- MapReduce不适用于异步算法。
对MapReduce框架的质疑导致了更丰富的分布式框架,其中更多的控制和自由留给了框架用户,但代价是增加了用户的复杂性。其中,基于计算的有向无环图的GraphLab和Dryad都很有名。
因此,就像没有“一种尺寸适合所有”的数据存储解决方案一样,也没有“一种尺寸适合所有”的框架。
如果想开始使用Hadoop,可以参考Tom White的书《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

3
我坚信许多看起来需要使用分布式基础设施的问题,只要正确表达问题,就可以在一台普通计算机上运行。点赞!我们太习惯于在问题上投入更多硬件。更好的扩展算法和精心优化可以更有效率。 - András Aszódi

7
我必须实现一些数据挖掘算法来处理大数据,最终我使用了Hadoop。如果你熟悉Mahout(http://mahout.apache.org/),它已经有几种算法可以与Hadoop一起使用。
然而,如果你想要实现自己的算法,你仍然可以将其适应于Hadoop的MapReduce范例并获得良好的结果。这是一本关于如何将人工智能算法适应于MapReduce的优秀书籍:
《海量数据挖掘》- http://infolab.stanford.edu/~ullman/mmds.html

Renata:你提供的“大规模数据挖掘”网址已经更新了。新的网址是http://www.mmds.org/index2.html。 - Vldb.User

2
这似乎是一个老问题。然而,鉴于您的用例,在大数据领域专注于机器学习的主要框架包括Mahout、Spark(MLlib)、H2O等。但是,要在大数据上运行机器学习算法,您必须将它们转换为基于MapReduce范例的并行程序。这是一篇很好的文章,简要介绍了主要(不是全部)大数据框架:http://www.codophile.com/big-data-frameworks-every-programmer-should-know/。希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接