iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1
Google Developers Machine Learning

Machine Learning with TensorFlow on Google Cloud Platform系列 第 9

鐵人賽Day9 - Launching into Machine Learning (3/4)

  • 分享至 

  • xImage
  •  

泛化和取樣(Generalization and Sampling)

主旨:了解泛化和取樣的重要

泛化

如果一個迴歸模型的RMSE是0,這麼“”的模型會是好的模型嗎?答案是否定的,這通常表示著它的泛化能力不好,也就是在沒見過的資料上它將沒辦法準確的預測其答案。

舉例來說,現在有一筆資料,使用線性迴歸模型來擬合如下圖:

這時候若使用更多參數的複雜模型,達到了每個點都準確預測,RMSE變成0,如下圖示:

然而這樣的模型我們不會認為是一個好的模型,若今天新進一筆資料,很大的可能是它沒辦法預測到正確的答案,這種現象我們稱之為過擬合(Overfitting)

要解決這樣的問題,可以將資料分成2組:訓練組和測試組(Training and Testing sets)測試組的資料並不會用來訓練模型,使用訓練組資料訓練模型後,得到訓練組RMSE並和測試組RMSE比較,數值差不多時,這樣的模型表示泛化能力較好

使用過多的模型參數來擬合資料會有過擬合的現象,然而太少的模型參數會造成欠擬合(Underfitting),挑選適當的模型架構、參數便是ML訓練過程中的一個重點。

那麼模型的架構,或者說超參數要怎麼選擇呢?答案是把資料多分1組出來,變成3組:訓練組、驗證組和測試組(Training, Validation and Testing sets)。新增的驗證組就是用來挑選超參數或者模型架構,當訓練完後的模型,在驗證組上算RMSE,比較不同超參數或模型架構之間驗證組RMSE的大小,挑選最好的模型後,再看看測試RMSE是否維持相近的大小,整個訓練過程如下面圖示。

不過這樣你可能會想到一個可惜的地方,就是測試組的資料好像沒有被完全利用到,只有拿來看看RMSE而已,沒錯,這樣確實有點浪費這些寶貴的資料,所以我們可以訓練完後,再重新切分訓練組、驗證組和測試組,然後再來訓練一次,如此重複多次後,便可以完整使用到全部的資料來訓練模型,這種方式我們稱之為自助法(Bootstrapping)

取樣

在上面我們提到了訓練模型前,需要將資料切分,無論是切2或3份,接著會想到的問題是如何分割資料?當資料很巨大的時候該怎麼切分?怎麼確定每次切分的結果都一樣?

一個直觀簡單的想法就是隨機(Random)切成2份,80%訓練/20%測試這樣,但是這樣切會有個問題,就是別人無法重現你的實驗結果。那你又會說:“沒關係,我把分好的資料另外存出來,這樣其他人就可以用這個另外存出來的切分資料來跑”,這雖然是一種辦法,但是如果今天資料又要擴充、增加呢?如果資料很大,這不是又多浪費空間存這2份資料嗎?

所以,下面的實作將介紹的一種實用的切分方法,使用雜湊函式(Hash function)將資料進行分割

[GCP Lab實作-4]:在 BigQuery 中建造可重複的資料分割

這個實作中,我們可以學到:

  • 使用不同的方式創造ML資料集有什麼影響

[Part 1]:在GCP中開啟Notebooks

  1. 登入GCP,步驟可以參考Day5的文章

  2. Navigation Menu,選取 AI Platforms 裡面的 Notebooks

https://ithelp.ithome.com.tw/upload/images/20190910/20120208mcB0ZXx12R.png

  1. 點選 NEW INSTANCE,選擇 TensorFlow 1.xWithout GPU(這個Lab沒有用到真正的模型訓練過程,所以不需要GPU)。

  1. 接著會跳出確認VM的Name,按下CREATE後,等待約3分鐘創建VM。

https://ithelp.ithome.com.tw/upload/images/20190910/201202087wNYalKtxj.png

  1. 創建成功後,會看到剛創建的VM,再來點Open JupyterLab

[Part 2]:複製課程 Github repo 到你的 AI Platform Notebooks instance

  1. 點開Open JupyterLab後會開啟Launcher的頁面,在頁面上選擇Termianl

  1. 輸入下方指令,將 github repo 上的東西複製下來:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst 
  1. 在左邊點進 training-data-analyst,確認 repo 的東西都有被複製下來。

[Part 3]:建立可重複的資料分割

  1. 在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 02_generalization ,然後打開檔案 repeatable_splitting.ipynb

  1. 點選 Edit > Clear All Outputs,清理掉原本notebook的輸出紀錄。

https://ithelp.ithome.com.tw/upload/images/20190910/20120208y7cHobL5oi.png

  1. 根據notebook的指令和說明執行,從下面我們可以看到,若在分割資料使用 Rand() 的時候,每次重複執行該cell都會得到不一樣的alpha值。但是透過將日期丟進雜湊函式的方式( FARM_FINGERPRINT(date) ) ,我們就實現了可重複的資料分割,每次重跑alpha的值都會是固定的了。


今天介紹了泛化和取樣的重要和1個簡單的實作,明天我們將繼續另一個實作 “探索和創造ML資料集”。


上一篇
鐵人賽Day8 - Launching into Machine Learning (2/4)
下一篇
鐵人賽Day10 - Launching into Machine Learning (4/4)
系列文
Machine Learning with TensorFlow on Google Cloud Platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言