机器学习以现有数据为基础创建模型,通过数据驱动,对未来做出决策或者预测。机器学习在最近几年获得大量的关注,因为它对企业与商业做出决策非常有帮助。
Apache Spark及其机器学习库MLlib为开发可伸缩的机器学习应用,提供了多种有用的算法。
关于这个话题,Nick Pentreath撰写了《Machine Learning with Spark》一书(由Packt Publishing出版)。
Nick首先介绍了Spark编程模型及其组件,比如SparkContext和弹性分布式数据集(RDD)。同时,他谈到了如何使用不同的编程语言,比如Scala、Java和Python来编写Spark程序。
他还谈到了如何基于Spark框架,使用基于内容的过滤和协同过滤技术,构建一个推荐引擎。此外,还讲到了使用Spark创建分类、回归和聚类模型,以及降维。
当能够对实时数据,而不仅仅是使用静态数据集进行数据处理和分析时,机器学习解决方案会更加有效。这就是本书最后一章中讨论的内容。涵盖的主题包括流式数据分析、流回归和k-means模型。
InfoQ采访了Nick,共同探讨了有关数据科学和机器学习的概念,以及这本书。
InfoQ:能为我们的读者介绍下,什么是机器学习吗?
Nick Pentreath:机器学习的定义有许多版本,但我倾向于认为它是简单地从数据中学习并对未来做出预测。从这个意义所上说,机器学习和统计学有许多相似之处,实际上,机器学习和统计学领域确实显著地重叠。然而,机器学习也深受计算机科学和人工智能领域的影响。将许多学科的思想和技术相结合是机器学习的一个方面,却是机器学习最吸引我的地方。
InfoQ:能介绍一些机器学习的商用场景吗?
Pentreath:以往,机器学习是相当理论的,绝不会出现于公众的心目中。直到最近,凭借在理论和计算能力的进步,机器学习似乎无处不在。现在它正强力支撑着多种应用,包括在线搜索、推荐引擎、定向广告、欺诈检测、图像和视频识别、自动驾驶汽车,以及各种人工智能场景。
InfoQ:什么是数据科学,数据科学家在大数据项目中的作用是什么?
Pentreath:就像机器学习一样,“数据科学”是相当新的术语,你能找到许多的定义。我不认为数据科学是一个定义。相反,它融合了来自不同学科的技术,包括统计学、机器学习、编程、数据可视化和通信。
我特别喜欢最近的一篇文章,其中介绍了两种类型的数据科学家,“A类型”和“B类型”。
“A类型”的数据科学更侧重于分析和实验。从这个意义上讲,一个数据科学家很可能做“统计学家”或“数据分析师”方向的事情,这是数据科学的一端。具体实例比如,运行A/B测试,以决定在Web应用中上线哪些新功能;或者为零售商店进行客户细分的工作。这里的核心技能,除了技术,是沟通和表达,将结果和最终效果呈现给广大(通常非技术)受众。
“B类型”的数据科学更侧重于创建一个时常处于自动化和实时的环境中,使用机器学习并作出决定的系统。具体实例比如,搜索和推荐引擎和欺诈检测模型。核心技能往往强调软件工程和进行较大规模计算的分布式系统。
在“大数据”项目中的数据科学家,其作用取决于项目的性质,通常对准上面提到的两大阵营。然而,这两种类型的数据科学家需要具备大数据量相关工作的特殊技能。包括分布式数据处理、可伸缩的机器学习方法,以及大规模数据可视化。
InfoQ: 我们来讨论下不同的机器学习模型吧,它们会用于哪些场景或者解决什么问题?
Pentreath:机器学习的应用领域非常广泛。从某种意义上说,几乎所有涉及不确定条件下做预测的问题,都可以利用机器学习技术来处理。
机器学习模型的主要类型包括:
- 监督学习——用于预测给定的结果,比如欺诈检测,或者客户会购买某件产品的可能性;
- 无监督学习——用于尝试揭开隐藏在原始数据背后的结构,比如学习单词和原始文本数据的语言结构之间的关系;
- 强化学习——这基本上学习如何通过不断地从一组有效的行动中选择一个,最大限度地“奖励”一些概念。示例包括许多人工智能的应用,比如自动飞行的直升机和学会玩视频游戏的计算机。
在每种主要类型中,有许多不同的模型和算法,每个都有自身的优点和缺点。
InfoQ: What are different technologies to implement Machine Learning solutions? How does Spark compare with these technologies?
在实现机器学习的解决方案中,用到了哪些不同的技术?请比较一下这些技术与Spark?
Pentreath:几乎有与模型的数量同样多的机器学习库和框架!其中使用最广泛的是R语言及其诸多库、Python语言的scikit-learn、Java语言的Weka和C++语言的Vowpal Wabbit。最近的一些新增的包括H2O和各种深度学习框架,比如Caffe和Deeplearning4J。
Apache Spark核心本身是一个分布式数据处理框架。Spark的MLlib库提供了各种机器学习算法的分布式实现,重点解决的是大规模学习问题,通常涉及数亿或数十亿的训练样本。因此,它可能不会像一些其他通用库那样覆盖尽可能多的算法。这其中部分原因是机器学习模型的分布式实现往往难以做到有效,另一个原因是MLlib仍然是一个出于开发状态的年轻项目。
InfoQ:设计一款机器学习系统需要考虑些什么,最佳实践是什么?
Pentreath:设计一款机器学习系统(相对于临时的探索和分析)时的考虑因素与任何复杂的软件系统的设计大致相同。可能包括:数据存储和模式设计(比如,存储和管理模型,以及各种输入数据源)、不同组件的模块化(比如,数据处理和构建模型的组件通常与模型服务组件分离)、单独架构每个独立的可扩展组件、系统和性能测试(包括传统的软件测试,以及测试和监控模型的性能),以及数据可视化(比如,模型性能和分析的仪表盘)。
此外,机器学习系统可以在大多数情况下,与各种其它系统进行互操作,如Web服务、报告系统、支付处理系统等。在这种情况下,所使用的方法包括面向服务的架构或者“微服务”,它们为机器学习系统和其他系统之间的通信提供了清晰的API。
InfoQ: 在本书的第4章,你讨论了推荐引擎。能否谈谈不同的推荐模式,以及每种会有哪些选择?
Pentreath:推荐模型一般分为三种主要类型——协同过滤、基于内容或者基于模型的方法。
“协同过滤”方法使用“众包智慧”,基于大量其他用户的行为,发现用户(或项目)与给定用户(或项目)的相似性。这推动了常见于电子商务网站的推荐,比如“浏览了这款产品的人还查浏览了......”。协同过滤的潜在假设是,具有类似行为的人也偏好类似的项目(例如,电影)。因此,当推荐电影给用户时,我们可以查找与其相似的其他用户,以及他们曾经观看或评价过那些电影。然后,将这些电影推荐给用户。
“基于内容”的模型使用项目的内容属性(比如类别、标签、说明以及其他数据)生成推荐。基于内容的模型一般不考虑其他用户的整体行为。
“基于模型”的方法尝试对用户偏好的项目直接建模(比如,给定所有用户对各种电影给出的评分集合,建模某个用户对一部电影的预期评分)。基于模型的方法通常结合某种形式的协同过滤,并且还可以包括基于内容的方法。
协同过滤(和使用协同过滤的基于模型的方法)在实践中,往往表现得非常好。
然而,这些模型的一个缺点是,需要相当多的可用数据。这些方法还无法处理“冷启动问题”——当出现一个新的用户或项目时,我们的模型没有历史数据,因此不能立即为该用户(或项目)推荐,直到收集到一些偏好数据。最后,协同过滤的计算往往相当昂贵(特别在当用户和项目的数量非常大的时候)。
基于内容的方法与协同过滤模型相比,缺乏“个性化”,而且常常执行得不好。然而,它们可以处理冷启动问题,因为它们不需要新项目的偏好数据。
基于模型的方法往往尝试混合使用协同过滤的强大功能和性能,以及基于内容过滤的灵活性和适应性。最新技术比如基于内容的深度学习中的特征提取、因式分解机、张量分解和其他混合模型都取得了强劲的性能(至少在基准数据集上)。
在实践中,方法和模型的选用取决于领域、可用的数据(以及数据量),以及时间、成本和其他约束。通常,一个真实的系统融合了多种方法(或更有条理的组合,比如组合模型)。使用任何机器学习系统,测试和评估不同的方法在处理离线和实时数据中表现出来的性能,监控,并做出相应的调整都是非常重要的。
InfoQ:欺诈检测是流行的机器学习实践场景之一。能否讲述一下如何使用MLlib库实现这种场景呢?
Pentreath:欺诈检测是二元分类问题的一个很好的例子。例如,我们可能希望创建一个模型,可以预测一个给定的网上交易是否是欺诈。潜在的结果只有两种,要么 “欺诈”,要么“没有欺诈”。
MLlib提供了一些适用于二元分类问题的算法,包括线性支持向量机、逻辑回归、决策树、朴素贝叶斯和多层感知。此外,还提供了组合模型(一组模型的组合预测),比如随机森林、梯度提升模型。这些组合模型往往能够在二元分类任务中取得非常不错的表现。
对于任何机器学习问题来说,算法只是解决方案的一部分。在很多情况下,用于训练的输入数据(或“特征”)更为重要。这就是常说的,数据科学家需要花费高比例的时间,将原始输入数据清洗和转换成对机器学习模型有用的特征。
除了以上各种二元分类算法,MLlib还为这些算法提供了一套丰富的处理和转换功能,可以从数据集生成特征。
另一个关键点是使用工具,比如交叉验证(MLlib中可用),严格评价和比较不同特征转换和模型管道的性能,如果可能的话,在实时数据中进行A/B测试。
InfoQ:如何将机器学习和Spark的其他库一起使用,比如Spark Streaming和Spark SQL?
Pentreath:在最初的版本中,Spark MLlib通常是在RDD(即弹性分布式数据集,是Spark的核心数据结构的抽象)上操作的,在RDD中包含了特征向量(以及相关的“标签”或“目标变量”)。
随着DataFrames成为Spark上的SQL核心,MLlib推出了名为Spark ML的新API。特别是,Spark ML关注于使用丰富的、更高级的DataFrame API创建机器学习管道。
一个典型的机器学习工作流是,使用DataFrames读取不同来源的数据。然后,使用Spark SQL过滤、聚合,并执行数据集上的其他初始化处理。接下来,可能涉及的步骤是,使用Spark ML将处理过的数据转换以创建特征向量,随后对模型进行训练和评估。因此,从这个角度上说,Spark中的机器学习与Spark SQL和DataFrames已经深度集成。
Spark Streaming为集群和线性模型提供了流式数据实现。其它的Spark ML模型可以集成于Spark Streaming程序,比如,使用新的数据不断更新的模型,或者我们模型的性能实时监控数据。
Nick还谈到机器学习的未来,以及如何使用Spark MLlib库开发机器学习的应用程序。
Pentreath:尽管机器学习可能看起来好像无处不在,我相信在使用机器学习技术来解决现实世界问题这条路上,我们才刚刚上路。自动化决策的需求数量将会变得更大,所以机器学习将会在许多不同的行业被越来越广泛的应用。
同样地,随着数据量的不断增长,分布式机器学习和大规模数据处理工具将变得越来越重要。可以看到,Apache Spark的核心功能包括解决“大数据”难题,它的MLlib和Spark ML是更容易开发和使用大型机器学习、获得更广用户支持的关键因素。
我对通用机器学习和Apache Spark机器学习的未来充满希望!
可以从Packt的网站上获取关于Nick的书的更多信息,如果你对这本书感兴趣,可以使用这个优惠码“MLWSPK50”购买,这是电子书五折销售的优惠码,有效期至2016年2月29日。
Nick Pentreath是大数据和机器学习公司Graphflow的联合创始人,该公司专注于推荐和客户智能领域。Nick具有金融市场、机器学习和软件开发的背景。他曾是高盛的研究科学家,定向于伦敦创业认知匹配的在线广告。还层领导过非洲最大的社交网络Mxit的数据科学和分析团队。他热衷于结合商业,使用机器学习和尖端科技打造而成智能系统,通过学习数据带来底线的增值。自2013年以来,Nick一直参与Apache Spark项目,是Apache Spark PMC的成员。
查看英文原文:Machine Learning with Spark: Book Review and Interview