【Python】機器學習 — 資料前處理與樹模型
在大數據時代,機器學習(Machine Learning,簡稱 ML)這個詞彙非常火紅,簡單來說,機器學習是透過演算法將收集到的資料(即過往資料及經驗)進行分類學習並找到其運行的規則,建立出預測模型。
ML 應用範圍極為廣泛,可用於搜尋引擎結果推薦、各類辨識(圖像、影音、指紋、車牌等)、醫療診斷輔助、證券分析等。感謝 Tairung 學長再次答應本社講課邀請,讓我們一起來揭開 ML 的奧秘吧!
本篇文章 take away
- 了解資料前處理的常見問題及其處理方式
- 認識機器學習常見的模型種類
目錄
講者介紹
資料前處理
決策樹以及其他樹模型
相關文章
講者介紹
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 學長的機器學習課程分享:
謝謝 Tairung 學長第二次答應我們的講課邀約,對於上次學長的職涯分享有興趣的朋友詳見此篇文章!