写点什么

《Machine Learning with Spark》书评与作者访谈

  • 2016-02-18
  • 本文字数:4772 字

    阅读完需:约 16 分钟

机器学习以现有数据为基础创建模型,通过数据驱动,对未来做出决策或者预测。机器学习在最近几年获得大量的关注,因为它对企业与商业做出决策非常有帮助。

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

2016-02-18 11:553369

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day75

穿过生命散发芬芳

网络攻防 7月日更

你也许连删库跑路都不会

喵叔

7月日更

ClickHouse大数据领域企业级应用实践和探索总结

王知无

前端通讯协议大比拼:WebSockets和HTTP

devpoint

HTTP websocket HTTP2.0 7月日更

傻眼了,我粗略造了一个命令执行的绕过方法居然被同事嫖走了

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞分析

Redis - Cluster - gossip&故障转移

旺仔大菜包

redis cluster

Ansible Playbook - 03

耳东@Erdong

ansible 7月日更 ansible Playbook

在线SVG在线编辑器

入门小站

Linux

Rust从0到1-并发-线程间消息传递

rust 并发 channel 消息传递 Message Passing

浪潮位居全球区块链企业前十、中国前三

疯了吧!这帮人居然用 Go 写“前端”?(二)

尔达Erda

开源 云原生 大前端 PaaS Go 语言

B站崩了,拉垮了豆瓣?程序员不要怕,Alibaba架构师教你如何“预防”

Java架构师迁哥

【大数据面试之对线面试官】MapReduce/HDFS/YARN面试题70连击

王知无

模块二作业

江南巴飞特

Linux之chgrp命令

入门小站

Linux

【LeetCode】在排序数组中查找数字 Java题解

Albert

算法 LeetCode 7月日更

【Flutter 专题】85 Flutter Attach 调试 Flutter Code

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

手写冒泡排序和选择排序算法

实力程序员

推荐大家一个阅读全球计算机论文的好RP

奔着腾讯去

Kubernetes-技术专题-Spring Boot 2.0和 Docker 的微服务快速指南

洛神灬殇

容器 k8s 7月日更

并发操作详解:Goroutines 和 Channels 的声明与使用

微客鸟窝

Go 语言 go并发

自建开发工具系列-Webkit内存动量监控UI(七)

Tim

Script tsconfig

如何在 Discourse 中配置使用 GitHub 登录和创建用户

HoneyMoose

Vue进阶(幺肆拐):利用Vue中keep-alive快速实现页面缓存

No Silver Bullet

Vue 7月日更 keep-alive

基础SQL的实现

卢卡多多

7月日更

“此苹果非彼苹果”看意图识别的那些事儿

百度大脑

人工智能 飞桨 数据抽取

Apache Spark结构化API(三)

Databri_AI

spark API RDD

《持之以恒的从事运动》八

Changing Lin

Mysql,RedisCluster,Kafka,Mongo笔记分享

鲁米

安装

数据中台发展史

escray

学习 极客时间 7月日更 数据中台实战课

到底是先更新数据库还是先更新缓存?

冰河

数据库 缓存 系统架构 分布式系统 缓存一致性

《Machine Learning with Spark》书评与作者访谈_Book Review_Srini Penchikala_InfoQ精选文章