【Python】機器學習 — 交叉驗證與超參數調整
在大數據時代,機器學習(Machine Learning,簡稱 ML)這個詞彙非常火紅,簡單來說,機器學習是透過演算法將收集到的資料(即過往資料及經驗)進行分類學習並找到其運行的規則,建立出預測模型。
ML 應用範圍極為廣泛,可用於搜尋引擎結果推薦、各類辨識(圖像、影音、指紋、車牌等)、醫療診斷輔助、證券分析等。感謝 Tairung 學長再次答應本社講課邀請,讓我們一起來揭開 ML 的奧秘吧!
本篇文章 take away
- 了解如何調整模型的超參數、特徵以提升準確度
- 認識 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
- 模型選擇,如:Linear Regression、Random Forest…etc
- 嘗試超參數組合,每種模型有上百種超參數組合可以嘗試
- 使用 GridSearchCV,找出各模型最適超參數
- 評估成果,用 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 學長的機器學習課程分享:
謝謝 Tairung 學長第二次答應我們的講課邀約,對於上次學長的職涯分享有興趣的朋友詳見此篇文章!