跟數據有關的複雜問題,機器學習可以說是資料科學家們仰賴的巨大工具箱,其中強大的深度學習(類神經網路)更永遠都是熱門演算法。然而這個工具箱中,還有更簡單、有效、直覺的演算法,它單純是比較少佔用新聞版面,就是這篇文章要介紹的分類模型 — Naive Bayes。
這篇資料科學筆記將介紹 Naive Bayes 為何依然是必備的數據建模基本功、簡介其 貝氏統計 核心概念如何應用在分類問題、最後也分享我在 Udemy 課程 學習 Naive Bayes 的心得。
本文適合讀者:不熟悉 Naive Bayes;想認識適用於分類問題的模型;尋找 Naive Bayes 學習資源。
目錄
為什麼 Naive Bayes 分類模型重要?
Naive Bayes Classifier 又被稱為單純貝氏分類器、簡單貝氏、或者貝氏分類器,是一種適用於分類問題的監督式學習方法。
如其名,Naive 在英文就是單純、簡單的意思,明明大家都在追求精準預測未來,為什麼我們會想要用簡單的方法?首先,簡單代表適合資料科學初學者學習,有個工具幫助新手快速在專案中產生績效並累積作品集是非常重要的。其次,目前最精準的模型大多是基於深度學習,它擁有的超複雜「網路」既是它的威力、也帶來了缺點,訓練複雜的深度學習模型會用到大量運算資源與時間,訓練過程要調整模型也需要深厚的理論基礎,另外,深度學習內部運算的方式經常會複雜到難以解釋、不知道為什麼模型會如此預測。
這正是為何 Naive Bayes 的簡單模型依然是身為資料科學家必備的基本功。Naive Bayes 的程式實作非常簡潔、高效率,如果你正在業界擔任數據分析工作,它尤其適合實戰的快速應用、或者你無法迅速調度運算資源的情境,例如知名的 Python 套件 Scikit Learn 就包含了 Naive Bayes 實作,程式碼好學又好上手。還有一點,Naive Bayes 在小數據也能訓練出不錯的預測成效,這可是深度學習難以做到的。
Naive Bayes 早在 1950 年 就已被廣泛研究,已經被證明它在許多應用場景都不會輸給先進模型,包括:
- 垃圾郵件辨識
- 疾病預測、自動診斷
- 基因定序解讀
- 文本情緒分析
(筆者修習過的 Udemy 的 Naive Bayes 機器學習課程 詳細介紹了這些應用場景)
不只是簡單、輕量、還有省運算資源(省錢!),Naive Bayes 還具有好解釋的特點,相對於前面提過深度學習更像個難解的黑盒子,簡單貝氏讓我們很好解讀為什麼模型做出這些預測,這是基於每個特徵彼此獨立的假設(下個小節詳述),好解釋的模型不只更容易偵錯(debug)與調整模型,在業界工作用可解釋模型也是很重要的特性,總不能老闆來問模型為什麼這樣預測、我們只兩手一攤說「不知道」吧!
在分類問題,Naive Bayes 是簡單、好上手、可解釋的模型,下個小節我們就來快速學習簡單貝氏的原理與用法。
Naive Bayes 簡介
Naive Bayes 是基於貝氏定理加上特徵獨立假設的監督式學習分類演算法
Scikit Learn
Naive Bayes 是一種分類問題演算法,它依據貝氏定理計算出每個資料點屬於特定類別的機率,例如將每封電子郵件分類成「惡意」或「正常」,Naive Bayes 的工作流程會像是這樣:(虛構情境)
- 先預設惡意郵件機率是 10%,全部信件有 10% 是惡意郵件
- (這是 先驗機率)
- 在郵件內容看到「緊急」關鍵字,惡意郵件機率提升到 18%
- (依據資料更新成 後驗機率)
- 在郵件內容看到「賺錢」關鍵字,惡意郵件機率提升到 30%
- 在郵件內容看到「飆股」關鍵字,惡意郵件機率提升到 63%
- 因為最終惡意郵件機率是 63%,決定將此郵件判定為「惡意」
這個例子看起來既白話又簡單,Naive Bayes 確實就是這麼直覺好懂!而要深入認識 Naive Bayes,需要知道三個要點:Naive 的意義、Bayes 觀念、以及資料分佈的假設。
首先,「Naive」指的是所有特徵彼此獨立、互不相關,簡單地說,這表示某個特徵是否存在、並不會影響另個特徵的預測判斷。以垃圾郵件分類問題為例,信件中文字是否包含「飆股」跟「緊急」都是重要特徵,但不管「飆股」這個詞有沒有出現,都不會改變「緊急」這個詞提高垃圾郵件機率的程度。
在真實世界,特徵彼此獨立的假設其實很難成立、非常 Naive(天真),例如「飆股」跟「緊急」兩個詞在惡意郵件中可能經常一起出現、彼此相關,即使如此,實戰應用過 Naive Bayes 仍會發現它(即使有不完美的假設)預測成效驚人地好。還是那句 老話:
All models are wrong, but some are useful.
第二,Naive Bayes 的 Bayes 指的是貝氏定理,是幫我們推算條件機率的強大工具。進行預測時,我們想知道的是給定資料、出現某種情境的機率,再以惡意郵件為例,我們有興趣的機率是 P( 是惡意郵件 | 資料包含「飆股」關鍵字 )
(後驗機率),然而,我們手握的資料集能算出來的其實只有 P ( 資料包含「飆股」 | 是惡意郵件 )
(似然 Likelihood),貝氏定理神奇地幫助我們把資料變成你有興趣的(後驗)機率!至於怎麼做到這點、以及貝氏統計的詳細介紹,歡迎參考筆者好豪的另一篇文章:貝氏統計—讓決策持續進化的灰階思考。
最後一項 Naive Bayes 學習要點,是對於資料分佈的假設,這個假設用於對 Likelihood(似然)的建模,例如「已知這封是惡意郵件,那麼『飆股』關鍵字出現頻率的資料分布該長什麼樣子?」。針對不同的資料類型,需要有不同的資料分布假設、與建模方式,簡單地說,不同資料類型、要用不同的 Naive Bayes 模型,這就是為什麼 Scikit Learn 套件的 Naive Bayes 有 多種模型:
- 二分類資料,採用 Bernoulli distribution 建模:
BernoulliNB
- 多分類資料,採用 Categorical distribution 建模:
CategoricalNB
- 連續型資料,採用常態分佈建模:
GaussianNB
知道 Naive 的意義、也熟悉 Bayes 統計觀念、再加上理解不同資料類型要採用不同分佈假設,這些知識就足以讓 Naive Bayes 在你的機器學習工具箱充分發揮威力!
Udemy 課程心得《Data Science & Machine Learning: Naive Bayes in Python》
不得不承認,我以前是用不求甚解的方式學習 Naive Bayes,印象中只看過大學教授用兩、三頁投影片介紹。進入業界工作後,經常會在同行或前輩的資料分析專案中看到 Naive Bayes 的應用,因此我找了《Data Science & Machine Learning: Naive Bayes in Python》這門 Udemy 課程,讓自己補一補知識。
相較於本篇文章只是概覽 Naive Bayes 的重要性與觀念,這門 Udemy 課程 整合了統計理論與 Python 程式實踐應用、詳盡地介紹 Naive Bayes,尤其本文第二小節提到的三個要點,正是我在這門課學到的關鍵概念,講師用很白話的方式介紹 Naive Bayes 會用到的不同假設、各自適用於什麼資料格式,上完這門課後,Scikit Learn 裡面 用到不同 Naive Bayes 模型與參數的差別,我都能清楚看懂。
這門課的授課方式有兩個特點我很喜歡:第一,重視 Python 實踐應用,講師搜集了多個應用情境,包括信用卡盜刷、基因定序分析、文字情緒辨識等等,每個案例都從資料搜集到最終建模後的準度驗證、完整講解分析流程與 Python 程式,保證你學會怎麼用。第二,將新手與進階課程內容分開,講師很細心地在課程前半段都用極少數學公式的方式講解,容易入門,但貝氏統計理論也完全沒有馬虎,講師刻意放在後半段,讓學生先學會應用、再回來補數學知識,這樣的課程編排讓這門課特別好懂。
不論你是資料科學新手、或者是有經驗的數據分析從業者想要複習單純貝氏的知識,《Data Science & Machine Learning: Naive Bayes in Python》這門 Udemy 課程很好上手,推薦你用課餘或下班的零碎時間把它看一看,為下個資料科學專案磨練更強的基本功。
結語
資料科學的酷東西琳瑯滿目、深度學習模型光彩奪目,但 Naive Bayes 依然因為它簡單、高效、好解釋而有其地位。當然,Naive Bayes 不會在每個情境都能發揮最強效力,但當你的數據專案遇到分類問題時,Naive Bayes 肯定是值得優先嘗試的第一步,讓你迅速達成不錯的預測效果。
你已經準備要好好學習 Naive Bayes 的話,筆者修習過的《Data Science & Machine Learning: Naive Bayes in Python》值得你看看,幫助你一次學會 Python 程式碼與數學理論,我相信磨練這項簡單卻強大的機器學習基本功,絕對會成為你資料科學工具箱裡的強大武器。
如果這則筆記有幫助到你,歡迎追蹤 好豪的粉絲專頁 與 Threads 帳號,我會持續分享 Python 以及資料科學相關文章;也可以點選下方按鈕分享,讓更多想提升資料科學技能的朋友看到!