【白话机器学习】算法理论+实战之朴素贝叶斯
1. 寫在前面
如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:
監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等
無監督算法:聚類,降維,關聯規則, PageRank等
為了詳細的理解這些原理,曾經看過西瓜書,統計學習方法,機器學習實戰等書,也聽過一些機器學習的課程,但總感覺話語里比較深奧,讀起來沒有耐心,并且理論到處有,而實戰最重要, 所以在這里想用最淺顯易懂的語言寫一個白話機器學習算法理論+實戰系列。
個人認為,理解算法背后的idea和使用,要比看懂它的數學推導更加重要。idea會讓你有一個直觀的感受,從而明白算法的合理性,數學推導只是將這種合理性用更加嚴謹的語言表達出來而已,打個比方,一個梨很甜,用數學的語言可以表述為糖分含量90%,但只有親自咬一口,你才能真正感覺到這個梨有多甜,也才能真正理解數學上的90%的糖分究竟是怎么樣的。如果這些機器學習算法是個梨,本文的首要目的就是先帶領大家咬一口。另外還有下面幾個目的:
檢驗自己對算法的理解程度,對算法理論做一個小總結
能開心的學習這些算法的核心思想, 找到學習這些算法的興趣,為深入的學習這些算法打一個基礎。
每一節課的理論都會放一個實戰案例,能夠真正的做到學以致用,既可以鍛煉編程能力,又可以加深算法理論的把握程度。
也想把之前所有的筆記和參考放在一塊,方便以后查看時的方便。
學習算法的過程,獲得的不應該只有算法理論,還應該有樂趣和解決實際問題的能力!
今天是白話機器學習算法理論+實戰的第五篇,樸素貝葉斯算法,這個算法最適合的場景就是文本分類任務了,常用語自然語言處理任務,但可不單單是用于文本分類,貝葉斯方法被證明是非常general且強大的推理框架,通過今天的學習,快速掌握樸素貝葉斯的計算原理和工作流程,并且運用學習到的原理和流程,做一個文本分類的任務。
大綱如下:
貝葉斯原理(不要畏懼不可知,要從已知推未知)
樸素貝葉斯分類的工作原理(離散數據和連續數據案例)
樸素貝葉斯分類實戰(文本分類,在這里會掌握TF-IDF技術,會認識分詞技術)
OK, let's go !
2. 樸素貝葉斯??還是先從貝葉斯原理開始吧!
很多人都聽說過貝葉斯原理?在哪?當然是在學概率統計的時候了,有些人可能會說,完蛋, 概率統計的知識都忘光了, 哈哈, 那也沒有關系, 誰讓這里是白話機器學習算法呢, 肯定是大白話的學習算法精華啊。在這之前,得需要了解一下貝葉斯原理, 放心,這里沒有復雜的公式,只需要一個小例子,你就發現,不知不覺的就學到了貝葉斯原理的核心思想,對,就是這么神奇。不信??那就接著往下看。
貝葉斯原理是英國數學家托馬斯·貝葉斯提出的。貝葉斯是個很神奇的人,他的經歷類似梵高。生前沒有得到重視,死后,他寫的一篇關于歸納推理的論文被朋友翻了出來,并發表了。這一發表不要緊,結果這篇論文的思想直接影響了接下來兩個多世紀的統計學,是科學史上著名的論文之一。(哈哈,厲害吧,只可惜,貝葉斯看不見了)
貝葉斯原理是怎么來的呢??貝葉斯為了解決一個叫“逆向概率”問題寫了一篇文章,嘗試解答在沒有太多可靠證據的情況下,怎樣做出更符合數學邏輯的推測。這里有個詞,叫做逆向概率。What is "逆向概率"?
所謂“逆向概率”是相對“正向概率”而言。
★正向概率總知道吧, 比如,一個袋子里5個球, 3個黑球,2個白球,我隨便從里面拿出一個,問,是黑球的概率?。這時候,立即答:3/5。
”哈哈,這就是正向概率了,很容易理解吧,但這種情況往往是上帝的視角,即了解了事情的全貌做的判斷(事先知道了袋子里有5個球)。
But, 如果我們事先只知道,袋子里不是黑球就是白球,并不知道各自有多少個,而是通過我們摸出的球的顏色,我們能判斷出袋子里黑白球各自多少個來嗎??這就是逆向概率了。
正是這樣一個普普通通的問題,影響了接下來近 200 年的統計學理論。這是因為,貝葉斯原理與其他統計學推斷方法截然不同,它是建立在主觀判斷的基礎上:在我們不了解所有客觀事實的情況下,同樣可以先估計一個值,然后根據實際結果不斷進行修正。
好吧, 猜你現在正迷糊呢!看個簡單的例子吧,讓你不知不覺的就愛上貝葉斯,哦,原理:
★一所學校里面有 60% 的男生,40% 的女生。男生總是穿長褲,女生則一半穿長褲一半穿裙子。有了這些信息之后我們可以容易地計算“隨機選取一個學生,他(她)穿長褲的概率和穿裙子的概率是多大”,這個就是前面說的“正向概率”的計算。
然而,假設你走在校園中,迎面走來一個穿長褲的學生(很不幸的是你高度近視,你只看得見他(她)穿的是否長褲,而無法確定他(她)的性別),你能夠推斷出他(她)是男生的概率是多大嗎?
看上面這個例子,你能算出來嗎??好像涉及到逆向推理了來。
我們可能對形式化的這種貝葉斯問題不擅長,但是我們對數數形式的等價問題應該很擅長,在這里,不妨把問題換一下子:你在校園里隨機游走,遇到了N個長褲的人(仍然看不清性別), 問,這N個人里面有多少個男生,多少個女生?
你說,這還不簡單?算出學校里有多少個穿長褲的,然后在這些人里,再算出多少女生,多少男生不就行了?
哈哈,厲害,那么我們就一起算一下吧:假設,學校里面有M個人。
首先,先算算,這個學校有多少男的,多少女的
60%的男生,40%的女生,則男生的個數是M * P(男), 女生的個數M * P(女)。? 這沒問題吧?
”那我們再算算,男生里面,穿長褲的有多少人?
根據上面我們知道,男生都穿長褲,也就是只要是男的,他就穿長褲(你發現了嗎?這里有個詞,前提是男的,這是個什么?對,條件概率), 即P(長褲 | 男)= 100%。
那么,穿長褲的男生的個數就等于:男生的個數乘以前面的概率 = ?M * P(男) * ?P(長褲 | 男)
同理, 我們算一下,女生里面,穿長褲的多少人?
根據上面我們知道,女生里面,有一半的人穿長褲,一般的人穿裙子,也就是P(長褲 | 女) = 50%, 這個也是個條件概率了,因為前提是女的。
那么,穿長褲的女生的個數就等于:M * P(女) * P(長褲 | 女)
這就成了,那么這個學校里面,穿長褲的人就是穿長褲的男生+長褲的女生
穿長褲的人 = ?M * P(男) * ?P(長褲 | 男) + M * P(女) * P(長褲 | 女)
”那么穿長褲的這里面,男生和女生的比例是多少呢?
穿長褲的這里面, 男生的比例應該這樣計算(注意,這里發現改變條件了嗎??前提是穿長褲了),即P(男 | 長褲)和P(女 | 長褲)。
怎么算呢?簡單,總的穿長褲的人知道,又知道,長褲的男的和女的各自的數量,那么:
P(男 | 長褲)= ?[M * P(男) * ?P(長褲 | 男)] / [M * P(男) * ?P(長褲 | 男) + M * P(女) * P(長褲 | 女)]
P(女 | 長褲) = [M * P(女) * P(長褲 | 女)] / [M * P(男) * ?P(長褲 | 男) + M * P(女) * P(長褲 | 女)]
上面的式子,發現分子分母,都有M,約掉,就變成了
P(男 | 長褲)= ?[P(男) * ?P(長褲 | 男)] / [P(男) * ?P(長褲 | 男) + P(女) * P(長褲 | 女)]
P(女 | 長褲) = [P(女) * P(長褲 | 女) ] / [P(男) * ?P(長褲 | 男) + P(女) * P(長褲 | 女)]
其實,這個例子到這就結束了,這就是最上面的那個問題的答案。我先不說,上面這個公式是個什么東西??我得先保證你能看明白上面這個例子, 如果看不明白,我先解釋幾個概念:
先驗概率:通過經驗來判斷事情發生的概率就是先驗概率。比如上面的男生60%, 女生40%。這就是個事實,不用任何條件。再比如,南方的梅雨季是6-7月,就是通過往年的氣候總結出來的經驗,這個時候下雨的概率比其他時間高出很多,這些都是先驗概率。
條件概率:事件 A 在另外一個事件 B 已經發生條件下的發生概率,表示為 P(A|B),讀作“在 B 發生的條件下 A 發生的概率”。比如上面的男生里面,穿長褲的P(長褲 | 男),女生里面,穿長褲的人P(長褲 | 女)。
后驗概率:后驗概率就是發生結果之后,推測原因的概率。比如上面的我看到了穿長褲的人, 我推測這是個男人P(男 | 長褲)還是個女人P(女 | 長褲)的概率。它屬于條件概率的一種。
上面的三個概率懂了嗎?可以測試一下:
★如果你的女朋友,在你的手機里發現了和別的女人的曖昧短信,于是她開始思考了 3 個概率問題,你來判斷下下面的 3 個概率分別屬于哪種概率:
你在沒有任何情況下,出軌的概率;
如果你出軌了,那么你的手機里有曖昧短信的概率;
在你的手機里發現了曖昧短信,認為你出軌的概率。
上面這三種概率能對號入座了嗎?如果能,說明你懂了上面的概念,也弄了上面的例子,下面開始說正事?!?p>我們再把上面例子中最后的概率寫到下面:★
P(男 | 長褲)= ?[P(男) * ?P(長褲 | 男)] / [P(男) * ?P(長褲 | 男) + P(女) * P(長褲 | 女)]
P(女 | 長褲) = [P(女) * P(長褲 | 女) ] / [P(男) * ?P(長褲 | 男) + P(女) * P(長褲 | 女)]
這里的P(男), ?P(女)就是先驗概率;P(長褲 | 男),P(長褲 | 女)就是條件概率;P(男 | 長褲),P(女 | 長褲)就是后驗概率。
上面長褲和男女可以指代一切東西,令長褲 = A, 男=B1, 女=B2, 那么整理一下上面的公式:這個,就是偉大的貝葉斯公式。下面這個是更通用的形式:難怪拉普拉斯說概率論只是把常識用數學公式表達了出來。
實際上,貝葉斯原理就是求解后驗概率。通過啥??貝葉斯公式。
現在,是不是感覺,沒有燒多少腦就理解了貝葉斯原理了。這就說明,如果我們遇到一個不知道的條件概率的計算,我們要通過貝葉斯公式進行轉換,不要畏懼不可知,要從已知推未知。
然而,看似這么平凡的貝葉斯公式,背后卻隱含著非常深刻的原理。
在這里我不多說,怕你犯困,如果感興趣,見我后面那篇經典博客:通俗易懂講解貝葉斯。因為我的目的,不僅是理解原理,還得實戰會用。這里沒有完全理解也不怕,下面講樸素貝葉斯,我還會實例運算一波。
3. 樸素貝葉斯
講完貝葉斯原理之后,我們再來看下重點要說的算法,樸素貝葉斯。
它是一種簡單但極為強大的預測建模算法。之所以稱為樸素貝葉斯,是因為它假設每個輸入變量是獨立的。這是一個強硬的假設,實際情況并不一定,但是這項技術對于絕大部分的復雜問題仍然非常有效。
★這里的輸入變量是啥??就類似與我們上面的性別特征,因為實際問題里面,可能不僅只有性別這一列特征,可能還會有什么身高啊,體重啊,這些特征,基于這些特征再利用貝葉斯公式去做分類問題的時候,就涉及很多個輸入特征了。
樸素貝葉斯做的就是,假設這些身高,體重,性別這些特征之間是沒有關系的,互相不影響。那么我們算同時符合這三個特征概率的時候,就可以分開算了P(ABC) = P(A)* P(B)* P(C)就是這個道理了。
樸素貝葉斯模型由兩種類型的概率組成:
每個類別的概率P(Cj);
每個屬性的條件概率P(Ai|Cj)。
再舉個例子說明一下類別概率和條件概率:
★假設我有 7 個棋子,其中 3 個是白色的,4 個是黑色的。那么棋子是白色的概率就是 3/7,黑色的概率就是 4/7,這個就是類別概率。
假設我把這 7 個棋子放到了兩個盒子里,其中盒子 A 里面有 2 個白棋,2 個黑棋;盒子 B 里面有 1 個白棋,2 個黑棋。那么在盒子 A 中抓到白棋的概率就是 1/2,抓到黑棋的概率也是 1/2,這個就是條件概率,也就是在某個條件(比如在盒子 A 中)下的概率。
假設,我取出來的是白色的棋子,我問,屬于A盒子的概率?你會算嗎?
不會?上面的貝葉斯公式白學了!
貼出計算過程:為了訓練樸素貝葉斯模型,我們需要先給出訓練數據,以及這些數據對應的分類。那么上面這兩個概率,也就是類別概率和條件概率。他們都可以從給出的訓練數據中計算出來。一旦計算出來,概率模型就可以使用貝葉斯原理對新數據進行預測。(后面會有案例)另外,之前還要注意一下,貝葉斯原理,貝葉斯分類和樸素貝葉斯并不是一回事:
★貝葉斯原理是最大的概念,它解決了概率論中“逆向概率”的問題,在這個理論基礎上,人們設計出了貝葉斯分類器,樸素貝葉斯分類是貝葉斯分類器中的一種,也是最簡單,最常用的分類器。樸素貝葉斯之所以樸素是因為它假設屬性是相互獨立的,因此對實際情況有所約束,如果屬性之間存在關聯,分類準確率會降低。不過好在對于大部分情況下,樸素貝葉斯的分類效果都不錯。
”好了,明白了樸素貝葉斯之后,我們兩個案例,再來體會一下樸素貝葉斯的計算過程吧(關于樸素貝葉斯的詳細推導公式,可以看我下面統計學習方法的筆記)
4. 樸素貝葉斯分類的工作原理
樸素貝葉斯分類是常用的貝葉斯分類方法。我們日常生活中看到一個陌生人,要做的第一件事情就是判斷 TA 的性別,判斷性別的過程就是一個分類的過程。根據以往的經驗,我們通常會從身高、體重、鞋碼、頭發長短、服飾、聲音等角度進行判斷。這里的“經驗”就是一個訓練好的關于性別判斷的模型,其訓練數據是日常中遇到的各式各樣的人,以及這些人實際的性別數據。
4.1 離散數據案例
我們遇到的數據可以分為兩種,一種是離散數據,另一種是連續數據。那什么是離散數據呢?離散就是不連續的意思,有明確的邊界,比如整數 1,2,3 就是離散數據,而 1 到 3 之間的任何數,就是連續數據,它可以取在這個區間里的任何數值。
我以下面的數據為例,這些是根據你之前的經驗所獲得的數據。然后給你一個新的數據:身高“高”、體重“中”,鞋碼“中”,請問這個人是男還是女?看這個題吧,根據這個題,才可以看出樸素貝葉斯的樸素之地。下面貼出這個題的過程:
4.2 連續數據案例
實際生活中我們得到的是連續的數值,比如下面這組數據:那么如果給你一個新的數據,身高 180、體重 120,鞋碼 41,請問該人是男是女呢?
公式還是上面的公式,這里的困難在于,由于身高、體重、鞋碼都是連續變量,不能采用離散變量的方法計算概率。而且由于樣本太少,所以也無法分成區間計算。怎么辦呢?
這時,可以假設男性和女性的身高、體重、鞋碼都是正態分布,通過樣本計算出均值和方差,也就是得到正態分布的密度函數。有了密度函數,就可以把值代入,算出某一點的密度函數的值。(求連續型隨機變量在某一個取值點的概率的時候,可以看當前概率密度函數在該點的函數值,值越大,概率越大。但當前概率密度函數的值不和概率相等,只可以比大小用)
★比如,男性的身高是均值 179.5、標準差為 3.697 的正態分布。所以男性的身高為 180 的概率為 0.1069。
”這怎么算的?這里需要用到工具了, Excel的一個函數:
★NORMDIST(x, mean, standard_dev, cumulative)
x:正態分布中,需要計算的數值;
Mean:正態分布的平均值;
Standard_dev:正態分布的標準差;
Cumulative:取值為邏輯值,即 False 或 True。它決定了函數的形式。當為 TRUE 時,函數結果為累積分布(標準正態);為 False 時,函數結果為概率密度。
這里我們使用的是NORMDIST(180,179.5,3.697,0)=0.1069。同理我們可以計算得出男性體重為 120 的概率為 0.000382324,男性鞋碼為 41 號的概率為 0.120304111。
所以我們可以計算得出:P(A1A2A3|C1)=P(A1|C1)P(A2|C1)P(A3|C1)=0.1069 * 0.000382324 * 0.120304111=4.9169e-6
同理我們也可以計算出來該人為女的可能性:P(A1A2A3|C2)=P(A1|C2)P(A2|C2)P(A3|C2)=0.00000147489 * 0.015354144 * 0.120306074=2.7244e-9
很明顯這組數據分類為男的概率大于分類為女的概率。
哈哈,是不是計算原理很簡單啊。下面就要檢驗是不是真的掌握了, 要用樸素貝葉斯進行一個實戰,在實戰之前,先貼出樸素貝葉斯分類器的工作流程:
5. 樸素貝葉斯之文本分類
樸素貝葉斯分類常用于文本分類,尤其是對于英文等語言來說,分類效果很好。它常用于垃圾文本過濾、情感預測、推薦系統等。
但是在分類之前,有必要介紹一些文本處理的和模型的知識。
5.1 sklearn中的樸素貝葉斯
sklearn 的全稱叫 Scikit-learn,它給我們提供了 3 個樸素貝葉斯分類算法,分別是高斯樸素貝葉斯(GaussianNB)、多項式樸素貝葉斯(MultinomialNB)和伯努利樸素貝葉斯(BernoulliNB)。
★這三種算法適合應用在不同的場景下,我們應該根據特征變量的不同選擇不同的算法:
高斯樸素貝葉斯:特征變量是連續變量,符合高斯分布,比如說人的身高,物體的長度。
多項式樸素貝葉斯:特征變量是離散變量,符合多項分布,在文檔分類中特征變量體現在一個單詞出現的次數,或者是單詞的 TF-IDF 值等。注意, 多項式樸素貝葉斯實際上符合多項式分布,不會存在負數,所以傳入輸入的時候,別用StandardScaler進行歸一化數據,可以使用MinMaxScaler進行歸一化
伯努利樸素貝葉斯:特征變量是布爾變量,符合 0/1 分布,在文檔分類中特征是單詞是否出現。
伯努利樸素貝葉斯是以文件為粒度,如果該單詞在某文件中出現了即為 1,否則為 0。而多項式樸素貝葉斯是以單詞為粒度,會計算在某個文件中的具體次數。而高斯樸素貝葉斯適合處理特征變量是連續變量,且符合正態分布(高斯分布)的情況。比如身高、體重這種自然界的現象就比較適合用高斯樸素貝葉斯來處理。而文本分類是使用多項式樸素貝葉斯或者伯努利樸素貝葉斯。
5.2 什么是TF-IDF值呢?
這一個解釋起來,篇幅很多,在這里不單獨解釋,請移步參考我的另一篇博客:TF-IDF? 這一篇就夠了下面,主要是講一下,怎么用工具實現這個步驟。
5.3 如何求 TF-IDF?
在 sklearn 中我們直接使用 TfidfVectorizer 類,它可以幫我們計算單詞 TF-IDF 向量的值。在這個類中,取 sklearn 計算的對數 log 時,底數是 e,不是 10。
如何創建TfidfVectorizer類呢?
TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern)我們在創建的時候,有兩個構造參數,可以自定義停用詞 stop_words 和規律規則 token_pattern。需要注意的是傳遞的數據結構,停用詞 stop_words 是一個列表 List 類型,而過濾規則 token_pattern 是正則表達式。什么是停用詞?停用詞就是在分類中沒有用的詞,這些詞一般詞頻 TF 高,但是 IDF 很低,起不到分類的作用。為了節省空間和計算時間,我們把這些詞作為停用詞 stop words,告訴機器這些詞不需要幫我計算。
當我們創建好 TF-IDF 向量類型時,可以用 fit_transform 幫我們計算,返回給我們文本矩陣,該矩陣表示了每個單詞在每個文檔中的 TF-IDF 值。在我們進行 fit_transform 擬合模型后,我們可以得到更多的 TF-IDF 向量屬性,比如,我們可以得到詞匯的對應關系(字典類型)和向量的 IDF 值,當然也可以獲取設置的停用詞 stop_words。舉個小例子吧:
假設我們有 4 個文檔:
文檔 1:this is the bayes document;
文檔 2:this is the second second document;
文檔 3:and the third one;
文檔 4:is this the document。
現在想要計算文檔里都有哪些單詞,這些單詞在不同文檔中的 TF-IDF 值是多少呢?
首先我們創建 TfidfVectorizer 類:
然后我們創建 4 個文檔的列表 documents,并讓創建好的 tfidf_vec 對 documents 進行擬合,得到 TF-IDF 矩陣:
輸出文檔中所有不重復的詞:
print('不重復的詞:', tfidf_vec.get_feature_names())# 結果如下: 不重復的詞: ['and', 'bayes', 'document', 'is', 'one', 'second', 'the', 'third', 'this']輸出每個單詞對應的 id 值:
print('每個單詞的ID:', tfidf_vec.vocabulary_)# 結果如下: 每個單詞的ID: {'this': 8, 'is': 3, 'the': 6, 'bayes': 1, 'document': 2, 'second': 5, 'and': 0, 'third': 7, 'one': 4}輸出每個單詞在每個文檔中的 TF-IDF 值,向量里的順序是按照詞語的 id 順序來的:
print('每個單詞的tfidf值:', tfidf_matrix.toarray())# 結果如下:每個單詞的tfidf值: [[0. 0.63314609 0.40412895 0.40412895 0. 0.0.33040189 0. 0.40412895][0. 0. 0.27230147 0.27230147 0. 0.853225740.22262429 0. 0.27230147][0.55280532 0. 0. 0. 0.55280532 0.0.28847675 0.55280532 0. ][0. 0. 0.52210862 0.52210862 0. 0.0.42685801 0. 0.52210862]]5.4?如何對文檔進行分類 - 思路分析
如果我們要對文檔進行分類,有兩個重要的階段:
基于分詞的數據準備,包括分詞、單詞權重計算、去掉停用詞;
應用樸素貝葉斯分類進行分類,首先通過訓練集得到樸素貝葉斯分類器,然后將分類器應用于測試集,并與實際結果做對比,最終得到測試集的分類準確率。
下面,分別對這些模塊介紹:
模塊1:對文檔進行分詞在準備階段里,最重要的就是分詞。那么如果給文檔進行分詞呢?英文文檔和中文文檔所使用的分詞工具不同。
在英文文檔中,最常用的是 NTLK 包。NTLK 包中包含了英文的停用詞 stop words、分詞和標注方法。
在中文文檔中,最常用的是 jieba 包。jieba 包中包含了中文的停用詞 stop words 和分詞方法。
import jieba word_list = jieba.cut (text) #中文分詞模塊 2:加載停用詞表我們需要自己讀取停用詞表文件,從網上可以找到中文常用的停用詞保存在 stop_words.txt,然后利用 Python 的文件讀取函數讀取文件,保存在 stop_words 數組中。
模塊 3:計算單詞的權重
直接創建 TfidfVectorizer 類,然后使用 fit_transform 方法進行擬合,得到 TF-IDF 特征空間 features,你可以理解為選出來的分詞就是特征。我們計算這些特征在文檔上的特征向量,得到特征空間 features。
tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5) features = tf.fit_transform(train_contents)這里 max_df 參數用來描述單詞在文檔中的最高出現率。假設 max_df=0.5,代表一個單詞在 50% 的文檔中都出現過了,那么它只攜帶了非常少的信息,因此就不作為分詞統計。一般很少設置 min_df,因為 min_df 通常都會很小。
模塊 4:生成樸素貝葉斯分類器我們將特征訓練集的特征空間 train_features,以及訓練集對應的分類 train_labels 傳遞給貝葉斯分類器 clf,它會自動生成一個符合特征空間和對應分類的分類器。
這里我們采用的是多項式貝葉斯分類器,其中 alpha 為平滑參數。為什么要使用平滑呢?因為如果一個單詞在訓練樣本中沒有出現,這個單詞的概率就會被計算為 0。但訓練集樣本只是整體的抽樣情況,我們不能因為一個事件沒有觀察到,就認為整個事件的概率為 0。為了解決這個問題,我們需要做平滑處理。
當 alpha=1 時,使用的是 Laplace 平滑。Laplace 平滑就是采用加 1 的方式,來統計沒有出現過的單詞的概率。這樣當訓練樣本很大的時候,加 1 得到的概率變化可以忽略不計,也同時避免了零概率的問題。
當 0<alpha<1 時,使用的是 Lidstone 平滑。對于 Lidstone 平滑來說,alpha 越小,迭代次數越多,精度越高。我們可以設置 alpha 為 0.001。
# 多項式貝葉斯分類器 from sklearn.naive_bayes import MultinomialNB clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)模塊 5:使用生成的分類器做預測首先我們需要得到測試集的特征矩陣。方法是用訓練集的分詞創建一個 TfidfVectorizer 類,使用同樣的 stop_words 和 max_df,然后用這個 TfidfVectorizer 類對測試集的內容進行 fit_transform 擬合,得到測試集的特征矩陣 test_features。
然后我們用訓練好的分類器對新數據做預測。方法是使用 predict 函數,傳入測試集的特征矩陣 test_features,得到分類結果 predicted_labels。
predict 函數做的工作就是求解所有后驗概率并找出最大的那個。
模塊 6:計算準確率計算準確率實際上是對分類模型的評估。我們可以調用 sklearn 中的 metrics 包,在 metrics 中提供了 accuracy_score 函數,方便我們對實際結果和預測的結果做對比,給出模型的準確率。
5.5?實戰文本分類
中文文檔數據集點擊這里下載。
數據說明:
★文檔共有 4 種類型:女性、體育、文學、校園;訓練集放到 train 文件夾里,測試集放到 test 文件,停用詞放到 stop 文件夾里。
”使用樸素貝葉斯分類對訓練集進行訓練,并對測試集進行驗證,并給出測試集的準確率。
好吧,一步步的根據前面的思路進行做:
導入包
加載停用詞
加載數據集
計算詞的權重
建立模型并預測(這里我對比了三種貝葉斯方式)
最后結果如下:
MultinomialNB accuracy_score: 0.91 BernoulliNB accuracy_score: 0.9 GaussianNB accuracy_score: 0.896. 總結
到這終于寫完了, 我的天啊,沒想到這個這么多,趕緊來總結一下吧,今天我們從貝葉斯原理出發,通過生活中的例子得出了偉大的貝葉斯公式,貝葉斯原理就是基于這個求后驗概率。
然后又介紹了樸素貝葉斯及樸素之處,用兩個案例解釋了一下樸素貝葉斯的計算流程
然后,進行文本分類的實戰,實戰之前,介紹了文本處理時的一些知識,比如分詞,比如TF-IDF統計方法原理及實現, 然后完成實戰任務。
希望通過今天的學習能夠掌握樸素貝葉斯的用法和原理。
參考:
http://note.youdao.com/noteshare?id=6862ada5e168f78c4883fedb9873c2b8&sub=6DA2F6E0716649DEA3573154B5B28637
http://note.youdao.com/noteshare?id=36f3152f01b7bac957f9b7f6e88b15f9&sub=AD910F7C52BE48A7817E95474159FCB7
https://blog.csdn.net/sdutacm/article/details/50938957
http://note.youdao.com/noteshare?id=156f3dd7b2932602323fd5c1b9885546&sub=39A5E55810114560A2C1680D19BE4B06
https://cloud.tencent.com/developer/article/1055502
https://blog.csdn.net/qq_27009517/article/details/80044431
總結
以上是生活随笔為你收集整理的【白话机器学习】算法理论+实战之朴素贝叶斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【白话机器学习】算法理论+实战之支持向量
- 下一篇: 从 Google 的一道面试题谈谈数学基