【Python】機器學習 — 資料前處理與樹模型

NTU Data Analytics Club
10 min readMay 30, 2021

--

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

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

本篇文章 take away

  1. 了解資料前處理的常見問題及其處理方式
  2. 認識機器學習常見的模型種類

目錄

講者介紹
資料前處理
決策樹以及其他樹模型
相關文章

講者介紹

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

資料前處理 Data Pre-processing

缺失值 Missing Value

實務上遇到的資料集不會是完美的,多多少少會有缺失值。但如果直接忽略缺失值的話,可能造成結果偏誤,所以不是長久之計。

解決辦法很簡單,因為缺失值為 NaN 無法進行四則計算,所以我們塞一些合適的數字進去就好,以下介紹幾種常見的方式:

  • 填入 0,-1 等本來不存在於資料集中的數值
  • 填入平均值
  • 填入前一筆或後一筆數值 ,通常用在時間序列型的資料
  • 利用內插法,插入合理的數字

在處理缺失值的時候,我們要同時思考資料出現缺失值的原因,判斷缺失值是否為隨機分布(比方說收入欄位的缺失值通常是沒有收入的意思)若能好好辨別缺失值出現的原因,才能決定最合宜的對應處理方式。

文字欄位轉成數字標籤 Categorical to Numeric

由於模型無法理解文字欄位所代表的意義,所以必須將文字轉成數字表現,主要有兩個方法能轉換文字:

數字標籤 Label Encoding

數字標籤通常用於有序離散值,使用方法就是直接將用數字命名欄位,比方說衣服的尺寸 XS=1、S=2、M=3、L=4 等。

要特別注意的是,數字標籤之間的間距沒有實質意義,為了避免模型誤會數字意義,需要假設每個數字標籤的間隔相同,但模型仍可能因為數字的大小誤解數據的存在某種順序,所以為了避免這種情形,可以使用 One-hot Encoding 來轉換文字欄位。

One-Hot 編碼 One-hot Encoding

One-hot Encoding 通常用於無序離散值,其概念是把不同欄位視為是非題,以城市為例,就會有「is_桃園市」、「is_台中市」及「is_台北市」等城市的欄位,欄位內的值非 0 即 1,1 代表肯定之意,在此例就是「is_桃園市為肯定事實,該筆資料為桃園市,而 0 則反之。

One-hot Encoding 的優點是不需假設所有數字標籤的間隔相同,每一個欄位都能計算出獨特的係數,所以模型不會曲解數字大小的意義。但其限制是萬一遇到從未見過的類別,模型會完全無法預測,而且做完 one-hot 以後的欄位亦不能比原有資料筆數多。

離群值 Outliers

線性模型容易受到離群值影響,因為 Linear Regression 的邏輯是離平均越遠的點權重越重,但離群值的資訊卻不是我們真正關注的,因此接下來來介紹常見的離群值處理方法:

修正,適用於觀察出該離群值明顯是 typo 的時候。

刪除,適用於離群值很少的時候。

暫時無視,真的不知道怎麼處理比較好的話,可以試試看先排除離群值直接訓練模型,之後再把資料丟進來看看模型會怎麼反應。

離群值的處理通常也跟 domain knowledge 有關,有時候我們關注的正是離群值(e.g. 全台收入最高的里),有時卻希望觀察一般趨勢 (e.g. 市中心房價)

非線性資料與交互作用 Non-linearity & Interaction

因為真實世界中不太可能都是線性資料,比如臺灣 Podcast 的成長曲線無法直接用一個二次的函數預測,其中也可能存在交互作用,所以我們在處理資料的時候,可以視情況加入高次項或是交互作用項。

決策樹以及其他樹模型

決策樹 Decision Tree

決策樹模型的概念很直觀,可以理解成一顆上下顛倒的樹,由最頂端的根為起點,並依據很多是非題來分類資料,最終分類完成後就可以計算各終端枝葉的資料所佔比例為何,可見上面以鐵達尼號說明的附圖。

決策樹的特色是完全不用管 missing value、categorical variables、non-linearaity & interaction、outlier 問題,可以直接丟進去。通常如果不設定停止條件的話,就會直接切到每個分支都只有一個樣本為止,非常方便。

優點:好懂、好用、不用做特徵工程
隱憂:預測結果容易overfitting → 輸入的 X 誤差小、output 卻天差地遠

接下來,接續著【Python】機器學習 — 實戰入門的例子,我們要用決策樹模型來看澳洲的房價與其房間數的關係。

[段落任意門] 目錄講者介紹資料前處理決策樹隨機森林GBDT相關文章

下面提供上課學長示範的 code 給大家參考,使用澳洲的房價資料集:

隨機森林 Random Forest

簡單來說,隨機森林是多個決策樹組合而成,但是每一棵決策樹分類的資料都不一樣(bootstrap sampling:每次都採用取後放回的的結果,所以每次取出的資料都相似卻相異),有些是資料不同、有些是欄位不同,或是兩個都不同。分類完畢後,依據每顆樹的預測結果做投票或是平均,就能取得最後成果。

隨機森林的超參數:

n_estimators = 300     # 有幾棵樹,理論上越大越準 (大數法則)
max_depth = 10 # 一棵樹最多有多少分枝
min_samples_leaf = 5 # 每個分支裡最少要有多少樣本
n_jobs = 3 # 開多少核心跑
verbose = 1 # 跑的過程要吐多少訊息給user,數字越大、訊息越多

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

[段落任意門] 目錄講者介紹資料前處理決策樹隨機森林GBDT相關文章

接下來,繼續用澳洲房價的資料集做示範。

在這個模型中,有三百顆決策樹!

原則上,隨機森林有越多樹結果會越準。

在實際操作中,我們需要自行設定超參數,包含模型深度(一棵樹最多有多少分枝)、葉子大小(每個分支裡最少要有多少樣本)等,忘記的人可以文章往上滑一點點回顧一下。

oob score 是 Out of bag score 的簡稱,用來驗證隨機森林模型的準確性。

接續著決策樹說明,我們可以更明顯感受到隨機森林的優點,它對於樣本跟特徵都進行採樣,所以可以避免過擬合的情況發生。

梯度提升樹 GBDT

GBDT 可以理解成把一堆決策樹相繼組合在一起,每一顆決策樹都在計算上一顆決策樹沒算好的部分。

回顧一下上面提到的 Random Forest,這兩種模型雖然都是組合一堆決策樹而成,但有本質上的不同。Random Forest (屬於 bagging 手法)是所有決策樹都同時生成,而 GBDT(屬於 boosting 手法) 是根據第一棵決策樹的模樣決定出後面的樹,屬於序列生成。

Boosting 手法是利用前面的樹預測結果與真實結果的差值(error)當作預測目標,以朝著差值(error)方向的某個數字給下一棵樹預測,因此每一棵樹要預測的目標 y 都不同,最後再將所有樹的結果加總得到結果。

提供大家 GBDT 訓練超參數的秘訣,就是先調大 learning rate,快速觀察其他參數對於模型表現的影響,等調好其他超參數以後,再降低 learning rate再找出其中最好的 model。

由於整體篇幅過長,code的部分請大家自行參照下面「學長提供的補充資料」連結做練習囉!

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

[段落任意門] 目錄講者介紹資料前處理決策樹隨機森林GBDT相關文章

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

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

相關文章

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

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

其他 Python 系列文章

--

--

NTU Data Analytics Club

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