⑴ 數據挖掘十大經典演算法之樸素貝葉斯
樸素貝葉斯,它是一種簡單但極為強大的預測建模演算法。之所以稱為樸素貝葉斯,**是因為它假設每個輸入變數是獨立的。**這個假設很硬,現實生活中根本不滿足,但是這項技術對於絕大部分的復雜問題仍然非常有效。
貝葉斯原理、貝葉斯分類和樸素貝葉斯這三者之間是有區別的。
貝葉斯原理是最大的概念,它解決了概率論中「逆向概率」的問題,在這個理論基礎上,人們設計出了貝葉斯分類器,樸素貝葉斯分類是貝葉斯分類器中的一種,也是最簡單,最常用的分類器。樸素貝葉斯之所以樸素是因為它假設屬性是相互獨立的,因此對實際情況有所約束,**如果屬性之間存在關聯,分類准確率會降低。**不過好在對於大部分情況下,樸素貝葉斯的分類效果都不錯。
樸素貝葉斯分類器依靠精確的自然概率模型,在有監督學習的樣本集中能獲取得非常好的分類效果。在許多實際應用中,樸素貝葉斯模型參數估計使用最大似然估計方法,換而言之樸素貝葉斯模型能工作並沒有用到貝葉斯概率或者任何貝葉斯模型。
樸素貝葉斯分類 常用於文本分類 ,尤其是對於英文等語言來說,分類效果很好。它常用於垃圾文本過濾、情感預測、推薦系統等。
1、 需要知道先驗概率
先驗概率是計算後驗概率的基礎。在傳統的概率理論中,先驗概率可以由大量的重復實驗所獲得的各類樣本出現的頻率來近似獲得,其基礎是「大數定律」,這一思想稱為「頻率主義」。而在稱為「貝葉斯主義」的數理統計學派中,他們認為時間是單向的,許多事件的發生不具有可重復性,因此先驗概率只能根據對置信度的主觀判定來給出,也可以說由「信仰」來確定。
2、按照獲得的信息對先驗概率進行修正
在沒有獲得任何信息的時候,如果要進行分類判別,只能依據各類存在的先驗概率,將樣本劃分到先驗概率大的一類中。而在獲得了更多關於樣本特徵的信息後,可以依照貝葉斯公式對先驗概率進行修正,得到後驗概率,提高分類決策的准確性和置信度。
3、分類決策存在錯誤率
由於貝葉斯分類是在樣本取得某特徵值時對它屬於各類的概率進行推測,並無法獲得樣本真實的類別歸屬情況,所以分類決策一定存在錯誤率,即使錯誤率很低,分類錯誤的情況也可能發生。
第一階段:准備階段
在這個階段我們需要確定特徵屬性,同時明確預測值是什麼。並對每個特徵屬性進行適當劃分,然後由人工對一部分數據進行分類,形成訓練樣本。
第二階段:訓練階段
這個階段就是生成分類器,主要工作是 計算每個類別在訓練樣本中的出現頻率 及 每個特徵屬性劃分對每個類別的條件概率。
第三階段:應用階段
這個階段是使用分類器對新數據進行分類。
優點:
(1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
(2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。
(3)對缺失數據不太敏感,演算法也比較簡單,常用於文本分類。
缺點:
(1)理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為樸素貝葉斯模型給定輸出類別的情況下,假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最為良好。對於這一點,有半樸素貝葉斯之類的演算法通過考慮部分關聯性適度改進。
(2)需要知道先驗概率,且先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。
(3)由於我們是通過先驗和數據來決定後驗的概率從而決定分類,所以分類決策存在一定的錯誤率。
(4)對輸入數據的表達形式很敏感。
參考:
https://blog.csdn.net/qiu__liao/article/details/90671932
https://blog.csdn.net/u011067360/article/details/24368085
⑵ 第10天:NLP補充——樸素貝葉斯(Naive-Bayes)
1、引言
貝葉斯方法是一個歷史悠久,樸素貝葉斯中的樸素一詞的來源就是假設各特徵之間相互獨立。這一假設使得樸素貝葉斯演算法變得簡單,但有時會犧牲一定的分類准確率。當然有著堅實的理論基礎的方法,同時處理很多問題時直接而又高效,很多高級自然語言處理模型也可以從它演化而來。因此,學習貝葉斯方法,是研究自然語言處理問題的一個非常好的切入口。
2、貝葉斯公式
貝葉斯公式其實很簡單,但是很常用,就一行:
而我們二分類問題的最終目的就是要判斷 P(「屬於某類」|「具有某特徵」) 是否大於1/2就夠了。貝葉斯方法把計算「具有某特徵的條件下屬於某類」的概率轉換成需要計算「屬於某類的條件下具有某特徵」的概率,而後者獲取方法就簡單多了,我們只需要找到一些包含已知特徵標簽的樣本,即可進行訓練。而樣本的類別標簽都是明確的,所以貝葉斯方法在機器學習里屬於有監督學習方法。
這里再補充一下,一般『先驗概率』、『後驗概率』是相對出現的,比如 P(Y)與 P(Y|X) 是關於 Y的先驗概率與後驗概率, P(X)與 P(X|Y)是關於 X的先驗概率與後驗概率。
4、垃圾郵件識別
我們可以通過一個例子來對郵件進行分類,識別垃圾郵件和普通郵件,如果我們選擇使用樸素貝葉斯分類器,那目標就是判斷 P(「垃圾郵件」|「具有某特徵」) 是否大於1/2。現在假設我們有垃圾郵件和正常郵件各1萬封作為訓練集。需要判斷以下這個郵件是否屬於垃圾郵件:
也就是判斷概率 P(「垃圾郵件」|「我司可辦理正規發票(保真)17%增值稅發票點數優惠!」)是否大於1/2。我們不難發現:通過上述的理解,也就是將其轉換成的這個概率,計算的方法:就是寫個計數器,然後+1 +1 +1統計出所有垃圾郵件和正常郵件中出現這句話的次數啊。也就是:
於是當我們接觸到了中文NLP中,其中最為重要的技術之一:分詞!!!也就是把一整句話拆分成更細粒度的詞語來進行表示。另外,分詞之後去除標點符號、數字甚至無關成分(停用詞)是特徵預處理中的一項技術。我們觀察(「我」,「司」,「可」,「辦理」,「正規發票」,「保真」,「增值稅」,「發票」,「點數」,「優惠」),這可以理解成一個向量:向量的每一維度都表示著該特徵詞在文本中的特定位置存在。這種將特徵拆分成更小的單元,依據這些更靈活、更細粒度的特徵進行判斷的思維方式,在自然語言處理與機器學習中都是非常常見又有效的。因此貝葉斯公式就變成了:
1、樸素貝葉斯(Naive Bayes),「Naive」在何處?
加上條件獨立假設的貝葉斯方法就是樸素貝葉斯方法(Naive Bayes)。將句子(「我」,「司」,「可」,「辦理」,「正規發票」) 中的 (「我」,「司」)與(「正規發票」)調換一下順序,就變成了一個新的句子(「正規發票」,「可」,「辦理」, 「我」, 「司」)。新句子與舊句子的意思完全不同。但由於乘法交換律,樸素貝葉斯方法中算出來二者的條件概率完全一樣!計算過程如下:
其中「發票」重復了三次。
3、處理重復詞語的三種方式
(1)、多項式模型:
如果我們考慮重復詞語的情況,也就是說,重復的詞語我們視為其出現多次,直接按條件獨立假設的方式推導,則有:
統計計算 P(「詞語」|S)時也是如此。
我們掃描一下訓練集,發現「正規發票」這個詞從出現過!!! ,於是 P(「正規發票」|S)=0 …問題嚴重了,整個概率都變成0了!!!樸素貝葉斯方法面對一堆0,很凄慘地失效了…更殘酷的是這種情況其實很常見,因為哪怕訓練集再大,也可能有覆蓋不到的詞語。本質上還是樣本數量太少,不滿足大數定律,計算出來的概率失真 *。為了解決這樣的問題,一種分析思路就是直接不考慮這樣的詞語,但這種方法就相當於默認給P(「正規發票」|S)賦值為1。其實效果不太好,大量的統計信息給浪費掉了。我們進一步分析,既然可以默認賦值為1,為什麼不能默認賦值為一個很小的數?這就是平滑技術的基本思路,依舊保持著一貫的作風,朴實/土但是直接而有效。對於伯努利模型,P(「正規發票」|S)的一種平滑演算法是:
接下來的核心問題就是訓練出一個靠譜的分類器。首先需要有打好標簽的文本。這個好找,豆瓣影評上就有大量網友對之前電影的評價,並且對電影進行1星到5星的評價。我們可以認為3星以上的評論都是好評,3星以下的評論都是差評。這樣就分別得到了好評差評兩類的語料樣本。剩下就可以用樸素貝葉斯方法進行訓練了。基本思路如下:
但是由於自然語言的特點,在提取特徵的過程當中,有一些tricks需要注意:
當然經過以上的處理,情感分析還是會有一部分誤判。這里涉及到許多問題,都是情感分析的難點:
(2)、拼寫糾錯
拼寫糾錯本質上也是一個分類問題。但按照錯誤類型不同,又分為兩種情況:
真詞錯誤復雜一些,我們將在接下來的文章中進行探討。而對於非詞錯誤,就可以直接採用貝葉斯方法,其基本思路如下:
訓練樣本1:該場景下的正常用詞語料庫,用於計算 P(候選詞i)。
訓練樣本2:該場景下錯誤詞與正確詞對應關系的語料庫,用於計算 P(錯誤詞|候選詞i)
當然,樸素貝葉斯也是有缺陷的。比如我們知道樸素貝葉斯的局限性來源於其條件獨立假設,它將文本看成是詞袋子模型,不考慮詞語之間的順序信息,例如:樸素貝葉斯會把「武松打死了老虎」與「老虎打死了武松」認作是一個意思。那麼有沒有一種方法提高其對詞語順序的識別能力呢?當然有,就是這里要提到的N-gram語言模型。接下來詳細給大家介紹N-gram語言模型。
1、從假設性獨立到聯合概率鏈規則
與我們之前我們垃圾郵件識別中的條件獨立假設是一樣的:
4、N-gram實際應用舉例
(1)、詞性標注
詞性標注是一個典型的多分類問題。常見的詞性包括名詞、動詞、形容詞、副詞等。而一個詞可能屬於多種詞性。如「愛」,可能是動詞,可能是形容詞,也可能是名詞。但是一般來說,「愛」作為動詞還是比較常見的。所以統一給「愛」分配為動詞准確率也還足夠高。這種最簡單粗暴的思想非常好實現,如果准確率要求不高則也比較常用。它只需要基於詞性標注語料庫做一個統計就夠了,連貝葉斯方法、最大似然法都不要用。詞性標注語料庫一般是由專業人員搜集好了的,長下面這個樣子。其中斜線後面的字母表示一種詞性,詞性越多說明語料庫分得越細;需要比較以下各概率的大小,選擇概率最大的詞性即可:
將公式進行以下改造,比較各概率的大小,選擇概率最大的詞性:
N-gram分類器是結合貝葉斯方法和語言模型的分類器。這里用 Y1,Y2分別表示這垃圾郵件和正常郵件,用 X表示被判斷的郵件的句子。根據貝葉斯公式有:
比較這些概率的大小,找出使得 P(Yi|X)最大的 Yi即可得到 X 所屬的分類(分詞方案)了。Yi作為分詞方案,其實就是個詞串,比如(「我司」,「可」,「辦理」,「正規發票」)(「我」,「司可辦」,「理正規」,「發票」),也就是一個向量了。而上面貝葉斯公式中 P(X|Yi)項的意思就是在分類方案 Yi的前提下,其對應句子為 X的概率。而無論分詞方案是(「我司」,「可」,「辦理」,「正規發票」)還是(「我」,「司可辦」,「理正規」,「發票」),或者其他什麼方案,其對應的句子都是「我司可辦理正規發票」。也就是說任意假想的一種分詞方式之下生成的句子總是唯一的(只需把分詞之間的分界符號扔掉剩下的內容都一樣)。於是可以將 P(X|Yi)看作是恆等於1的。這樣貝葉斯公式又進一步化簡成為:
也就是說我們
⑶ 樸素貝葉斯(Naive Bayes)模型
貝葉斯為了解決一個叫「逆向概率」問題寫了一篇文章,嘗試解答在沒有太多可靠證據的情況下,怎樣做出更符合數學邏輯的推測
「逆向概率」是相對「正向概率」而言
正向概率,比較容易理解,比如我們已經知道袋子裡面有N 個球,不是黑球就是白球,其中M個是黑球,那麼把手伸進去摸一個球,就能知道摸出黑球的概率是多少 => 這種情況往往是 上帝視角 ,即了解了事情的全貌再做判斷
逆向概率,貝葉斯則從實際場景出發,提了一個問題:如果我們事先不知道袋子裡面黑球和白球的比例,而是通過我們摸出來的球的顏色,能判斷出袋子裡面黑白球的比例么?
貝葉斯原理:
影響了接下來近200年的統計學理論
建立在主觀判斷的基礎上:在我們不了解所有客觀事實的情況下,同樣可以先估計一個值
先驗概率 ,通過經驗來判斷事情發生的概率
後驗概率 ,就是發生結果之後,推測原因的概率
條件概率 ,事件A 在另外一個事件B已經發生條件下的發生概率,表示為P(A|B)
似然函數 ,把概率模型的訓練過程理解為求參數估計的過程
比如,一個硬幣在10次拋落中正面均朝上 => 那麼這個硬幣是均勻的可能性是多少?這里硬幣均勻就是個參數,似然函數就是用來衡量這個模型的參數
經過推導,貝葉斯推理告訴我們後驗概率是與先驗概率和似然函數成正比得,即
Thinking:假設有一種病叫做「貝葉死」,它的發病率是萬分之一,即10000 人中會有1個人得病。現有一種測試可以檢驗一個人是否得病的准確率是99.9%,誤報率(假陽)是0.1%
那麼,如果一個人被查出來患有「葉貝死」,實際上患有的可能性有多大?
查出患有「貝葉死」的准確率是99.9%,是不是實際上患「貝葉死」的概率也是99.9%?)
在10000個人中,還存在0.1%的誤查的情況,也就是10個人沒有患病但是被診斷成陽性。當然10000個人中,也確實存在一個患有貝葉死的人,他有99.9%的概率被檢查出來
可以粗算下,患病的這個人實際上是這11個人裡面的一員,即實際患病比例是1/11≈9%
貝葉斯原理就是求解後驗概率,假設:A 表示事件 「測出為陽性」, B1 表示「患有貝葉死」, B2 表示「沒有患貝葉死」
患有貝葉死的情況下,測出為陽性的概率為 P(A|B1)=99.9%
沒有患貝葉死,但測出為陽性的概率為 P(A|B2)=0.1%
患有貝葉死的概率為 P(B1)=0.01%
沒有患貝葉死的概率 P(B2)=99.99%
那麼我們檢測出來為陽性,而且是貝葉死的概率P(B1,A)=P(B1)*P(A|B1)=0.01%*99.9%=0.00999% ≈0.01%
P(B1,A)代表的是聯合概率,同樣我們可以求得P(B2,A)=P(B2)*P(A|B2)=99.99%*0.1%=0.09999% ≈0.1%
檢查為陽性的情況下,患有貝葉死的概率,即P(B1|A)
檢查出是陽性的條件下,但沒有患有貝葉死的概率為
0.01%+0.1%均出現在了P(B1|A)和P(B2|A)的計算中作為分母,稱之為論據因子,也相當於一個權值因子
我們可以總結出貝葉斯公式
從而我們可以得到通用的貝葉斯公式
一種簡單但極為強大的預測建模演算法
假設每個輸入變數是獨立的。這是一個強硬的假設,實際情況並不一定,但是這項技術對於絕大部分的復雜問題仍然非常有效
樸素貝葉斯模型由兩種類型的概率組成:
每個類別的概率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的概率是2/3
Step1:先給出訓練數據,以及這些數據對應的分類
Step2,計算類別概率和條件概率
Step3,使用概率模型(基於貝葉斯原理)對新數據進行預測
樸素貝葉斯分類(離散值):
如何根據身高,體重,鞋碼,判斷是否為男女,比如一個新的數據:身高「高」、體重「中」,鞋碼「中」 => 男 or 女?
求在A1、A2、A3屬性下,Cj的概率
因為一共有2個類別,所以我們只需要求得P(C1|A1A2A3)和P(C2|A1A2A3)的概率即可,然後比較下哪個分類的可能性大,就是哪個分類結果
分別求下這些條件下的概率:
P(A1|C1)=1/2, P(A2|C1)=1/2, P(A3|C1)=1/4
P(A1|C2)=0, P(A2|C2)=1/2, P(A3|C2)=1/2
所以P(A1A2A3|C1)=1/16, P(A1A2A3|C2)=0
因為P(A1A2A3|C1)P(C1)>P(A1A2A3|C2)P(C2),所以應該是C1類別,即男性
身高180、體重120,鞋碼41,請問該人是男是女呢
可以假設男性和女性的身高、體重、鞋碼都是 正態分布 ,通過樣本計算出均值和方差,也就是得到 正態分布 的密度函數。有了密度函數,就可以把值代入,算出某一點的值
比如,男性的身高是 均值 179.5、 標准差 為3.697的正態分布。所以男性的身高為180的概率為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
很明顯這組數據分類為男的概率大於分類為女的概率
NORMDIST(x,mean,standard_dev,cumulative)
x:正態分布中,需要計算的數值;
Mean:正態分布的平均值;
Standard_dev:正態分布的標准差;
Cumulative:取值為邏輯值,即False或True,決定了函數的形式當為True時,函數結果為累積分布
當為False時,函數結果為 概率密度
NORMDIST(180,179.5,3.697,0)=0.1069
stats.norm.pdf(x, mu, sigma)
返回參數為 和 的正態分布密度函數在x處的值
from scipy import stats
mu = 179.5
sigma = 3.697
x = 180
prob = stats.norm.pdf(x, mu, sigma)
print(prob)
常用於文本分類,文本過濾、情感預測、推薦系統等,尤其是對於英文等語言來說,分類效果很好
准備階段,需要確定特徵屬性,屬性值以及label => 訓練集
訓練階段,輸入是特徵屬性和訓練樣本,輸出是分類器,主要工作是計算每個類別在訓練樣本中的出現頻率及每個特徵屬性劃分對每個類別的條件概率
應用階段,使用分類器對新數據進行分類
sklearn工具使用:
高斯樸素貝葉斯:特徵變數是連續變數,符合高斯分布(正太分布),比如說人的身高,物體的長度
GaussianNB(priors=None) #模型創建
priors,先驗概率大小,如果沒有給定,模型則根據樣本數據自己計算(利用極大似然法)
查看模型對象的屬性:
class_prior_:每個樣本的概率
class_count_:每個類別的樣本數量
theta_:每個類別中每個特徵的均值
sigma_:每個類別中每個特徵的方差
多項式樸素貝葉斯:特徵變數是離散變數,符合多項分布,在文檔分類中特徵變數體現在一個單詞出現的次數,或者是單詞的TF-IDF值等
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
alpha:先驗平滑因子,默認等於1,當等於1時表示拉普拉斯平滑
fit_prior:是否去學習類的先驗概率,默認是True
class_prior:各個類別的先驗概率,如果沒有指定,則模型會根據數據自動學習, 每個類別的先驗概率相同,即類別數N分之一
模型對象的屬性:
class_count_: 訓練樣本中各類別對應的樣本數
feature_count_: 每個類別中各個特徵出現的次數
伯努利樸素貝葉斯:特徵變數是布爾變數,符合0/1分布,在文檔分類中特徵是單詞是否出現
BernoulliNB(alpha=1.0, fit_prior=True, class_prior=None)
alpha:平滑因子,與多項式中的alpha一致
fit_prior:是否去學習類的先驗概率,默認是True
class_prior:各個類別的先驗概率,如果沒有指定,則模型會根據數據自動學習, 每個類別的先驗概率相同,即類別數N分之一
模型對象的屬性:
class_count_: 訓練樣本中各類別對應的樣本數
feature_count_: 每個類別中各個特徵出現的次數
# MNIST手寫數字分類(多種分類方法)
# 分割數據,將25%的數據作為測試集,其餘作為訓練集
train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
# 創建LR分類器
model = LogisticRegression()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('LR准確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創建GaussianNB分類器
model = GaussianNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('GaussianNB准確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創建MultinomialNB分類器
model = MultinomialNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('MultinomialNB准確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創建BernoulliNB分類器
model = BernoulliNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('BernoulliNB准確率: %0.4lf' % accuracy_score(predict_y, test_y))
根據訓練的結果選擇最接近的方案
⑷ 機器學習實戰的作品目錄
目錄第一部分分類第1章機器學習基礎21.1 何謂機器學習31.1.1 感測器和海量數據41.1.2 機器學習非常重要51.2 關鍵術語51.3 機器學習的主要任務71.4 如何選擇合適的演算法81.5 開發機器學習應用程序的步驟91.6 Python語言的優勢101.6.1 可執行偽代碼101.6.2 Python比較流行101.6.3 Python語言的特色111.6.4 Python語言的缺點111.7 NumPy函數庫基礎121.8 本章小結13第2章k-近鄰演算法 152.1 k-近鄰演算法概述152.1.1 准備:使用Python導入數據172.1.2 從文本文件中解析數據192.1.3 如何測試分類器202.2 示例:使用k-近鄰演算法改進約會網站的配對效果202.2.1 准備數據:從文本文件中解析數據212.2.2 分析數據:使用Matplotlib創建散點圖232.2.3 准備數據:歸一化數值252.2.4 測試演算法:作為完整程序驗證分類器262.2.5 使用演算法:構建完整可用系統272.3 示例:手寫識別系統282.3.1 准備數據:將圖像轉換為測試向量292.3.2 測試演算法:使用k-近鄰演算法識別手寫數字302.4 本章小結31第3章決策樹 323.1 決策樹的構造333.1.1 信息增益353.1.2 劃分數據集373.1.3 遞歸構建決策樹393.2 在Python中使用Matplotlib註解繪制樹形圖423.2.1 Matplotlib註解433.2.2 構造註解樹443.3 測試和存儲分類器483.3.1 測試演算法:使用決策樹執行分類493.3.2 使用演算法:決策樹的存儲503.4 示例:使用決策樹預測隱形眼鏡類型503.5 本章小結52第4章基於概率論的分類方法:樸素貝葉斯 534.1 基於貝葉斯決策理論的分類方法534.2 條件概率554.3 使用條件概率來分類564.4 使用樸素貝葉斯進行文檔分類574.5 使用Python進行文本分類584.5.1 准備數據:從文本中構建詞向量584.5.2 訓練演算法:從詞向量計算概率604.5.3 測試演算法:根據現實情況修改分類器624.5.4 准備數據:文檔詞袋模型644.6 示例:使用樸素貝葉斯過濾垃圾郵件644.6.1 准備數據:切分文本654.6.2 測試演算法:使用樸素貝葉斯進行交叉驗證664.7 示例:使用樸素貝葉斯分類器從個人廣告中獲取區域傾向684.7.1 收集數據:導入RSS源684.7.2 分析數據:顯示地域相關的用詞714.8 本章小結72第5章Logistic回歸 735.1 基於Logistic回歸和Sigmoid函數的分類745.2 基於最優化方法的最佳回歸系數確定755.2.1 梯度上升法755.2.2 訓練演算法:使用梯度上升找到最佳參數775.2.3 分析數據:畫出決策邊界795.2.4 訓練演算法:隨機梯度上升805.3 示例:從疝氣病症預測病馬的死亡率855.3.1 准備數據:處理數據中的缺失值855.3.2 測試演算法:用Logistic回歸進行分類865.4 本章小結88第6章支持向量機896.1 基於最大間隔分隔數據896.2 尋找最大間隔916.2.1 分類器求解的優化問題926.2.2 SVM應用的一般框架936.3 SMO高效優化演算法946.3.1 Platt的SMO演算法946.3.2 應用簡化版SMO演算法處理小規模數據集946.4 利用完整Platt SMO演算法加速優化996.5 在復雜數據上應用核函數1056.5.1 利用核函數將數據映射到高維空間1066.5.2 徑向基核函數1066.5.3 在測試中使用核函數1086.6 示例:手寫識別問題回顧1116.7 本章小結113第7章利用AdaBoost元演算法提高分類性能 1157.1 基於數據集多重抽樣的分類器1157.1.1 bagging:基於數據隨機重抽樣的分類器構建方法1167.1.2 boosting1167.2 訓練演算法:基於錯誤提升分類器的性能1177.3 基於單層決策樹構建弱分類器1187.4 完整AdaBoost演算法的實現1227.5 測試演算法:基於AdaBoost的分類1247.6 示例:在一個難數據集上應用AdaBoost1257.7 非均衡分類問題1277.7.1 其他分類性能度量指標:正確率、召回率及ROC曲線1287.7.2 基於代價函數的分類器決策控制1317.7.3 處理非均衡問題的數據抽樣方法1327.8 本章小結132第二部分利用回歸預測數值型數據第8章預測數值型數據:回歸 1368.1 用線性回歸找到最佳擬合直線1368.2 局部加權線性回歸1418.3 示例:預測鮑魚的年齡1458.4 縮減系數來「理解」數據1468.4.1 嶺回歸1468.4.2 lasso1488.4.3 前向逐步回歸1498.5 權衡偏差與方差1528.6 示例:預測樂高玩具套裝的價格1538.6.1 收集數據:使用Google購物的API1538.6.2 訓練演算法:建立模型1558.7 本章小結158第9章樹回歸1599.1 復雜數據的局部性建模1599.2 連續和離散型特徵的樹的構建1609.3 將CART演算法用於回歸1639.3.1 構建樹1639.3.2 運行代碼1659.4 樹剪枝1679.4.1 預剪枝1679.4.2 後剪枝1689.5 模型樹1709.6 示例:樹回歸與標准回歸的比較1739.7 使用Python的Tkinter庫創建GUI1769.7.1 用Tkinter創建GUI1779.7.2 集成Matplotlib和Tkinter1799.8 本章小結182第三部分無監督學習第10章利用K-均值聚類演算法對未標注數據分組18410.1 K-均值聚類演算法18510.2 使用後處理來提高聚類性能18910.3 二分K-均值演算法19010.4 示例:對地圖上的點進行聚類19310.4.1 Yahoo! PlaceFinder API19410.4.2 對地理坐標進行聚類19610.5 本章小結198第11章使用Apriori演算法進行關聯分析20011.1 關聯分析20111.2 Apriori原理20211.3 使用Apriori演算法來發現頻繁集20411.3.1 生成候選項集20411.3.2 組織完整的Apriori演算法20711.4 從頻繁項集中挖掘關聯規則20911.5 示例:發現國會投票中的模式21211.5.1 收集數據:構建美國國會投票記錄的事務數據集21311.5.2 測試演算法:基於美國國會投票記錄挖掘關聯規則21911.6 示例:發現毒蘑菇的相似特徵22011.7 本章小結221第12章使用FP-growth演算法來高效發現頻繁項集22312.1 FP樹:用於編碼數據集的有效方式22412.2 構建FP樹22512.2.1 創建FP樹的數據結構22612.2.2 構建FP樹22712.3 從一棵FP樹中挖掘頻繁項集23112.3.1 抽取條件模式基23112.3.2 創建條件FP樹23212.4 示例:在Twitter源中發現一些共現詞23512.5 示例:從新聞網站點擊流中挖掘23812.6 本章小結239第四部分其他工具第13章利用PCA來簡化數據24213.1 降維技術24213.2 PCA24313.2.1 移動坐標軸24313.2.2 在NumPy中實現PCA24613.3 示例:利用PCA對半導體製造數據降維24813.4 本章小結251第14章利用SVD簡化數據25214.1 SVD的應用25214.1.1 隱性語義索引25314.1.2 推薦系統25314.2 矩陣分解25414.3 利用Python實現SVD25514.4 基於協同過濾的推薦引擎25714.4.1 相似度計算25714.4.2 基於物品的相似度還是基於用戶的相似度?26014.4.3 推薦引擎的評價26014.5 示例:餐館菜餚推薦引擎26014.5.1 推薦未嘗過的菜餚26114.5.2 利用SVD提高推薦的效果26314.5.3 構建推薦引擎面臨的挑戰26514.6 基於SVD的圖像壓縮26614.7 本章小結268第15章大數據與MapRece27015.1 MapRece:分布式計算的框架27115.2 Hadoop流27315.2.1 分布式計算均值和方差的mapper27315.2.2 分布式計算均值和方差的recer27415.3 在Amazon網路服務上運行Hadoop程序27515.3.1 AWS上的可用服務27615.3.2 開啟Amazon網路服務之旅27615.3.3 在EMR上運行Hadoop作業27815.4 MapRece上的機器學習28215.5 在Python中使用mrjob來自動化MapRece28315.5.1 mrjob與EMR的無縫集成28315.5.2 mrjob的一個MapRece腳本剖析28415.6 示例:分布式SVM的Pegasos演算法28615.6.1 Pegasos演算法28715.6.2 訓練演算法:用mrjob實現MapRece版本的SVM28815.7 你真的需要MapRece嗎?29215.8 本章小結292附錄A Python入門294附錄B 線性代數303附錄C 概率論復習309附錄D 資源312索引313版權聲明316
⑸ 5.5.1樸素貝葉斯原理
它是一種預測建模演算法。之所以稱為樸素貝葉斯,是因為它假設每個輸入
變數是獨立的。這個假設現實生活中根本不滿足,但對絕大部分復雜問題仍然非常有效。
樸素貝葉斯模型由兩種類型的概率組成:
1、每個類別的概率P(Cj);
2、每個屬性的條件概率P(Ai|Cj)。
比如:cj就表示男女,比如c0=男,c1=女,而Ai就表示影響預測為男女的因素(身高、
體重、鞋碼),比如A0=身高,A1=體重,A2=鞋碼
為了訓練樸素貝葉斯分類器模型,我們需要先給出訓練數據,以及這些數據對應的分
類。那麼類別概率和條件概率。可從訓練數據計算出來。
一旦計算出來,概率模型就可以使用貝葉斯原理對新數據進行預測。
預測的原理就是,加入我們是一個而分類問題,C0表示正樣本,C1表示負樣本,則預測的結果就是去比較 P(C0|A1A2A3) 與 P(C1|A1A2A3)的大小。那個樣本的概率高,就被預測為哪一類。
1.貝葉斯原理是最大的概念,它解決了概率論中「逆向概率」的問題,在這個理論基礎上,人們設計出了貝葉斯分類器
(1)實時預測 # 樣本變化,概率變化
(2)多類預測,預測不同類別的可能性
(3)文本分類/垃圾郵件/情感分析 : 文本:變數類型多,更獨立 樸素貝葉斯:執果索因,屬於某個類別是某幾個單詞存在與否造成的
(4)推薦系統,樸素貝葉斯和協同過濾結合過濾用戶想看到和不想看到的東西
(1) 高斯分布樸素貝葉斯GaussianNB
用處:解決連續數據分類問題。
如果數據集是連續型的,如身高,數據做正態分布,數據在分布的某個位置,對應一個概率,即根據正態分布的概率密度函數算出。 # 盡可能把數據集轉換成標准正態分布(stand_scaler)。不過最好是做離散再做其他的概率模型。
(2) 多項式樸素⻉葉斯MultinomialNB
用處:處理離散數據建模,數據集盡可能離散。
離散數據集(可將連續數據做離散處理,如分箱處理)
計數,身高低,1,2,3.
(3) 伯努利樸素⻉葉斯BernoulliNB
用處:數據特徵可以表達是或不是,可用。
離散數據集,數據是與否,0或1
互斥事件一定不獨立(因為一件事的發生導致了另一件事不能發生);
獨立事件一定不互斥(如果獨立事件互斥, 那麼根據互斥事件一定不獨立,就會矛盾)
問題修改為:到達公司未遲到選擇第1條路的概率是多
少?
在知道未遲到結果的基礎上問選擇第一條路的概率,並不是直接可得出的。 故有:
所以選擇第一條路的概率為0.28
貝葉斯公式是當已知結果,問導致這個結果的第i原因的可能性是多少?執果索因!
例:
假設有一種病叫做「貝」,它的發病率是萬分之一,現有一種測試可以檢驗一個人是否得病的准確率是 99.9%,它的誤報率是 0.1%,那麼現在的問題是,如果一個人被查出來患有「貝」,實際上患有的可能性有多大?
問題分析:
假設:A 表示事件 「測出為陽性」, 用 B1 表示「患有貝」, B2 表示「沒有患貝」。
P(A|B1)=99.9%,P(A|B2)=0.1%。
患有貝葉死的概率為 P(B1)=0.01%,沒有患貝葉死的概率 P(B2)=99.99%。
以上可以認為是先驗概率。
想求 P(B1|A)
先驗概率: 通過經驗來判斷事情發生的概率,就是先驗概率。也就是能根據樣本值估算出來的概率
後驗概率: 就是發生結果之後,推測原因的概率。比如說你遲到了,那麼原因可能是 A、B 或 C。其中遲到是因為原因A的概率就是後驗概率。它是屬於條件概率的一種。 # 及可根據先驗概率求解出來的。
⑹ 樸素貝葉斯演算法是什麼
樸素貝葉斯方法是在貝葉斯演算法的基礎上進行了相應的簡化,即假定給定目標值時屬性之間相互條件獨立。
也就是說沒有哪個屬性變數對於決策結果來說佔有著較大的比重,也沒有哪個屬性變數對於決策結果佔有著較小的比重。雖然這個簡化方式在一定程度上降低了貝葉斯分類演算法的分類效果,但是在實際的應用場景中,極大地簡化了貝葉斯方法的復雜性。
樸素貝葉斯分類(NBC)是以貝葉斯定理為基礎並且假設特徵條件之間相互獨立的方法,先通過已給定的訓練集,以特徵詞之間獨立作為前提假設,學習從輸入到輸出的聯合概率分布,再基於學習到的模型,輸入X求出使得後驗概率最大的輸出Y。
個人貢獻:
貝葉斯在數學方面主要研究概率論。他首先將歸納推理法用於概率論基礎理論,並創立了貝葉斯統計理論,對於統計決策函數、統計推斷、統計的估算等做出了貢獻。1763年發表了這方面的論著,對於現代概率論和數理統計都有很重要的作用。貝葉斯的另一著作《機會的學說概論》發表於1758年.貝葉斯所採用的許多術語被沿用至今。
他對統計推理的主要貢獻是使用了"逆概率"這個概念,並把它作為一種普遍的推理方法提出來。貝葉斯定理原本是概率論中的一個定理,這一定理可用一個數學公式來表達,這個公式就是著名的貝葉斯公式。
⑺ 分類演算法 - 樸素貝葉斯演算法
相信很多同學在高中或者大學的時候都學過貝葉斯原理,即條件原理。
現分別有 A、B 兩個容器,在容器 A 里分別有 7 個紅球和 3 個白球,在容器 B 里有 1 個紅球和 9 個白球,現已知從這兩個容器里任意抽出了一個紅球,問這個球來自容器 A 的概率是多少?
假設已經抽出紅球為事件 B,選中容器 A 為事件 A,則有:P(B) = 8/20,P(A) = 1/2,P(B|A) = 7/10,按照公式,則有:P(A|B) = (7/10)*(1/2) / (8/20) = 0.875
之所以稱為樸素貝葉斯, 是因為它假設每個輸入變數是獨立的。 現實生活中這種情況基本不滿足,但是這項技術對於絕大部分的復雜問題仍然非常有效。
樸素貝葉斯模型由兩種類型的概率組成:
1、每個類別的概率P(Cj);
2、每個屬性的條件概率P(Ai|Cj)。
為了訓練樸素貝葉斯模型,我們需要先給出訓練數據,以及這些數據對應的分類。那麼上面這兩個概率,也就是類別概率和條件概率。他們都可以從給出的訓練數據中計算出來。一旦計算出來,概率模型就可以使用貝葉斯原理對新數據進行預測。
貝葉斯原理、貝葉斯分類和樸素貝葉斯這三者之間是有區別的
貝葉斯原理是最大的概念,它解決了概率論中「逆向概率」的問題,在這個理論基礎上,人們設計出了貝葉斯分類器,樸素貝葉斯分類是貝葉斯分類器中的一種,也是最簡單,最常用的分類器。樸素貝葉斯之所以樸素是因為它假設屬性是相互獨立的,因此對實際情況有所約束, 如果屬性之間存在關聯,分類准確率會降低。
(1) 演算法邏輯簡單,易於實現
(2)分類過程中時空開銷小(假設特徵相互獨立,只會涉及到二維存儲)
(1)理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。
(2)在屬性相關性較小時,樸素貝葉斯性能最為良好。對於這一點,有半樸素貝葉斯之類的演算法通過考慮部分關聯性適度改進。
庫有3種演算法:GaussianNB、MultinomialNB和BernoulliNB。
這三個類適用的分類場景各不相同,主要根據數據類型來進行模型的選擇。一般來說,如果樣本特徵的分布大部分是連續值,使用GaussianNB會比較好。如果如果樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。
⑻ 數據挖掘-樸素貝葉斯演算法
樸素貝葉斯演算法,主要用於對相互獨立的屬性的類變數的分類預測。(各個屬性/特徵之間完全沒有關系,叫做相互獨立,事實上這很難存在,但是這個方法依然比較有效。)
大學的概率論里一般都學過這個貝葉斯定理,簡單闡述如下:
若事件 , ,…構成一個事件且都有正概率,則對任意一個事件Y,有如下公式成立:則有
如果X表示特徵/屬性,Y表示類變數,如果類變數和屬性之間的關系不確定,那麼X和Y可以視作隨機變數,則 為Y的後驗概率, 為Y的先驗概率。
以圖為例:
我們需要根據身高、體重、鞋碼判斷是男是女,則Y就是性別,X就是(身高、體重、鞋碼)這一組特徵。如果我們要先算是男的概率,則先驗概率就是 ,而後驗概率則是我們未來將要輸入的一組特徵已知的情況下,Y=男的概率(要預測的分類的概率),這樣的話,根據貝葉斯定理,我們就可以用 來求出 ,這就是貝葉斯定理在預測中的應用。
假設Y變數取y值時概率為P(Y=y),X中的各個特徵相互獨立,則有公式如下:
其中每個特徵集X包含d個特徵。
根據公式,對比上面的圖來說,如果性別是男的時候,身高是高,體重是重,鞋碼為大的概率就等於
有了這個公式,結合之前的貝葉斯公式,就能得到給定一組特徵值的情況下, 這組特徵屬於什麼樣的類別的概率公式:
其中的X代表一組特徵, 代表一組中的一個。
對於所有的Y來說,P(X)時固定的,因此只要找出使分子 最大的類別就可以判斷預測的類別了。
的概率分為兩種情況來區別,一種是對分類特徵的概率確定,一種是連續特徵的概率確定。
接下來借用《數據挖掘導論》上的例子來說明概率確定的方式。
對於分類的特徵,可以首先找到訓練集中為y值的個數,然後根據不同的特徵類型占這些個數中的比例作為分類特徵的概率。
例如上表中求不拖欠貸款的情況下,有房的人數就是 ,不拖欠貸款的有7個,其中有房的是3個。以此類推可以求出婚姻狀況的條件概率。
年收入是連續特徵,需要區分對待。
根據上述演算法,如果要求沒有拖欠貸款情況下,年收入是120K的概率,就是
如果要預測測試記錄 X =(有房=否,婚姻狀況=已婚,年收入=120K)這個樣本是否可能拖欠貸款,則需要計算兩個概率: 和
則有:
由於 是不變的(對於Y=是和Y=否),則只考慮上面的分子即可,那麼拋開P(X)不看,則有:
其中7/10就是P(Y=否),α是P(X)
同理可得P(Y=是|X) = 1 * 0 * 1.2e-1 = 0.
這樣一比較,那麼分類就是否。
看這個例子中,如果有一個特徵的條件概率是0,那麼整體的概率就是0,從而後驗概率也一定是0,那麼如果訓練集樣本太少,這種方法就不是很准確了。
如果當訓練集樣本個數比特徵還少的時候,就無法分類某些測試集了,因此引入 m估計(m-estimate) 來估計條件概率,公式如下:
其中,n是類 中的樣本總數, 是類 中取 的樣本數, 是稱為等價樣本大小的參數, 是用戶指定的參數,p可以看作在類 中觀察特徵值 的先驗概率。等價樣本大小決定先驗概率 和觀測概率 之間的平衡。
引入m估計的根本原因是樣本數量過小。所以為了避免此問題,最好的方法是等效的擴大樣本的數量,即在為觀察樣本添加m個等效的樣本,所以要在該類別中增加的等效的類別的數量就是等效樣本數m乘以先驗估計p。
在之前的例子中,設m=3,p=1/3(m可以設置為特徵數量,p則是倒數)。則:
從而可以重新計算 。從而解決了某個條件概率為0的問題。
面對相互獨立的特徵比較適用,如果有相關的特徵,則會降低其性能。
⑼ 樸素貝葉斯演算法
貝葉斯演算法是由英國數學家托馬斯·貝葉斯提出的,這個演算法的提出是為了解決「逆向概率」的問題。首先我們先來解釋下正向概率與逆向概率的含義:
正向概率 :假設一個箱子里有5個黃色球和5個白色球,隨機從箱子里拿出一個球,請問取出的是黃球的概率是多少?很容易計算P(黃球)= N(黃球)/N(黃球)+ N(白球) = 5/5+5 = 1/2。
逆向概率 :起初我們並不知道箱子里有多少個球,我們依次從箱子里取出10個球,發現這個10個球中有7個白球,3個黃球,那麼我們會根據我們觀察到的結果去推測箱子里白球與黃球的分布比例大概是7:3,但是我們無法推測出箱子里的球的個數。
貝葉斯演算法是一種基於概率統計的機器學習演算法,它會計算出每種情況發生的概率,然後對其進行分類,貝葉斯演算法經常用於文本分類問題和垃圾郵件過濾問題。假設有一篇新聞報道news report,我們使用貝葉斯演算法來判斷它們的類別,結果如下:
p(politics|news) = 0.2
p(entertainment|news) = 0.4
p(sports|news) = 0.7
因為p(sports|news)的概率最大,所以我們判斷這篇新聞報道為體育類報道。「|」左邊為要判斷的類別,右邊是我們給定的文章。
貝葉斯公式推導
接下來,我們將通過一個例子來推導貝葉斯公式。在一所學校里,男生和女生的比例分別是60%和40%,男生全部穿長褲,女生一半穿長褲,一半穿裙子。現迎面走來一個同學,你只能看清他(她)穿的是長褲,而無法分辨出他(她)的性別,請問他(她)是女生的概率?
下面我們逐步計算這個問題:
假設學校里的學生總數為N。
男生人數:N * P(boys),女生人數:N * P(girls)。
穿長褲的男生人數:N * P(boys) * P(pants|boys),其中P(pants|boys)是條件概率的表達形式,意思是男生中穿長褲的概率。因為男生都穿長褲,所以N * P(boys) * P(pants|boys) = 60% * N。
穿長褲的女生的人數:N * P(girs) * P(pants|girls) = 0.2 * N。
穿長褲的總人數:N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls)
穿長褲的同學是女生的概率:P(girl|pants) = N * P(girs) * P(pants|girls) / N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls) = P(girs)*P(pants|girls) / P(pants),分母用P(pants)表示穿長褲的概率。
最終結果:P(girl | pants) = P(pants | girl) * P(girl) / P(pants)
其中:P(girl)我們稱為先驗概率,是已知值,在這個例子中P(girl) = 40%。先驗概率:根據以往的經驗和分析得到的結果,先驗概率和其他條件的影響不受樣本影響。
P(girl | pants)我們稱為後驗概率,根據觀察到的結果,去反推是女生的概率。
貝葉斯數學表達式
貝葉斯演算法在垃圾郵件過濾中的應用
給定一封郵件,判定它是否屬於垃圾郵件?用D 來表示這封郵件,注意D 由N 個單片語成。我們用h+ 來表示垃圾郵件,h-表示正常郵件。
有貝葉斯公式可得:
P(h+ | D) = P(D | h+) * P(h+) / P(D)
P(h- | D) = P(D | h-) * P(h-) / P(D)
其中P(h+),P(h-)為先驗概率,假如我們有1000封郵件,其中有50封是垃圾郵件,其他都是正常郵件,那麼P(h+),P(h-)的概率就是已知的。兩個式子的分母都是P(D),所以P(D)對於最終結果的比較是沒有影響的。接下來就是要求P(D | h+),P(D | h-)垃圾郵件中或正常郵件中是郵件D的概率。
我們都知道一封郵件是由許多詞構成的,所以我們將P(D | h+)的表達式轉化為P(d1,d2,d3......dn | h+),就是看垃圾郵件中出現d1,d2...dn這些詞的概率是多少。
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 |d1,h+) * P(d3 |d1,d2,h+) ...
這個式子計算起來非常困難,所以在這里我們做一個假設,假設每個詞都是獨立的並且互不影響,那麼這個式子就可以表示為:
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)
P(h+ | D) = {P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)}* P(h+) / P(D)
上述這個式子我們就稱為樸素貝葉斯公式,樸素貝葉斯公式是對貝葉斯公式的簡化,它建立在每個條子互相獨立的基礎上。
在現實生活中,我們寫的每一句話中詞與詞之間肯定是有相互聯系,如果沒有聯系,那麼這句話是讀不通的。那麼為什麼樸素貝葉斯能夠在計算中使用,首先是計算簡單,其次對最終結果的影響非常小。
參考資料
1.唐宇迪,《機器學習與數據分析實戰》課程。
2.Peter,《機器學習實戰》。
⑽ 數據挖掘十大經典演算法(1)——樸素貝葉斯(Naive Bayes)
在此推出一個演算法系列的科普文章。我們大家在平時埋頭工程類工作之餘,也可以抽身對一些常見演算法進行了解,這不僅可以幫助我們拓寬思路,從另一個維度加深對計算機技術領域的理解,做到觸類旁通,同時也可以讓我們搞清楚一些既熟悉又陌生的領域——比如數據挖掘、大數據、機器學習——的基本原理,揭開它們的神秘面紗,了解到其實很多看似高深的領域,其實背後依據的基礎和原理也並不復雜。而且,掌握各類演算法的特點、優劣和適用場景,是真正從事數據挖掘工作的重中之重。只有熟悉演算法,才可能對紛繁復雜的現實問題合理建模,達到最佳預期效果。
本系列文章的目的是力求用最干練而生動的講述方式,為大家講解由國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 於2006年12月評選出的數據挖掘領域的十大經典演算法。它們包括:
本文作為本系列的第一篇,在介紹具體演算法之前,先簡單為大家鋪墊幾個數據挖掘領域的常見概念:
在數據挖掘領域,按照演算法本身的行為模式和使用目的,主要可以分為分類(classification),聚類(clustering)和回歸(regression)幾種,其中:
打幾個不恰當的比方 :
另外,還有一個經常有人問起的問題,就是 數據挖掘 和 機器學習 這兩個概念的區別,這里一句話闡明我自己的認識:機器學習是基礎,數據挖掘是應用。機器學習研製出各種各樣的演算法,數據挖掘根據應用場景把這些演算法合理運用起來,目的是達到最好的挖掘效果。
當然,以上的簡單總結一定不夠准確和嚴謹,更多的是為了方便大家理解打的比方。如果大家有更精當的理解,歡迎補充和交流。
好了,鋪墊了這么多,現在終於進入正題!
作為本系列入門的第一篇,先為大家介紹一個容易理解又很有趣的演算法—— 樸素貝葉斯 。
先站好隊,樸素貝葉斯是一個典型的 有監督的分類演算法 。
光從名字也可以想到,要想了解樸素貝葉斯,先要從 貝葉斯定理 說起。
貝葉斯定理是我們高中時代學過的一條概率學基礎定理,它描述了條件概率的計算方式。不要怕已經把這些知識還給了體育老師,相信你一看公式就能想起來。
P(A|B)表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:
其中,P(AB)表示A和B同時發生的概率,P(B)標識B事件本身的概率。
貝葉斯定理之所以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A)。
而貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。
下面不加證明地直接給出貝葉斯定理:
有了貝葉斯定理這個基礎,下面來看看樸素貝葉斯演算法的基本思路。
你看,其思想就是這么的樸素。那麼,屬於每個分類的概率該怎麼計算呢?下面我們先祭出形式化語言!
那麼現在的關鍵就是如何計算第3步中的各個條件概率。我們可以這么做:
因為分母對於所有類別為常數,因為我們只要將分子最大化皆可。又因為各特徵屬性是條件獨立的,所以有:
如果你也跟我一樣,對形式化語言有嚴重生理反應,不要怕,直接跳過前面這一坨,我們通過一個鮮活的例子,用人類的語言再解釋一遍這個過程。
某個醫院早上收了六個門診病人,如下表。
現在又來了第七個病人,是一個打噴嚏的建築工人。請問他最有可能患有何種疾病?
本質上,這就是一個典型的分類問題, 症狀 和 職業 是特徵屬性, 疾病種類 是目標類別
根據 貝葉斯定理
可得
假定"打噴嚏"和"建築工人"這兩個特徵是獨立的,因此,上面的等式就變成了
這是可以計算的。
因此,這個打噴嚏的建築工人,有66%的概率是得了感冒。同理,可以計算這個病人患上過敏或腦震盪的概率。比較這幾個概率,就可以知道他最可能得什麼病。
接下來,我們再舉一個樸素貝葉斯演算法在實際中經常被使用的場景的例子—— 文本分類器 ,通常會用來識別垃圾郵件。
首先,我們可以把一封郵件的內容抽象為由若干關鍵片語成的集合,這樣是否包含每種關鍵詞就成了一封郵件的特徵值,而目標類別就是 屬於垃圾郵件 或 不屬於垃圾郵件
假設每個關鍵詞在一封郵件里出現與否的概率相互之間是獨立的,那麼只要我們有若干已經標記為垃圾郵件和非垃圾郵件的樣本作為訓練集,那麼就可以得出,在全部垃圾郵件(記為Trash)出現某個關鍵詞Wi的概率,即 P(Wi|Trash)
而我們最重要回答的問題是,給定一封郵件內容M,它屬於垃圾郵件的概率是多大,即 P(Trash|M)
根據貝葉斯定理,有
我們先來看分子:
P(M|Trash) 可以理解為在垃圾郵件這個范疇中遇見郵件M的概率,而一封郵件M是由若干單詞Wi獨立匯聚組成的,只要我們所掌握的單詞樣本足夠多,因此就可以得到
這些值我們之前已經可以得到了。
再來看分子里的另一部分 P(Trash) ,這個值也就是垃圾郵件的總體概率,這個值顯然很容易得到,用訓練集中垃圾郵件數除以總數即可。
而對於分母來說,我們雖然也可以去計算它,但實際上已經沒有必要了,因為我們要比較的 P(Trash|M) 和 P(non-Trash|M) 的分母都是一樣的,因此只需要比較分子大小即可。
這樣一來,我們就可以通過簡單的計算,比較郵件M屬於垃圾還是非垃圾二者誰的概率更大了。
樸素貝葉斯的英文叫做 Naive Bayes ,直譯過來其實是 天真的貝葉斯 ,那麼他到底天真在哪了呢?
這主要是因為樸素貝葉斯的基本假設是所有特徵值之間都是相互獨立的,這才使得概率直接相乘這種簡單計算方式得以實現。然而在現實生活中,各個特徵值之間往往存在一些關聯,比如上面的例子,一篇文章中不同單詞之間一定是有關聯的,比如有些詞總是容易同時出現。
因此,在經典樸素貝葉斯的基礎上,還有更為靈活的建模方式—— 貝葉斯網路(Bayesian Belief Networks, BBN) ,可以單獨指定特徵值之間的是否獨立。這里就不展開了,有興趣的同學們可以做進一步了解。
最後我們來對這個經典演算法做個點評:
優點:
缺點:
好了,對於 樸素貝葉斯 的介紹就到這里,不知道各位看完之後是否會對數據挖掘這個領域產生了一點興趣了呢?