【Python】機器學習 — 交叉驗證與超參數調整

NTU Data Analytics Club
9 min readMay 30, 2021

--

在大數據時代,機器學習(Machine Learning,簡稱 ML)這個詞彙非常火紅,簡單來說,機器學習是透過演算法將收集到的資料(即過往資料及經驗)進行分類學習並找到其運行的規則,建立出預測模型。

ML 應用範圍極為廣泛,可用於搜尋引擎結果推薦、各類辨識(圖像、影音、指紋、車牌等)、醫療診斷輔助、證券分析等。感謝 Tairung 學長再次答應本社講課邀請,讓我們一起來揭開 ML 的奧秘吧!

本篇文章 take away

  1. 了解如何調整模型的超參數、特徵以提升準確度
  2. 認識 K-fold 驗證模型的方法

目錄

講者介紹
調整模型
驗證模型
調整超參數
特徵調整
相關文章

講者介紹

Tairung Chen 學長畢業於臺大經研所,目前在 KKBOX Group 旗下 KKLab 擔任 Senior Data Scientist,負責建立各專案的機器學習模型,以及視覺化圖表。

調整模型

在介紹如何調整模型之前,我們先回顧各個模型的運作邏輯。

隨機森林是由許多樹模型的結果,即上圖的 Bagging,平行運算輸出後取平均值。決策樹是 if-then 規則的集合結果,即上圖的 Boosting,易於理解、可解釋性強、預測速度快。

決策樹演算法相比於其他的演算法需要更少的特徵工程,比如可以不用做特徵標準化、可以很好的處理欄位缺失的資料、可以不用關心特徵間是否相互依賴等。簡單來說,決策樹能夠自動組合多個特徵,而且其深度可以在一開始訓練模型時設定。

但要注意的是,決策樹的深度設定可能造成預測結果偏誤。如果深度太深、太複雜容易出現過度擬合(overfitting),如果太淺、太簡單可能沒辦法非常有效的做預測(underfitting)。除了預測結果外,運算所需時長也會依深度設定而有差距,深度越深需要越多時間運算,因此在效能與時間之間需要權衡。

過度擬合 Overfitting

Overfitting 是指在訓練資料(training set)中能夠達到很高的預測效果,但是在測試資料(test set)中出現預測偏差。

以上圖做初步說明,Underfitting 那張圖忽略了前後 y 結果稍高的現象,而 Overfitting 那張圖則過度強調每筆資料,無法從中觀察整體趨勢、預測未來。

接著,以下圖說明模型複雜度以及預測錯誤間的關係。如果模型複雜度偏向簡單(圖片偏左側 )的時候那麼它在訓練集(training set)跟驗證集(validation set)的 Error 都非常的高,則表示模型處於 underfitting 的狀況;而如果模型複雜度太過複雜 (圖片偏右側 ),雖然它在訓練集(training set)的 Error 可以降到很低,但在驗證集(validation set)的 Error 卻非常的高,則表示模型已經 overfitting 了。

驗證模型

由於我們最終的目的是應用這個訓練好的模型來做預測,所以我們著重的並非模型在訓練集(training set)上的表現好壞,而是想知道模型對於陌生數據的預測能力。

在少量樣本的狀況下,從中抽出的小部分驗證集(validation set)資料通常不具代表性,所以可能會抽到某些資料驗證出來覺得模型訓練得不錯,但換抽另一批資料來驗證卻覺得模型訓練的很糟糕。

為了避免這個狀況,我們就會採用「交叉驗證 Cross-Validation」的方法來驗證。

K — folds 交叉驗證

K-fold Cross-Validation 簡單而言就是將資料集拆分成 K 份做交叉驗證。

交叉驗證的方法是將其中 K-1 份​的資料當作訓練集,剩下來的那份做為驗證集,算出一個 Validation Error,接著再從沒當過驗證集的資料挑一份出來當驗證集,剛剛做過驗證集的資料則加回訓練集,維持 K-1 份做訓練、1 份做驗證,如此反覆直到每一份資料都當過驗證集,這樣會執行 K 次,算出 K 個 Validation Error,最後我們再將這 K 個 Validation Error 做平均,用他們的平均分數來做為我們評斷模型好壞的指標。

調整超參數

超參數可以用多層 for 迴圈或是 Sklearn 模組中的 GridsearchCV 來尋找,兩者差別在 GridsearchCV 遇到較多超參數時更方便,除了不用手動寫迴圈以外,還能夠使用 best_estimator 快速找到最合適的參數,例如幾棵樹、學習率等等,以下介紹 GridsearchCV 的使用流程,以及相關 code給大家自行參考!

Workflow with GridSearchCV

  1. 模型選擇,如:Linear Regression、Random Forest…etc
  2. 嘗試超參數組合,每種模型有上百種超參數組合可以嘗試
  3. 使用 GridSearchCV,找出各模型最適超參數
  4. 評估成果,用 test set 衡量各模型的最佳配置

學長的補充資料 (scikit-learn 的說明)

特徵調整

特徵重要度 Feature Importance

我們在使用多指標綜合評價方法時,常因指標單位、數量級落差大,而造成數值較大的指標在分析上影響過大、數值較小的指標在分析上影響過小的偏誤結果。舉例來說,我們建立一個衡量英文能力的模型,其衡量指標包含多益(滿分 990 分)及托福(滿分 120 分),若分數未經任何調整,則模型衡量出的英文能力就會大受多益分數影響,因為它的分數數值較大、權重較高。

透過上述例子,我們可以知道未經調整的特徵會造成結果失準,所以衡量特徵重要度是非常重要的。

學長的補充資料 (scikit-learn 的說明)

特徵縮放 Feature Scaling

知道各個特徵的重要度不同後,我們要依其重要度做調整,將分數區間、資料之間標準差、平均數等概念一起考慮進去,把所有變數放到同一個區間中,這樣對於訓練就不會產生偏差(bias)。以下介紹兩個調整方法:

1. 常態化(Normalization)

常態化的某樣本特徵值 =(常態化前的 x 特徵值 — 所有樣本中最小的特徵值 x)/(所有樣本中最大的特徵值 x — 所有樣本中最小的特徵值 x)

這個方法主要是重新刻畫刻度,分母為資料全距,透過刻度轉換讓所有特徵資料都縮放到[0,1]之間。

常態化適合用在數值資料較集中的情況,因為這樣的計算方式會用到最大值與最小值。 在最大值或最小值為離群值的情況下,容易讓結果變得不穩定,實務上有時會用去除離群值的最大值及最小值作為替代。

2. 標準化(Standardization)

標準化的某樣本特徵值=(標準化前的 x 特徵值 — 平均數) / 標準差

平均值會變成 0,標準差會變成 1,能解決各變數計算單位大小不一的問題。

學長的補充資料 (scikit-learn 的說明)

下面提供上課時學長示範的 code 給大家參考:

感謝 Tairung 學長用心準備的社課內容,帶領我們進入機器學習的世界,我們會持續努力學習!另外,機器學習的課程分享共有三篇,有興趣的朋友參見下方的相關文章列表。

歡迎各位讀者拍手交流,NTUDAC 也會持續在 MediumFacebookLinkedIn 更新每週社課的資訊,歡迎對資料有興趣的大家持續關注,跟我們交流想法~

相關文章

另外兩篇 Tairung 學長的機器學習課程分享:

謝謝 Tairung 學長第二次答應我們的講課邀約,對於上次學長的職涯分享有興趣的朋友詳見此篇文章!

其他 Python 系列文章

--

--

NTU Data Analytics Club
NTU Data Analytics Club

Written by NTU Data Analytics Club

臺大資料分析與決策社 (NTUDAC) 為一群對資料科學抱有熱忱的臺大學生創立, 旨在教授學員如何利用數據分析解決商業問題的商業性社團,在 Medium 將分享社團課程與實作專案內容,以期推廣資料分析的相關資訊。

Responses (1)