一开始我想描述一下我目前的立场和想要实现的目标。
我是一名处理机器学习的研究员。到目前为止,已经完成了几个涵盖机器学习算法和社交网络分析的理论课程,因此获得了一些理论概念,可用于实现机器学习算法和输入实际数据。
在简单的例子中,算法运行良好,运行时间可以接受,而大数据表示如果尝试在我的PC上运行算法则会出现问题。关于软件我有足够的经验来实现文章中的任何算法或使用任何语言或IDE设计我自己(迄今为止使用过Matlab,Java与Eclipse,.NET ......)但到目前为止还没有太多的设置经验 - 基础设施。我已经开始了解Hadoop,NoSQL数据库等,但我不确定哪种策略最好考虑学习时间限制。
最终目标是能够建立一个分析大数据的工作平台,重点是实现我自己的机器学习算法,并将所有这些算法集中到生产中,为处理大数据解决有用的问题做好准备。
由于主要关注的是实现机器学习算法,我想问一下是否存在任何现有的运行平台,提供足够的CPU资源来提供大量数据,上传自己的算法并简单地处理数据而不考虑分布式处理。
然而,这样的平台是否存在,我想获得足够大的图片,以便能够在一个团队中工作,该团队可以根据特定的客户需求量身定制整个系统。例如,零售商希望分析每日购买,因此所有日常记录必须上传到某些基础设施,足以通过使用自定义机器学习算法处理数据。
将上述所有问题都纳入简单的问题:如何设计一个针对现实生活问题的自定义数据挖掘解决方案,主要关注机器学习算法并在可能的情况下通过使用现有基础设施投入生产,如果不是,则设计分布式系统(通过使用Hadoop或任何框架)。
我非常感谢有关书籍或其他有用资源的任何建议或建议。
首先,您的问题需要更清楚地定义大数据的意图。
实际上,大数据是一个流行语,可能涉及各种规模的问题。我倾向于将大数据定义为问题的类别,其中数据大小或计算时间足够“硬件抽象被破坏”,这意味着单个商品机器无法在没有重复计算和内存的情况下执行计算。
因此,数据成为大数据的规模阈值不明确,并且对您的实施很敏感。您的算法是否受硬盘带宽限制?是否需要记忆?您是否尝试避免不必要的二次成本?您是否已做出任何努力来提高缓存效率等。
从运行中等大规模机器学习挑战(多达250个商用机器)的几年经验来看,我坚信,如果表达问题,许多似乎需要分布式基础设施的问题实际上可以在单个商品机器上运行正确。例如,您提到零售商的大规模数据。几年来,我一直在研究这个确切的主题,我经常设法在一台机器上运行所有的计算,提供一些优化。我的公司一直致力于简单的自定义数据格式,允许一年的大型零售商的所有数据存储在50GB以内,这意味着单个商品硬盘驱动器可以拥有20年的历史。您可以查看以下示例:https://github.com/Lokad/lokad-receiptstream
根据我的经验,值得花时间尝试优化算法和内存,以便您可以避免使用分布式架构。实际上,分布式架构需要三倍的成本。首先,强大的知识要求。其次,它在代码中带来了大量的复杂性开销。最后,分布式体系结构具有显着的延迟开销(本地多线程分发除外)。
从实践者的角度来看,能够在30秒内执行给定的数据挖掘或机器学习算法是提高效率的关键因素之一。我注意到,当某些计算(无论是顺序计算还是分布式计算)花费10分钟时,我的注意力和效率往往会迅速下降,因为快速迭代并快速测试新想法变得更加复杂。许多分布式框架引入的延迟开销使您不可避免地处于这种低效率的情况中。
如果问题的规模是这样的,即使你付出了很大的努力就无法在一台机器上执行它,那么我强烈建议使用现成的分布式框架而不是构建自己的框架。最着名的框架之一是MapReduce抽象,可通过Apache Hadoop获得。 Hadoop可以在10万个节点集群上运行,可能比您需要的更多。如果您不拥有硬件,则可以“租用”Hadoop集群的使用,例如通过Amazon MapReduce。
不幸的是,MapReduce抽象并不适合所有机器学习计算。就机器学习而言,MapReduce是一个严格的框架,许多案例已经证明难以适应这个框架:
- MapReduce框架本身与函数式编程有关。 Map过程独立地应用于每个数据块。因此,MapReduce框架不适用于将Map过程应用于某些数据块需要与其他数据块相同的过程结果作为先决条件的算法。换句话说,当不同数据片段之间的计算不是独立的并且强加特定的时间顺序时,MapReduce框架是不适合的。
- MapReduce旨在提供地图和reduce步骤的单次执行,而不是直接提供迭代调用。因此,它不直接适用于暗示迭代处理(期望最大化(EM),信念传播等)的众多机器学习问题。在MapReduce框架中实现这些算法意味着用户必须设计一个解决方案来组织结果检索和多次迭代的调度,以便在前一次迭代的减少阶段完成后启动每个地图迭代,因此每次迭代都是由前一次迭代的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
我不得不实现一些数据挖掘算法来处理BigData,最后我使用了Hadoop。我不知道你是否熟悉Mahout(http://mahout.apache.org/),它已经有几种算法可以用于Hadoop。
然而,如果你想实现自己的算法,你仍然可以使它适应Hadoop的MapReduce范例并获得良好的结果。这是一本关于如何使人工智能算法适应MapReduce的优秀书籍:
这似乎是一个老问题。然而,考虑到您的用例,专注于大数据域中的机器学习的主要框架是Mahout,Spark(MLlib),H2O等。但是要在大数据上运行机器学习算法,您必须将它们转换为基于Map Reduce范例的并行程序。这是一篇很好的文章,简要介绍了主要(不是全部)大数据框架:
http://www.codophile.com/big-data-frameworks-every-programmer-should-know/
我希望这将有所帮助。