前言
我目前在Google担任的角色使我可以与很多领域的数据科学家和数据工程师共同 工作,将数据处理和分析流程迁移到公有云上。对于很多工作来说,与在本地部署
上所做的都一样,方法也相同,区别只是将环境换成了租用的计算资源。尽管如此,目光长远的用户依然会重新思考他们的系统设计,改变使用数据的方式,从而能够更快地推动创新。
早在 2011 年,《哈佛商业评论》(Harvard Business Review)的一篇文章就提到, 云计算最大的收益之一,是帮助组织和机构以前所未有的方式共同工作。现在,这 一观点已得到广泛认可。麻省理工学院2017年的一项调查发现,通过向公有云转移, 更多受访者(45%)表示提高了敏捷性,而不是节约成本(34%)。
在本书中,我们将用示例向你展示这种全新、具有变革性,且更具协作性的数据科学实践方法。通过本书,你将学习如何实现端到端的数据管道。首先,我们会以无服务器的方式摄取数据,然后介绍数据探索、仪表板、关系型数据库、流数据,并最终展示如何训练并运行一个机器学习模型。本书涵盖了数据服务的所有方面,因为对于数据工程师来说,他们不仅要参与服务设计、开发统计和机器学习模型,还要掌握如何在大规模生产环境中实时部署和实施。
这本书适合谁
如果你使用计算机处理数据,那么这本书会适合你。本书针对的读者可以是数据分析师、数据库管理员、数据工程师、数据科学家,也可以是系统程序员。即使你现在的工作范围比较有限(也许只进行数据分析或构建模型,或者只是DevOps), 但只要你想进一步提升自己,那么就应该了解如何实现数据科学建模,以及如何在
生产系统下规模化实施。
Google 云计算平台旨在让你忽略基础架构的存在。无论是 Google BigQuery、Cloud Dataflow、Cloud Pub/Sub,还是 Cloud ML引擎,所有这些受欢迎的数据服务都是 无服务器且支持自动缩放的。你在 BigQuery 上提交的查询会在成千上万的节点上运 行,然后返回处理结果,你也无需启动群集或安装任何软件。同样,当你在Cloud Dataflow 中提交数据管道,或是在 Cloud Machine Learning Engine 中提交机器学习 任务时,你可以对数据进行大规模处理,并实现大规模模型训练,且无需担心集群 管理或故障恢复。Cloud Pub/Sub 是一项全球消息服务,该服务可以在无需人工干预 的情况下自动对订阅者和发布者的吞吐量和数量进行缩放。即使是开源解决方案(如 Apache Spark),Google云计算平台也可以轻松满足你的要求。你可以将数据保存 在 Google Cloud Storage上,而不是保存在 HDFS中,然后专门针对你的 Spark任 务启动一个群集即可。当任务执行完成,你可以毫无顾虑地删除该群集。由于这些群集的基础架构专门针对特定任务,因此你无需担心硬件会过度配置,也不必担心 性能不足等问题。另外,在 Google 云计算平台上,无论是存储中还是传输中的数据 都会被加密,以确保数据安全。这种能够让数据科学家从基础设施管理工作中得以解放的工作方式,无疑是令人难以置信的。
在 Google云计算平台上执行数据任务时,我们之所以能忘记虚拟机和群集的原因 是云计算平台上的网络连接性能。Google云计算平台数据中心内的网络单向带宽为 1 PBps,因此可以持续、高速地读取 Cloud Storage 中的数据。这就意味着你不需要 像传统的 MapReduce作业那样分割数据。相应的,Google云计算平台可以根据需 要将数据移动到新的计算节点,从而实现对计算任务的自动伸缩。因此,在 Google 云计算平台上开展数据科学工作时,你可以从群集管理中解放出来。
这些自动缩放、全面托管的云服务使大规模实施数据科学模型变得更加容易,这就是数据科学家不再需要将模型交给数据工程师的原因。相反,他们可以自己编写数据科学任务、提交到云端,然后这些任务就能以自动伸缩的方式自动执行。这种方式同时也让数据科学软件包变得越来越简单。因此,对于工程师来说,利用唾手可得的数据,结合预先准备好的模型来实现并运行自己的原始(通常已经是非常高质量的)模型已经变得非常容易。通过精心设计的软件包和易于使用的API,你无需 了解数据科学算法的深奥细节,所有你需要知道的,只有每种算法的作用以及如何将这些算法连接起来解决实际问题。通过对数据科学和数据工程进行这种融合,你就可以将自己的翅膀伸展到目前角色之外了。
在阅读本书时,我强烈建议你尝试使用示例代码,而不是简单地阅读文字内容。本 书提供了用于构建端到端管道的完整代码,你可以在 GitHub(https://github.com/ GoogleCloudPlatform/data-science-on-gcp)上获取。你可以创建一个 Google云计 算平台项目,在阅读完每一章之后,尝试参考示例代码和每个文件夹下的说明文件 README.md 注 1 来重复我们在书中所做的操作。
本书内容约定
本书使用以下排版约定:
斜体(italic) 表示新术语、网址、电子邮件地址、文件名和文件扩展名等。
等宽字体(constant width) 表示程序代码以及段落内用于引用的代码内容,如变量或函数名、数据库、数
据类型、环境变量、声明语句和关键字等。
等宽粗体(constant width bold)
表示应由用户逐字输入的命令或其他文本。
等宽斜体(constant width italic) 表示应由用户提供的值或根据上下文确定的值而替换的文本。
使用代码示例 更多补充资料(包括示例代码、练习等)可以从这里下载https://github.com/ GoogleCloudPlatform/data-science-on-gcp。
本书的目的是帮助你完成工作任务。通常,对于书中提供的示例代码,你可以直接在自己的程序和文档中使用,无需联系我们获取授权,除非你要再次分发大量示例代码。举例来说,如果你在编写程序时使用了本书提供的一部分代码,不用担心授 权问题;但如果你要以CD-ROM等方式销售或分发O’Reilly系列图书中的示例代码, 则需要获得我们的授权;在解答问题时如需引用本书提供的代码,你不需要取得授权;但如果你在自己的产品文档中使用本书的任意代码,则必须获得授权。
我们不强制要求版权声明,但我们感谢你能够引用本书。引用格式一般包含书 名、作者、出版商和 ISBN,例如:“Data Science on the Google Cloud Platform by Valliappa Lakshmanan (O’Reilly). Copyright 2018 Google Inc.,978-1-491-97456-8”。
如果你认为在使用示例代码时超出了合理范围或上述许可范围,请随时与我们联系:
permissions@oreilly.com。
联系我们
任何有关本书的意见或疑问,请按照以下地址联系出版社。
美国:
O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472
中国:
北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室(100035) 奥莱利技术咨询(北京)有限公司
我们为本书提供了专门的网页,用于发布内容勘误、范例和其他相关信息。你可以 通过这里访问 http://bit.ly/datasci_GCP。
有关本书的任何评论或技术问题,请发送电子邮件至 bookquestions@oreilly.com。
了解与本书相关的更多信息、课程、会议和新闻,请访问我们的网站http://www. oreilly.com。
我们的 Facebook:http://facebook.com/oreilly。
我们的 Twitter:http://twitter.com/oreillymedia。
我们的 YouTube: http://www.youtube.com/oreillymedia。
致谢
大约一年前,我在 Google 工作时,我曾经简单地使用公有云作为租赁基础设施的一 种方式,配置自己的虚拟机,并在虚拟机上安装我要用的软件,然后跟平时的工作 流程一样运行我的数据处理任务。幸好,我意识到Google的大数据技术栈与众不同, 所以我开始学习如何充分利用 Google 云计算平台提供的数据和机器学习工具。
对我来说,最好的学习方法是编写代码,我也的确在这么做。在一次 Python小组聚 会上,大家让我讲一讲 Google 云计算平台,当时我用自己的代码做了展示和介绍。 后来的事实证明,在数据科学领域,在对比不同解决方法时,对听众来说,使用代码来展示如何构建端到端系统是颇具教育意义的。后来,我就把那次演讲的主要内 容写成本书的出版计划,并发给了 O’Reilly Media。
当然,本书的内容会比 60 分钟的代码演示深入许多。想象这样的场景,有一天在你 上班时收到了一封来自公司新员工发来的电子邮件,他在你们公司工作的时间还不 到 6 个月,但不知何故,他决定将你负责构建的一套复杂的系统平台写成一本书, 并寻求你的帮助。他和你既不在同一个团队,帮助他也不属于你的工作职责,你们
甚至不在同一个办公室工作。你会如何回应?你愿意吗?
Google之所以能成为理想的工作场所,都是因为这里的同事。这也是 Google公司 文化的一个证明,这里的许多人,无论是工程师、技术主管、产品经理、解决方案
架构师、数据科学家、法律顾问,还是总监,他们都可以跨越不同团队,愉快地将自己的专业知识分享给他们从未见过的人(实际上我也从未见过其中很多人)。这本书也因为他们的贡献而变得更好,让本书受益无穷,这些人包括(按字母顺序排 列)William Brockman、Mike Dahlin、Tony Diloreto、Bob Evans、Roland Hess、 Brett Hesterberg、Dennis Huo、Chad Jennings、Puneith Kaul、Dinesh Kulkarni、 Manish Kurse、Reuven Lax、Jonathan Liu、James Malone、Dave Oleson、Mosha Pasumansky、Kevin Peterson、Olivia Puerta、Reza Rokni、Karn Seth、Sergei Sokolenko 及 Amy Unruh。同时,我还要特别感谢 Mike Dahlin、Manish Kurse和 Olivia Puerta 对本书每章内容的精心校对。在本书预览时,我收到了来自 Anthonios Partheniou和 David Schwantner的错误报告,这些报告很有价值。不用多说,任何 遗留的错误都由我负责。
在写作本书时,我曾一度陷入困境。有时候,遇到的是技术问题,对此我要感谢 (按字母顺序排列)Ahmet Altay、Eli Bixby、Ben Chambers、Slava Chernyak、 Marian Dvorsky、Robbie Haertel、Felipe Hoffa、Amir Hormati、Qi-ming (Bradley) Jiang、Kenneth Knowles、Nikhil Kothari 和 Chris Meyers 为我指引了前进方向。而 在有些时候,我需要搞清楚公司的政策或需要与正确的团队建立联系,获取所需的文档或统计数据。对此,我感谢那些在关键时刻为我提供帮助的同事,如果没有 他们,本书会逊色很多(也是按字母顺序排列):Louise Byrne、Apurva Desai、 Rochana Golani、Fausto Ibarra、Jason Martin、Neal Mueller、Philippe Poutonnet、 Brad Svee、Jordan Tigani、William Vampenebe和Miles Ward。谢谢大家的帮助和鼓励。
同时,我还要感谢 O’Reilly 团队的 Marie Beaugureau、Kristen Brown、Ben Lorica、 Tim McGovern、Rachel Roumeliotis 和 Heather Scherer 对我的信任,从而让本书从 草稿到出版没有遇到问题。
最后,也是最重要的,我要感谢 Abirami、Sidharth和 Sarada的理解和耐心,当我 专注于写作和编码时,他们亦是如此。是你们,让这一切变得有价值。
目录
前言 1
第 1 章 用数据做出更好的决策 9
许多相似的决策 11
数据工程师的角色 12
云计算让数据工程师成为可能 14
云计算使数据科学能力得到倍增 18
用案例研究揭示难解的真相 20
基于概率的决策 21
数据和工具 27
代码入门 28
本章总结 30
第 2 章 将数据摄取到云端 31
航空公司准点数据 31
可知性 33
训练 – 服务偏差 34
下载程序 35
数据集属性36
为什么不就地存储数据? 38
向上扩展 40
水平扩展 42
使用 Colossus 和 Jupiter 让数据存放在原位 44
摄取数据 47
对 Web 表单进行反向工程 48
下载数据集51
数据探索和清理 53
将数据上传到 Google 云端存储 55
每月下载计划 58
使用 Python 摄取数据 61
Flask Web App 68
在 App Engine 上运行 69
确保 URL 的安全 70
计划 Cron 任务 70
本章总结 73
代码实验 74
第 3 章 创建引人注目的仪表板 76
使用数据仪表板对模型进行解释 77
为什么要先构建数据仪表板? 79
准确、忠实于数据且良好的设计 80
将数据加载到 Google Cloud SQL 83
创建 Google Cloud SQL 实例 83
与 Google 云计算平台交互84
控制对 MySQL 的访问 86
创建表 87
向表中填充数据 89
建立第一个模型 90
应急表 91
阈值优化 92
机器学习 93
构建数据仪表板 94
Data Studio 入门 94
创建图表 96
为最终用户添加控件 98
用饼图显示所占比例 100
解释应急表105
本章总结 107
第 4 章 流数据:发布和摄取 109
设计事件馈送 109
时间校正 112
Apache Beam/Cloud Dataflow 113
解析机场数据 115
添加时区信息 116
将时间转换为 UTC 117
修正日期 120
创建事件 121
在云中运行数据管道 122
将事件流发布到 Cloud Pub/Sub 126
获取要发布的数据记录 129
对数据记录进行分页 130
构建事件集合 130
发布事件集合 131
实时流式处理 132
Java Dataflow 中的流式数据 133
执行流数据处理 138
使用 BigQuery 分析流式数据 140
实时数据仪表板 141
本章总结 144
第 5 章 交互式数据探索 145
探索性数据分析 146
将航班数据加载到 BigQuery 中 148
无服务器列式数据库的优点 148
访问控制 151
联合查询 156
摄取 CSV 文件 158
Cloud Datalab 中的探索性数据分析 164
Jupyter 笔记本 165
Cloud Datalab 166
在 Cloud Datalab 中安装软件包 169
适用于 Google 云计算平台的 Jupyter 魔术命令 170
质量控制 176
反常的数值176
清除异常数据:大数据是不同的 178
不同出发延误条件下的抵达延误 182
概率决策阈值的应用 184
经验概率分布函数 185
答案 187
评估模型 188
随机乱序分组 188
按日期分割189
训练和测试191
本章总结 196
第 6 章 Cloud Dataproc上的 贝叶斯分类器 197
MapReduce 和 Hadoop 生态系统 197
MapReduce 的工作原理 198
Apache Hadoop 200
Google Cloud Dataproc200
需要更高级的工具 202
关注任务,而不是集群 204
初始化操作205
使用 Spark SQL 进行量化 206
Cloud Dataproc 上的 Google Cloud Datalab 208
使用 BigQuery 进行独立检查 209
Google Cloud Datalab 中的 Spark SQL 211
直方图均衡化 215
动态调整群集大小 219
使用 Pig 实现贝叶斯分类 222
在 Cloud Dataproc 上运行 Pig 任务 224
将日期限制在训练数据集中 225
决策标准 226
对贝叶斯模型进行评估 229
本章总结 231
第 7 章 机器学习:Spark上的逻辑回归 233
逻辑回归 234
Spark 机器学习库 237
开始使用 Spark 机器学习 238
Spark 逻辑回归 239
创建训练数据集 241
处理边界情况 243
创建训练示例 245
训练 246
使用模型进行预测 249
对模型进行评估 250
特征工程 253
实验框架 254
创建保留数据集 257
特性点的选择 258
特征点的缩放和剪切 261
特征转换 263
变量分类 267
可扩展、可重复和实时性 269
本章总结 270
第 8 章 时间窗化的聚合特征 272
平均时间的需求 272
Java 中的 Dataflow 274
建立开发环境 275
使用 Beam 过滤数据 276
数据管道的控制选项和文本 I/O 280
在云端运行281
解析为对象283
计算平均时间 286
分组及合并286
并行执行和侧面输入 289
调试 291
BigQueryIO 292
对航班对象进行转换 294
批处理模式下的滑动窗口计算 295
在云端运行297
监控、故障排除和性能调整 299
数据管道的故障排除 301
侧面输入的限制 302
重新设计数据管道 305
删除重复项307
本章总结 310
第 9 章 使用TensorFlow的 机器学习分类器 312
使用更复杂的模型 313
将数据读入 TensorFlow 317
建立实验 322
线性分类器323
训练和评估的输入函数 325
服务输入函数 326
创建实验 326
执行训练 327
云中的分布式训练 329
对 ML 模型进行改进 331
深度神经网络模型 332
嵌入 335
宽深模型 337
超参数调整341
部署模型 349
使用模型预测 350
对该模型的解释 351
本章总结 353
第 10章 实时机器学习 355
调用预测服务 356
用于服务请求和响应的 Java 类357
发送请求并解析响应 359
预测服务的客户端 360
将预测结果添加到航班信息 361
批量输入和输出 361
数据处理管道 363
识别无效的服务响应 364
批量处理服务请求 365
流式数据管道 367
扁平化 PCollections 368
执行流式数据管道 369
延迟的和无序的数据记录 371
水印和触发器 376
事务,吞吐量和延迟 378
几种可选的流式接收器 379
Cloud Bigtable 380
设计表 382
设计行键 383
流式传输至 Cloud Bigtable 384
查询 Cloud Bigtable 中的数据 386
评估模型的性能 387
持续训练的必要性 388
评估管道 389
性能评估 391
边际分布 391
检查模型的行为 393
识别行为变化 396
本章总结 398
全书总结 398
附录 有关机器学习数据集中敏感数据的注意事项 401