前言
我目前在Google擔任的角色使我可以與很多領域的數(shù)據(jù)科學家和數(shù)據(jù)工程師共同 工作,將數(shù)據(jù)處理和分析流程遷移到公有云上。對于很多工作來說,與在本地部署
上所做的都一樣,方法也相同,區(qū)別只是將環(huán)境換成了租用的計算資源。盡管如此,目光長遠的用戶依然會重新思考他們的系統(tǒng)設計,改變使用數(shù)據(jù)的方式,從而能夠更快地推動創(chuàng)新。
早在 2011 年,《哈佛商業(yè)評論》(Harvard Business Review)的一篇文章就提到, 云計算最大的收益之一,是幫助組織和機構以前所未有的方式共同工作。現(xiàn)在,這 一觀點已得到廣泛認可。麻省理工學院2017年的一項調(diào)查發(fā)現(xiàn),通過向公有云轉(zhuǎn)移, 更多受訪者(45%)表示提高了敏捷性,而不是節(jié)約成本(34%)。
在本書中,我們將用示例向你展示這種全新、具有變革性,且更具協(xié)作性的數(shù)據(jù)科學實踐方法。通過本書,你將學習如何實現(xiàn)端到端的數(shù)據(jù)管道。首先,我們會以無服務器的方式攝取數(shù)據(jù),然后介紹數(shù)據(jù)探索、儀表板、關系型數(shù)據(jù)庫、流數(shù)據(jù),并最終展示如何訓練并運行一個機器學習模型。本書涵蓋了數(shù)據(jù)服務的所有方面,因為對于數(shù)據(jù)工程師來說,他們不僅要參與服務設計、開發(fā)統(tǒng)計和機器學習模型,還要掌握如何在大規(guī)模生產(chǎn)環(huán)境中實時部署和實施。
這本書適合誰
如果你使用計算機處理數(shù)據(jù),那么這本書會適合你。本書針對的讀者可以是數(shù)據(jù)分析師、數(shù)據(jù)庫管理員、數(shù)據(jù)工程師、數(shù)據(jù)科學家,也可以是系統(tǒng)程序員。即使你現(xiàn)在的工作范圍比較有限(也許只進行數(shù)據(jù)分析或構建模型,或者只是DevOps), 但只要你想進一步提升自己,那么就應該了解如何實現(xiàn)數(shù)據(jù)科學建模,以及如何在
生產(chǎn)系統(tǒng)下規(guī);瘜嵤
Google 云計算平臺旨在讓你忽略基礎架構的存在。無論是 Google BigQuery、Cloud Dataflow、Cloud Pub/Sub,還是 Cloud ML引擎,所有這些受歡迎的數(shù)據(jù)服務都是 無服務器且支持自動縮放的。你在 BigQuery 上提交的查詢會在成千上萬的節(jié)點上運 行,然后返回處理結果,你也無需啟動群集或安裝任何軟件。同樣,當你在Cloud Dataflow 中提交數(shù)據(jù)管道,或是在 Cloud Machine Learning Engine 中提交機器學習 任務時,你可以對數(shù)據(jù)進行大規(guī)模處理,并實現(xiàn)大規(guī)模模型訓練,且無需擔心集群 管理或故障恢復。Cloud Pub/Sub 是一項全球消息服務,該服務可以在無需人工干預 的情況下自動對訂閱者和發(fā)布者的吞吐量和數(shù)量進行縮放。即使是開源解決方案(如 Apache Spark),Google云計算平臺也可以輕松滿足你的要求。你可以將數(shù)據(jù)保存 在 Google Cloud Storage上,而不是保存在 HDFS中,然后專門針對你的 Spark任 務啟動一個群集即可。當任務執(zhí)行完成,你可以毫無顧慮地刪除該群集。由于這些群集的基礎架構專門針對特定任務,因此你無需擔心硬件會過度配置,也不必擔心 性能不足等問題。另外,在 Google 云計算平臺上,無論是存儲中還是傳輸中的數(shù)據(jù) 都會被加密,以確保數(shù)據(jù)安全。這種能夠讓數(shù)據(jù)科學家從基礎設施管理工作中得以解放的工作方式,無疑是令人難以置信的。
在 Google云計算平臺上執(zhí)行數(shù)據(jù)任務時,我們之所以能忘記虛擬機和群集的原因 是云計算平臺上的網(wǎng)絡連接性能。Google云計算平臺數(shù)據(jù)中心內(nèi)的網(wǎng)絡單向帶寬為 1 PBps,因此可以持續(xù)、高速地讀取 Cloud Storage 中的數(shù)據(jù)。這就意味著你不需要 像傳統(tǒng)的 MapReduce作業(yè)那樣分割數(shù)據(jù)。相應的,Google云計算平臺可以根據(jù)需 要將數(shù)據(jù)移動到新的計算節(jié)點,從而實現(xiàn)對計算任務的自動伸縮。因此,在 Google 云計算平臺上開展數(shù)據(jù)科學工作時,你可以從群集管理中解放出來。
這些自動縮放、全面托管的云服務使大規(guī)模實施數(shù)據(jù)科學模型變得更加容易,這就是數(shù)據(jù)科學家不再需要將模型交給數(shù)據(jù)工程師的原因。相反,他們可以自己編寫數(shù)據(jù)科學任務、提交到云端,然后這些任務就能以自動伸縮的方式自動執(zhí)行。這種方式同時也讓數(shù)據(jù)科學軟件包變得越來越簡單。因此,對于工程師來說,利用唾手可得的數(shù)據(jù),結合預先準備好的模型來實現(xiàn)并運行自己的原始(通常已經(jīng)是非常高質(zhì)量的)模型已經(jīng)變得非常容易。通過精心設計的軟件包和易于使用的API,你無需 了解數(shù)據(jù)科學算法的深奧細節(jié),所有你需要知道的,只有每種算法的作用以及如何將這些算法連接起來解決實際問題。通過對數(shù)據(jù)科學和數(shù)據(jù)工程進行這種融合,你就可以將自己的翅膀伸展到目前角色之外了。
在閱讀本書時,我強烈建議你嘗試使用示例代碼,而不是簡單地閱讀文字內(nèi)容。本 書提供了用于構建端到端管道的完整代碼,你可以在 GitHub(https://github.com/ GoogleCloudPlatform/data-science-on-gcp)上獲取。你可以創(chuàng)建一個 Google云計 算平臺項目,在閱讀完每一章之后,嘗試參考示例代碼和每個文件夾下的說明文件 README.md 注 1 來重復我們在書中所做的操作。
本書內(nèi)容約定
本書使用以下排版約定:
斜體(italic) 表示新術語、網(wǎng)址、電子郵件地址、文件名和文件擴展名等。
等寬字體(constant width) 表示程序代碼以及段落內(nèi)用于引用的代碼內(nèi)容,如變量或函數(shù)名、數(shù)據(jù)庫、數(shù)
據(jù)類型、環(huán)境變量、聲明語句和關鍵字等。
等寬粗體(constant width bold)
表示應由用戶逐字輸入的命令或其他文本。
等寬斜體(constant width italic) 表示應由用戶提供的值或根據(jù)上下文確定的值而替換的文本。
使用代碼示例 更多補充資料(包括示例代碼、練習等)可以從這里下載https://github.com/ GoogleCloudPlatform/data-science-on-gcp。
本書的目的是幫助你完成工作任務。通常,對于書中提供的示例代碼,你可以直接在自己的程序和文檔中使用,無需聯(lián)系我們獲取授權,除非你要再次分發(fā)大量示例代碼。舉例來說,如果你在編寫程序時使用了本書提供的一部分代碼,不用擔心授 權問題;但如果你要以CD-ROM等方式銷售或分發(fā)O’Reilly系列圖書中的示例代碼, 則需要獲得我們的授權;在解答問題時如需引用本書提供的代碼,你不需要取得授權;但如果你在自己的產(chǎn)品文檔中使用本書的任意代碼,則必須獲得授權。
我們不強制要求版權聲明,但我們感謝你能夠引用本書。引用格式一般包含書 名、作者、出版商和 ISBN,例如:“Data Science on the Google Cloud Platform by Valliappa Lakshmanan (O’Reilly). Copyright 2018 Google Inc.,978-1-491-97456-8”。
如果你認為在使用示例代碼時超出了合理范圍或上述許可范圍,請隨時與我們聯(lián)系:
permissions@oreilly.com。
聯(lián)系我們
任何有關本書的意見或疑問,請按照以下地址聯(lián)系出版社。
美國:
O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街 2 號成銘大廈 C 座 807 室(100035) 奧萊利技術咨詢(北京)有限公司
我們?yōu)楸緯峁┝藢iT的網(wǎng)頁,用于發(fā)布內(nèi)容勘誤、范例和其他相關信息。你可以 通過這里訪問 http://bit.ly/datasci_GCP。
有關本書的任何評論或技術問題,請發(fā)送電子郵件至 bookquestions@oreilly.com。
了解與本書相關的更多信息、課程、會議和新聞,請訪問我們的網(wǎng)站http://www. oreilly.com。
我們的 Facebook:http://facebook.com/oreilly。
我們的 Twitter:http://twitter.com/oreillymedia。
我們的 YouTube: http://www.youtube.com/oreillymedia。
致謝
大約一年前,我在 Google 工作時,我曾經(jīng)簡單地使用公有云作為租賃基礎設施的一 種方式,配置自己的虛擬機,并在虛擬機上安裝我要用的軟件,然后跟平時的工作 流程一樣運行我的數(shù)據(jù)處理任務。幸好,我意識到Google的大數(shù)據(jù)技術棧與眾不同, 所以我開始學習如何充分利用 Google 云計算平臺提供的數(shù)據(jù)和機器學習工具。
對我來說,最好的學習方法是編寫代碼,我也的確在這么做。在一次 Python小組聚 會上,大家讓我講一講 Google 云計算平臺,當時我用自己的代碼做了展示和介紹。 后來的事實證明,在數(shù)據(jù)科學領域,在對比不同解決方法時,對聽眾來說,使用代碼來展示如何構建端到端系統(tǒng)是頗具教育意義的。后來,我就把那次演講的主要內(nèi) 容寫成本書的出版計劃,并發(fā)給了 O’Reilly Media。
當然,本書的內(nèi)容會比 60 分鐘的代碼演示深入許多。想象這樣的場景,有一天在你 上班時收到了一封來自公司新員工發(fā)來的電子郵件,他在你們公司工作的時間還不 到 6 個月,但不知何故,他決定將你負責構建的一套復雜的系統(tǒng)平臺寫成一本書, 并尋求你的幫助。他和你既不在同一個團隊,幫助他也不屬于你的工作職責,你們
甚至不在同一個辦公室工作。你會如何回應?你愿意嗎?
Google之所以能成為理想的工作場所,都是因為這里的同事。這也是 Google公司 文化的一個證明,這里的許多人,無論是工程師、技術主管、產(chǎn)品經(jīng)理、解決方案
架構師、數(shù)據(jù)科學家、法律顧問,還是總監(jiān),他們都可以跨越不同團隊,愉快地將自己的專業(yè)知識分享給他們從未見過的人(實際上我也從未見過其中很多人)。這本書也因為他們的貢獻而變得更好,讓本書受益無窮,這些人包括(按字母順序排 列)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 對本書每章內(nèi)容的精心校對。在本書預覽時,我收到了來自 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 為我指引了前進方向。而 在有些時候,我需要搞清楚公司的政策或需要與正確的團隊建立聯(lián)系,獲取所需的文檔或統(tǒng)計數(shù)據(jù)。對此,我感謝那些在關鍵時刻為我提供幫助的同事,如果沒有 他們,本書會遜色很多(也是按字母順序排列):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 章 用數(shù)據(jù)做出更好的決策 9
許多相似的決策 11
數(shù)據(jù)工程師的角色 12
云計算讓數(shù)據(jù)工程師成為可能 14
云計算使數(shù)據(jù)科學能力得到倍增 18
用案例研究揭示難解的真相 20
基于概率的決策 21
數(shù)據(jù)和工具 27
代碼入門 28
本章總結 30
第 2 章 將數(shù)據(jù)攝取到云端 31
航空公司準點數(shù)據(jù) 31
可知性 33
訓練 – 服務偏差 34
下載程序 35
數(shù)據(jù)集屬性36
為什么不就地存儲數(shù)據(jù)? 38
向上擴展 40
水平擴展 42
使用 Colossus 和 Jupiter 讓數(shù)據(jù)存放在原位 44
攝取數(shù)據(jù) 47
對 Web 表單進行反向工程 48
下載數(shù)據(jù)集51
數(shù)據(jù)探索和清理 53
將數(shù)據(jù)上傳到 Google 云端存儲 55
每月下載計劃 58
使用 Python 攝取數(shù)據(jù) 61
Flask Web App 68
在 App Engine 上運行 69
確保 URL 的安全 70
計劃 Cron 任務 70
本章總結 73
代碼實驗 74
第 3 章 創(chuàng)建引人注目的儀表板 76
使用數(shù)據(jù)儀表板對模型進行解釋 77
為什么要先構建數(shù)據(jù)儀表板? 79
準確、忠實于數(shù)據(jù)且良好的設計 80
將數(shù)據(jù)加載到 Google Cloud SQL 83
創(chuàng)建 Google Cloud SQL 實例 83
與 Google 云計算平臺交互84
控制對 MySQL 的訪問 86
創(chuàng)建表 87
向表中填充數(shù)據(jù) 89
建立第一個模型 90
應急表 91
閾值優(yōu)化 92
機器學習 93
構建數(shù)據(jù)儀表板 94
Data Studio 入門 94
創(chuàng)建圖表 96
為最終用戶添加控件 98
用餅圖顯示所占比例 100
解釋應急表105
本章總結 107
第 4 章 流數(shù)據(jù):發(fā)布和攝取 109
設計事件饋送 109
時間校正 112
Apache Beam/Cloud Dataflow 113
解析機場數(shù)據(jù) 115
添加時區(qū)信息 116
將時間轉(zhuǎn)換為 UTC 117
修正日期 120
創(chuàng)建事件 121
在云中運行數(shù)據(jù)管道 122
將事件流發(fā)布到 Cloud Pub/Sub 126
獲取要發(fā)布的數(shù)據(jù)記錄 129
對數(shù)據(jù)記錄進行分頁 130
構建事件集合 130
發(fā)布事件集合 131
實時流式處理 132
Java Dataflow 中的流式數(shù)據(jù) 133
執(zhí)行流數(shù)據(jù)處理 138
使用 BigQuery 分析流式數(shù)據(jù) 140
實時數(shù)據(jù)儀表板 141
本章總結 144
第 5 章 交互式數(shù)據(jù)探索 145
探索性數(shù)據(jù)分析 146
將航班數(shù)據(jù)加載到 BigQuery 中 148
無服務器列式數(shù)據(jù)庫的優(yōu)點 148
訪問控制 151
聯(lián)合查詢 156
攝取 CSV 文件 158
Cloud Datalab 中的探索性數(shù)據(jù)分析 164
Jupyter 筆記本 165
Cloud Datalab 166
在 Cloud Datalab 中安裝軟件包 169
適用于 Google 云計算平臺的 Jupyter 魔術命令 170
質(zhì)量控制 176
反常的數(shù)值176
清除異常數(shù)據(jù):大數(shù)據(jù)是不同的 178
不同出發(fā)延誤條件下的抵達延誤 182
概率決策閾值的應用 184
經(jīng)驗概率分布函數(shù) 185
答案 187
評估模型 188
隨機亂序分組 188
按日期分割189
訓練和測試191
本章總結 196
第 6 章 Cloud Dataproc上的 貝葉斯分類器 197
MapReduce 和 Hadoop 生態(tài)系統(tǒng) 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
動態(tài)調(diào)整群集大小 219
使用 Pig 實現(xiàn)貝葉斯分類 222
在 Cloud Dataproc 上運行 Pig 任務 224
將日期限制在訓練數(shù)據(jù)集中 225
決策標準 226
對貝葉斯模型進行評估 229
本章總結 231
第 7 章 機器學習:Spark上的邏輯回歸 233
邏輯回歸 234
Spark 機器學習庫 237
開始使用 Spark 機器學習 238
Spark 邏輯回歸 239
創(chuàng)建訓練數(shù)據(jù)集 241
處理邊界情況 243
創(chuàng)建訓練示例 245
訓練 246
使用模型進行預測 249
對模型進行評估 250
特征工程 253
實驗框架 254
創(chuàng)建保留數(shù)據(jù)集 257
特性點的選擇 258
特征點的縮放和剪切 261
特征轉(zhuǎn)換 263
變量分類 267
可擴展、可重復和實時性 269
本章總結 270
第 8 章 時間窗化的聚合特征 272
平均時間的需求 272
Java 中的 Dataflow 274
建立開發(fā)環(huán)境 275
使用 Beam 過濾數(shù)據(jù) 276
數(shù)據(jù)管道的控制選項和文本 I/O 280
在云端運行281
解析為對象283
計算平均時間 286
分組及合并286
并行執(zhí)行和側面輸入 289
調(diào)試 291
BigQueryIO 292
對航班對象進行轉(zhuǎn)換 294
批處理模式下的滑動窗口計算 295
在云端運行297
監(jiān)控、故障排除和性能調(diào)整 299
數(shù)據(jù)管道的故障排除 301
側面輸入的限制 302
重新設計數(shù)據(jù)管道 305
刪除重復項307
本章總結 310
第 9 章 使用TensorFlow的 機器學習分類器 312
使用更復雜的模型 313
將數(shù)據(jù)讀入 TensorFlow 317
建立實驗 322
線性分類器323
訓練和評估的輸入函數(shù) 325
服務輸入函數(shù) 326
創(chuàng)建實驗 326
執(zhí)行訓練 327
云中的分布式訓練 329
對 ML 模型進行改進 331
深度神經(jīng)網(wǎng)絡模型 332
嵌入 335
寬深模型 337
超參數(shù)調(diào)整341
部署模型 349
使用模型預測 350
對該模型的解釋 351
本章總結 353
第 10章 實時機器學習 355
調(diào)用預測服務 356
用于服務請求和響應的 Java 類357
發(fā)送請求并解析響應 359
預測服務的客戶端 360
將預測結果添加到航班信息 361
批量輸入和輸出 361
數(shù)據(jù)處理管道 363
識別無效的服務響應 364
批量處理服務請求 365
流式數(shù)據(jù)管道 367
扁平化 PCollections 368
執(zhí)行流式數(shù)據(jù)管道 369
延遲的和無序的數(shù)據(jù)記錄 371
水印和觸發(fā)器 376
事務,吞吐量和延遲 378
幾種可選的流式接收器 379
Cloud Bigtable 380
設計表 382
設計行鍵 383
流式傳輸至 Cloud Bigtable 384
查詢 Cloud Bigtable 中的數(shù)據(jù) 386
評估模型的性能 387
持續(xù)訓練的必要性 388
評估管道 389
性能評估 391
邊際分布 391
檢查模型的行為 393
識別行為變化 396
本章總結 398
全書總結 398
附錄 有關機器學習數(shù)據(jù)集中敏感數(shù)據(jù)的注意事項 401