➣ Reading Time: 29 minutes

前言

我們來做 How Google does Machine Learning 的第二個lab~

這次鐵人賽的30天中,我目前所寫文章的所有課程目錄如下:

Course – How Google does Machine Learning

第五章節的課程地圖:(紅字標記為本篇文章中會介紹到的章節)
* Python notebooks in the cloud
* Module Introduction
* Cloud Datalab
* Cloud Datalab
* Demo: Cloud Datalab
* Development process
* Demo of rehosting Cloud Datalab
* Working with managed services
* Computation and storage
* Lab: Rent-a-VM
* Intro to Qwiklabs
* Intro to Renting-VM Lab
* Lab: Rent-a-VM to process earthquake data
* Lab debrief
* Cloud Shell
* Third wave of cloud
* Third Wave of Cloud: Fully-Managed Services
* Third Wave of Cloud: Serverless Data Analysis
* Third Wave of Cloud: BigQuery and Cloud Datalab
* Datalab and BigQuery
* Lab Intro: Analyzing data using Datalab and BigQuery
* Lab: Analyzing data using Datalab and BigQuery
* Lab Debrief: Analyzing Data using Datalab and BigQuery
* Machine Learning with Sara Robinson
* ML, not rules
* Pre-trained ML APIs
* Vision API in action
* Video intelligence API
* Cloud Speech API
* Translation and NL
* Lab: Machine Learning APIs
* Lab: Pretrained ML APIs Intro
* Lab: Invoking Machine Learning APIs
* Lab Solution


Lab: Analyzing Data using Datalab and BigQuery

課程地圖
* Python notebooks in the cloud
* Datalab and BigQuery
* Lab Intro: Analyzing data using Datalab and BigQuery
* Lab: Analyzing data using Datalab and BigQuery
* Lab Debrief: Analyzing Data using Datalab and BigQuery

在這個lab中,我們將使用BigQuery去分析7000萬行左右的資料,
並將結果以幾十行的Pandas DataFrame輸出。
再來我們可以直接使用Pandas DataFrame的結果作資料視覺化。

註:BigQuery = 大量資料分析工具

在這裡我們只需要數秒鐘就可以創建圖形,這是使用其他方法可能做不到的。
然而,在互動式的開發流程中我們會很需要即時的分析,
對於大量資料的處理來說,這樣的速度是重要的,

你可能會想說,那就不要處理這麼多資料就好了啊?
問題是,如果我們處理的資料量小,這就不會是個好的 machine learning practice的範例了。

統計方法machine learning 的關鍵差別?

另外一件事情是,我們想順便討論 統計方法machine learning 的關鍵差別,
關於我們如何處理離群值

在統計方法中,我們會傾向移除離群值。
但在 machine learning 中,離群值也會是我們學習的內容。
而且如果要學習離群值,我們也必須要有足夠的離群值資料,
我們還需要確保這些離群值在資料集中被分配,做好管理完整dataset的工作就顯得重要。

在這個實驗中我們提供了BigQuery能幫助你管理大量的dataset,
然後能替我們帶來更習慣的資料結構(例如:Pandas),
我們也可以使用python的繪圖工具製圖,就是我們這個lab的主要內容。


part 0 : (事前準備) 開啟 GCP console

請先參考 【Day 9】- 每次在google雲端上開始lab前都要的事前準備與注意事項 的內容,完成到運行中階段


part 1 : (建立機器) 建立 Datalab VM

Step 0 : 打開 Cloud Shell

如果不清楚 Cloud Shell 如何開啟,請參考 【Day 11】- Cloud Shell 的介紹與 google雲的三代變化, 使用ML與一般演算法的比較與優勢

Step 1 : 首先我們要先知道我們的 compute zones 在哪,我們可以透過以下指令知道我們所有的 compute zones 位置,我們會在其中一個 compute zones 運行我們的 Datalab。

gcloud compute zones list

註:影片中的範例使用的是 U.S. Central。

Step 2 : 我們透過以下指令創建我們的 datalab VM。

datalab create mydatalabvm --zone <ZONE>
  • <ZONE>: 這個必須更改為Step 2中,我們所找到compute zones的名字。
  • 依照影片中的範例,我們必須填入:datalab create mydatalabvm --zone us-central1-b

創建過程約需稍等五分鐘。

Step 3 : 創建過程中,可能會碰到如紅框處的問題(詢問ssh passphrase)。

第一個問題回答 “Y”
第二三個問題直接按 “Enter” return即可。

https://ithelp.ithome.com.tw/upload/images/20190913/20120424cCgWtjRWxm.png

Step 4 : 直到看到下方處出現請你開啟 “Web Preview” 的訊息才算建立完成,這時按 Cloud Shell 的右上角,
點選 Change Port,並更換我們的 port 至 8081,完成後點選 CHANGE AND PREVIEW。

https://ithelp.ithome.com.tw/upload/images/20190913/20120424ROXbAmTiE1.png


part 2 : (啟用API) 開啟 Cloud Source Repositories API

Step 1 : 確定 Cloud Source Repositories API 是被開啟的:

點選一下網址,記得要切換至”Qwiklabs所提供的帳號“開啟API應用。

https://console.cloud.google.com/apis/library/sourcerepo.googleapis.com/?q=Repositories


part 3 : (分析資料) 使用 BigQuery 分析資料

Step 1 : 我們先從 Google Console開啟 BigQuery (紅框處),一樣透過”Qwiklabs所提供的帳號密碼“來進行登入

https://ithelp.ithome.com.tw/upload/images/20190913/201204243387vqEnVT.png

稍微確認一下 Project名稱是否與 Qwiklabs的名稱相同。

Step 2 : 我們可以按 COMPOSE QUERY 開始執行QUERY的視窗。(紅框處,實際介面可能稍有不同。)

https://ithelp.ithome.com.tw/upload/images/20190913/20120424Z3jvFyiRW7.png

Step 3 : 在執行QUERY的視窗輸入以下指令,並執行。

#standardSQL
SELECT
  departure_delay,
  COUNT(1) AS num_flights,
  APPROX_QUANTILES(arrival_delay, 5) AS arrival_delay_quantiles
FROM
  `bigquery-samples.airline_ontime_data.flights`
GROUP BY
  departure_delay
HAVING
  num_flights > 100
ORDER BY
  departure_delay ASC

這是 standard SQL的語法。
但同樣的我們也可以不使用standard SQL的語法,我們點選 Show Options。
我們可以看到更多選項,並取消勾選 Legacy SQL。
https://ithelp.ithome.com.tw/upload/images/20190913/20120424x79kA84E2b.png

我們在稍微注意一下語法中From的部分,我們會發現這個dataset來自 bigquery-samples 中的 airline_ontime_data,而 table 的名字是 flights。

https://ithelp.ithome.com.tw/upload/images/20190914/20120424ewzDjezLhR.png

Step 4 : (練習題) 試從以下的結果判斷:35分前離開的班機延遲抵達時間的中位數是多少?

https://ithelp.ithome.com.tw/upload/images/20190914/201204247HKIbukJQx.png

說明:我們先看Step 3中例子的圖來解釋,departure_dalay:表示班機離開的時間,-37也表示37分鐘前離開。
我們可以看到在num_flights中找到107個班機35分前離開,這些格子細分成五格表示五個級距,
-66 表示80%飛機抵達時提前66分鐘或更早,-41~-66 表示 60%~80% 飛機在這個區間抵達。

解答: 所以如果我們問你35分前離開的班機延遲抵達時間的中位數是多少? 答案就是提早28分鐘到達。

Step 5 : (練習題2) 試著寫一個Query找出:擁有最大的航班數的airport pair (departure and arrival airport)。(指的是兩機場間的航班數最多)

參考解答:

#standardSQL
SELECT
  departure_airport,
  arrival_airport,
  COUNT(1) AS num_flights
FROM
  `bigquery-samples.airline_ontime_data.flights`
GROUP BY
  departure_airport,
  arrival_airport
ORDER BY
  num_flights DESC
LIMIT
  10

解釋:
* 我們先用GROUP BY,將 departure_airport, arrival_airport選定
* 並在 departure_airport, arrival_airport 用 COUNT(1) AS num_flights,計算兩機場的總航班數
* ORDER BY可以幫助我們排序,num_flights DESC,表示 num_flights的降序排列,因為透過降序我們就可以找到最多數量的位於最上方。
* LIMIT限制10,因為我們只要找最多,所以也不需要顯示太多結果。

結果:LAX(起飛) 與 SAN(降落) 一共有 133394 航班數。
https://ithelp.ithome.com.tw/upload/images/20190914/20120424SwTXGX93fu.png

我們約花2.3秒搜尋了7000萬筆的資料。看似不可思議,但其實這就是數以千計的電腦一起搜尋的結果。
這就是我們所說的 run at scale,也是雲端運行服務,我們不必自己負擔運算過程,達到serverless的效果。

part 4 : (視覺化結果) 使用 Datalab 建立視覺化結果

BigQuery分析東西很方便,但他沒辦法幫我們視覺化的分析結果,
我們現在用Datalab來幫助我們建立視覺化結果。

Step 0 : 接下來會直接使用 Cloud Datalab 跑 pyhton 程式

如果不清楚 Cloud Datalab 的基本指令與運作,請先複習 【Day 8】- 先來初步認識一下google雲端上執行 python notebook (Cloud Datalab) 的環境

Step 1 : 我們回到 part 1 所開啟的 Datalab,按左上角開啟一個新的 notebook。

https://ithelp.ithome.com.tw/upload/images/20190914/20120424hgoNuzUOPU.png

Step 2 : 我們在第一格cell中貼上這段code,這段code是呼叫BigQuery幫我們執行的,我們只是透過API串接過來使Datalab能夠使用。

query="""
SELECT
  departure_delay,
  COUNT(1) AS num_flights,
  APPROX_QUANTILES(arrival_delay, 10) AS arrival_delay_deciles
FROM
  `bigquery-samples.airline_ontime_data.flights`
GROUP BY
  departure_delay
HAVING
  num_flights > 100
ORDER BY
  departure_delay ASC
"""

import google.datalab.bigquery as bq
df = bq.Query(query).execute().result().to_dataframe()
df.head()

而在code的最後幾行.to_dataframe(),將我們回傳的資料轉成 Pandas Dataframes。
我們也可以透過.head(),從結果中先偷看前幾行的內容。
也正如同我們之前在BigQuery所執行的一樣,有departure_delay, number of flights…,
但這例子中我們有10分位數,因為我們在APPROX_QUANTILES(arrival_delay, 10)中下了數字10,所以我們可以得到10個數字。

https://ithelp.ithome.com.tw/upload/images/20190914/20120424sr647YT0R4.png

Step 3 : 我們在第二格cell中貼上這段code。

import pandas as pd
percentiles = df['arrival_delay_deciles'].apply(pd.Series)
percentiles = percentiles.rename(columns = lambda x : str(x*10) + "%")
df = pd.concat([df['departure_delay'], percentiles], axis=1)
df.head()

這段code能幫助我們把十分位數的部分整個分開整理清楚,如下圖。
分開的原因與下步驟的製圖有關係。

https://ithelp.ithome.com.tw/upload/images/20190914/20120424JIf4DwHTHy.png

Step 4 : 我們在第三格cell中貼上這段code。

without_extremes = df.drop(['0%', '100%'], 1)
without_extremes.plot(x='departure_delay', xlim=(-30,50), ylim=(-50,50));

在第一行.drop(['0%', '100%'], 1),我們先將0%, 100%的結果移除,不畫入圖中,
我們在最後的結果只使用10%~90%的資料。

https://ithelp.ithome.com.tw/upload/images/20190914/20120424TDJbI4eAMB.png

我們試著閱讀這張圖,departure_delay如果是10,表示10分鐘delay,
我們可以看見10%的班機仍然可以提前到達,但90%的班機會晚21分鐘以上到達。
另外一方面中位數(50%)的 departure_delay 所對應到的 arrival_delay 約提早3~4分鐘。

我們看結果會發現,除了一些 -20 以下的結果,這些結果的呈現滿線性的,
我們的結果只要在中間不在邊緣,基本上可以做一個縣性模型。

現在我們可以回來想,我們分析了多大的資料才能得到這樣的結果,
這樣的insight,正是一種很難透過其他方式能獲得的結果。


本文同步發佈在: 第 11 屆 iT 邦幫忙鐵人賽
【Day 13】 Google ML – Lab 2 – Analyzing Data using Datalab and BigQuery – 使用 BigQuery與Datalab視覺化分析資料


參考資料

⭐Google Machine Learning 相關文章整理⭐:
1.訂閱課程【Google ML】1 – Google ML – 參賽原因 與 就先從認識 coursera 與訂閱課程開始第一天吧
⭐ML 基礎知識篇⭐:
1.基礎ML知識什麼是ML? 為什麼ML最近才紅起來? 可參考:【Day 3】
2.設計ML問題如何設計一個ML問題?可參考:【Day 4】
3.ML與一般算法比較比較一般算法與ML算法,看出ML的優勢。可參考:【Day 11】
⭐ML 應用策略篇⭐:
1.ML的成功策略使用ML要成功,常需要的關鍵策略。可參考:【Day 5】
2.ML各階段與比重分配企業運行ML時,在ML的各階段應該放的比重與心力。可參考:【Day 6】
3.ML失敗的常見原因大部分企業使用ML卻失敗的前十大主因。可參考:【Day 6】
4.企業如何引入MLML在企業運行的五大階段與注意事項。 可參考:【Day 7】
⭐GCP 認識篇⭐:
1.在GCP上運行ML的階段在GCP上運行ML大概有哪五大階段? 可參考:【Day 2】
2.GCP上ML的介紹GCP上ML的介紹。可參考:【Day 8】【Day 11】
3.已訓練好的ML模型已訓練好的ML模型。建議可直接使用,不需要再自己訓練。如:Vision API(圖片辨識), Video intelligence API(影片辨識), Speech API(語音辨識), Translation API(語言翻譯), Natural Language API(自然語言處理)。介紹:【Day 4】詳細整理與比較:【Day 12】lab實作:【Day 14】
⭐GCP 上的 lab 實作篇⭐:
1.Lab 事前準備Lab 0 – 在GCP上開始lab前的事前準備與注意事項。可參考:【Day 9】
2.GCP上使用 VMLab 1 – 在GCP上分析地震資料與製圖,並儲存在雲端。可參考: 【Day 10】
3.BigQuery 與 DatalabLab 2 – 使用 BigQuery 與 Datalab 視覺化分析資料。可參考:【Day 13】
4.google ML APIsLab 3 – 使用google已訓練好的ML模型進行實作。如:Vision API(圖片辨識), Video intelligence API(影片辨識), Speech API(語音辨識), Translation API(語言翻譯), Natural Language API(自然語言處理)。可參考:【Day 14】
⭐ML中的不同學習種類⭐:
1.【Day 15】 監督式學習(Supervised Learning) 與 非監督式學習(Unsupervised Learning) 的介紹和比較
⭐訓練「一個」ML模型⭐:
(這裡以 監督式學習(Supervised Learning) 為例)
1. (訓練前)決定資料集與分析資料你想要預測的是什麼資料? 這邊需要先知道 example、label、features的概念。介紹可參考:【Day 15】而我們這次作為範例的訓練資料集介紹在:【Day 19】
2. (訓練前)決定問題種類依據資料,會知道是什麼類型的問題。regression problem(回歸問題)? classification problem(分類問題)? 此處可參考:【Day 16】與進階內容:【Day 17】
3. (訓練前)決定ML模型(ML models)依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model)? 分類模型(Classification model)? 此處可參考:【Day 18】神經網路(neural network)? 簡介於:【Day 25】
4.(模型裡面的參數)ML模型裡面的參數(parameters)與超參數(hyper-parameters) 此處可參考:【Day 18】
5. (訓練中) 調整模型評估當前模型好壞損失函數(Loss Functions):使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error), RMSE(Root Mean Squared Error), 交叉熵(Cross Entropy)為例。此處可參考:【Day 20】
6. (訓練中) 調整模型修正模型參數以梯度下降法 (Gradient Descent)為例:決定模型中參數的修正「方向」與「步長(step size)」此處可參考:【Day 21】
7. (訓練中) 調整腳步調整學習腳步透過學習速率(learning rate)來調整ML模型訓練的步長(step size),調整學習腳步。(此參數在訓練前設定,為hyper-parameter)。此處可參考:【Day 22】
8. (訓練中) 加快訓練取樣與分堆設定batch size,透過batch從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前設定,為hyper-parameter)。與迭代(iteration),epoch介紹。此處可參考:【Day 23】
9. (訓練中) 加快訓練檢查loss的頻率調整「檢查loss的頻率」,依據時間(Time-based)與步驟(Step-based)。此處可參考:【Day 23】
10. (訓練中) 完成訓練(loop) -> 完成重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證即可結束訓練。此處可參考:【Day 27】
11. (訓練後)訓練結果可能問題「不適當的最小loss?」 此處可參考:【Day 28】
12. (訓練後)訓練結果可能問題欠擬合(underfitting)?過度擬合(overfitting)? 此處可參考:【Day 26】
13. (訓練後)評估 – 性能指標性能指標(performance metrics):以混淆矩陣(confusion matrix)分析,包含「Accuracy」、「Precision」、「Recall」三種評估指標。簡介於:【Day 28】詳細介紹於:【Day 29】
14. (訓練後)評估 – 新資料適用性泛化(Generalization):對於新資料、沒看過的資料的模型適用性。此處可參考:【Day 26】
15. (訓練後)評估 – 模型測試使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試? 此處可參考:【Day 27】
16.(資料分堆的方式)(訓練前) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:【Day 27】
⭐從所有ML模型的訓練結果中,找到「最好的」ML模型⭐:
( 原因:「訓練好一個模型」不等於「找到最好的模型」 )
1.(訓練模型)【Day 27】 使用「訓練資料集(Training)」訓練模型(調整參數),也就是「上方表格」在做的內容
2.(結束訓練)【Day 27】 訓練到通過「驗證資料集(Validation)」結束訓練(未達到overfitting的狀態前)
3.(模型再調整)【Day 27】 超參數(hyperparameters)調整或神經網路的「layer數」或「使用的node數」(一些訓練前就會先決定的東西)
4.(loop)【Day 27】 (模型再調整)後,重複上述(訓練模型)、(結束訓練),完成訓練新的模型
5.(找到最佳模型)【Day 27】 從「所有訓練的模型」中,找到能使「驗證用資料集(Validation)」最小的loss,完成(找到最佳模型)
6.(決定是否生產)【Day 27】 可以開始決定要不要將此ML模型投入生產。此時我們可以使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試?
⭐訓練 ML 模型的小實驗⭐:
1.【Day 24】 TensorFlow Playground 的簡介與介面介紹
2.【Day 24】 learning rate 的改變對訓練過程的影響
3.【Day 25】 使用神經網路(neural network)分類資料
4.【Day 25】 觀察batch size如何影響gradient descent
⭐30天內容回顧與課程索引, 參賽心得, 未來計畫與感謝⭐:
1.【Google ML】30 – 30天內容回顧與課程索引, 參賽心得, 未來計畫與感謝
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps