理解朴素贝叶斯
前言
在對我的數據科學與人工智能小組的新人進行小規模授課時講課內容整理,有改動和刪減.這可能是目前網絡上最全面也最簡單易懂的有關樸素貝葉斯的文章
有關貝葉斯的一些閑談
無論是在生活中還是我們的科學理論中,經常會估計概率.比如,我們計算一下明天下雨的概率,或者中彩票的概率,或者其他概率.概率就是可能性.
但是在人工智能領域關于概率的問題卻產生了兩個不同的流派,那就是貝葉斯派和頻率學派.頻率學派認為萬物發展尤其內在規律,我們要做的是找到那個固有的頻率.而貝葉斯派則認為概率服從一定的分布,我們可以通過數據估計出來.不過這些差異并不算什么重點.我們今天要學貝葉斯派,簡單點來說就是因為它有用,有用之處在哪里呢?
有用之處就在于我們可以求出逆向的概率,也就是我們知道了一個盒子里有三個白球,兩個紅球,另一個盒子里有三個紅球,兩個白球,我們隨便從一個盒子里面拿出了一個紅球,就可以反向求出這個紅球最有可能是那個盒子里的.換個說法也就是你知道今天下雨了,那么你也就可以推測出昨天什么天氣.當然了,除非你失憶了,不然你基本上知道昨天什么天氣.——-不管話說回來,在現實情況中我們經常不知道一件事情的原因是什么,那么這個時候貝葉斯定理就有用了.而且是非常的有用.
前向概率與逆向概率
各位大一的萌新還沒有學概率論,不過有些東西你們一定知道,那就是一個盒子里邊有三個白球,兩個紅球,那么拿出一顆球,白球的概率是多少,紅球的概率是多少.
答案很顯然,白球五分之三,紅球五分之二.五分之三加五分之二等于一,也就是百分之百會拿出來白球或者紅球
那么又有一個箱子,里面有三個紅球,兩個白球,請問從兩個箱子里拿出一個球,白球概率是多少,紅球概率是多少.
答案也很顯然,白球是(五加五)分之(三加二)等于二分之一,紅球一樣也是二分之一.
那么現在我們就可以反過來求球球了,假設我們拿出來了一顆白球,那么從第一個箱子里面拿出來白球的概率是多少?從第二個箱子里拿出來的概率是多少?
這個也很好算,反過來第一個箱子有三個白球,第二個箱子里邊有兩個白球,一共有五個白球,那么來自第一個箱子的概率也就是(三加二 )分(三),第二個箱子也就是五分之二.
那么這個白球最有可能從哪個盒子里拿出來呢?—第一個
這個時候,我們的貝葉斯定理其實就已經出來了,下面我們就可以把剛剛求逆概的語言抽象為數學語言,也就是數學公式表現出來了.
白球來自第一個盒子的概率 = 第一個盒子中白球的數量 / 所有白球的數量
這個時候我們要注意的是,我們雖然是使用數量來求解的,為了能夠讓這個公式更通用,我們把他轉換為概率
p(白球來自第一個盒子) = p(第一個盒子中的白球) / p(白球)
然后我們再抽象一次,球的顏色是b,盒子是a,那么白球就是b1,盒子一就是a1.
但是僅僅是換個符號還是不夠的,我們把盒子和白球的關系也用數學形式表現出了,比如白球來自于第一個盒子,也就是在 白球 的情況下,球來自第一個盒子的概率,我們記座盒子一|白球也就是a1|b1反過來第一個盒子中白球的比例也就是b1|a1,如果要具體求解的話,就使用乘法公式:p(b1|a1) = p(a1)*p(b1)
然后是第一個白球中的數量 ?(也就是全部球的數量 × 盒子一的比例 × 盒子一中白球的比例) / (全部球的數量 × 所有球中白球的比例)
數學公式也就是 n*p(a1)*p(b1|a1)/(n*p(b1) = p(a1)*p(b1|a1)/p(b1)
那么可得:
p(a1|b1) = p(a1)*p(b1|a1)/p(b1) = ((1/2) * (3/5)) / (1/2) = 3/5
這個時候我們的樸素貝葉斯定理已經出來一半了,那另一半是什么呢?那當然是樸素一下了,不過在那之前我們還是把上面的公式再抽象一下比較好
比如把a1抽象為xi,也就是任意特征,b1抽象為yi,也就是任意結果這樣原公式也就可以計算無論多少個盒子多少個球的情況了,同時又因為我們要求的是概率最大的那個盒子,那么原公式也就可以改寫為一下形式
y = arg max(y) P(yi)* p(x|yi)/p(x) # 因為要挑選出的是概率最大的元素,那么這個時候墳墓p(x)起始就可以省略了.而假如有很多個屬性呢? 這時候樸素貝葉斯的樸素的地方也就表現出來了,直接假設各個x是獨立同分布的,也就是簡單來說,扔鋼镚,扔第一個鋼镚正反面的概率都是二分之一,那么扔完了第一個鋼镚,再扔第二個鋼镚,正反面的概率還是二分之一,和第一個鋼镚到底是正是反沒有關系.那么倆鋼镚同時扔反面的概率也就是二分之一乘以二分之一等于四分之一.
對應到我們的xi上來說,也就是管你x1是什么,x2的概率與你無關,這個時候我們要求計算他們的聯合概率也就是相乘就可以了.那么這個時候我們就可以得到
拉普拉斯曾經說過:”概率論不過是對常識的數學抽象”
“拉普拉斯說的有道理”—-渥·茲基碩德
概率分布
概率分布也就是y隨x的變化規律,比如二項分布就是扔硬幣的實驗,要么為0,要么為1 ,而隨著次數的變化,其規律也是在不斷變化的.其變化方式大概是這樣的.
除此之外分布模式還有,高斯分布,其分布不僅與x有關與方差均值有關
以及多項分布,之前的小球的例子就是符合多項分布的例子,其概率是數量的直接比,
二項分布就是重復n次獨立的伯努利試驗。在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,并且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數為1時,二項分布服從0-1分布。
樸素貝葉斯的極大似然估計與概率分布
大家現在可以觀察一下,我們剛剛的貝葉斯公式,請問有沒有發現什么問題.
很顯然的問題就在于實際情況中,從x -> y的條件概率,其分布方式我們并不知道.
雖然p(y)我們可以直接得到,但是p(x|y)也就是在y的條件下,x證明分布我們并不清楚,可能x與y的關系是二項分布的,也可能是多項分布或者高斯分布的.這個時候我們就需要自己選擇一個分布方式進行計算了.
那概率分布有那些呢?二項分布,多項分布,高斯分布.我們假設此時先驗概率為多項式分布,那么此時參數 \theta_y 使用平滑過的最大似然估計法來估計,即相對頻率計數:
圖中特別的地方在于其中n個分子每個分子加了個參數a,分母也加了na,這是為了避免分子也就是n個x相乘的時候恰巧摸個x為零這種情況.因為這個時候會導致最后的結果為零,產生了誤差.
但是恰好我們需要的最后結果為最大概率,按照公式的求解方式,我們給每個x加個a,分母加個na,那么最終大小關系不變,嗯哼,所以我們就采取了這種方式來解決誤差問題.而當a等于1時,這種方式被稱為拉普拉斯平滑.
“這是我說的”-拉普拉斯
“這話不是我說的”-魯迅
至于其他的條件概率求解,則按照其他概率分布公式求得,比如高斯分布,參數 \sigma_y 和 \mu_y 使用最大似然法估計。:
亦或是二項分布:
那么問題來了,什么是極大似然估計呢???
其實極大似然估計就是按照現有觀察數據中數量最多的數據作為結果.比如高斯分布中,雖然我們不知道方差和均值到底是多少,但是我們把我們觀察到的數據當做實際需要的方差和均值來計算就好了.
比如我們扔硬幣,扔一個很特別的硬幣.正面的可能性為0.6,假如我們連扔了十次為一次實驗,一共做四次實驗,出現的實驗結果為{3,5,7,8},雖然這個時候實際的概率還是0.6 ,但是問題就在于這個0.6我們是沒有辦法觀察到的,假如上帝存在的話,那么可能上帝能做到,但是凡人有凡人的方式,我們可以使用我們的實驗結果來估計這個概率,(3+5+7+8)/(10*4) =5.75,根據極大似然估計也就是最大可能性估計,我們就認為這個5.75是實際的概率.這樣我們可以得到一個不錯的近似結果
而隨著實驗的增加 我們的近似結果自然也會越來越靠近真實的概率.
誤差分析
雖然我們之前所講的樸素貝葉斯算法已經非常的優秀,在很多領域都有著出色的表現,然而其除了機器學習基本的常見誤差以外,樸素貝葉斯本身的誤差其實還是蠻大的.首先比如第一個,連乘誤差.
我們的條件概率的分子是很多小數相乘,那么就可能會造成連乘誤差,導致溢出.那么當特征值過多時,我們就可以采用對數似然,也就是log(y) = log(p(xi|y)然后各個相乘的小數就可以變成—>log(abc) = log(a)* log(b) * log(c)這樣就沒有小數連乘的誤差問題了.
除此之外,算法本身的誤差也是很大的,比如最基本的假設,”樸素”—>也就是特征的獨立同分布,如果特征之間存在依賴關系,那么我們就可能需要其他的算法了.比如TAN,SPODE,AODE等等.
sklearn中的樸素貝葉斯分類器
sklearn文檔原話如下:
相比于其他更復雜的方法,樸素貝葉斯學習器和分類器非常快。 分類條件分布的解耦意味著可以獨立單獨地把每個特征視為一維分布來估計。這樣反過來有助于緩解維度災難帶來的問題。
另一方面,盡管樸素貝葉斯被認為是一種相當不錯的分類器,但卻不是好的估計器(estimator),所以不能太過于重視從
predict_proba 輸出的概率。
sklearn中的樸素貝葉斯分類器
sklearn中的三種樸素貝葉斯分類器分別為高斯樸素貝葉斯分類器,多項分布樸素貝葉斯分類器,以及伯努利樸素貝葉斯分類器(對應二線分布)
其使用方法如下:
from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)要注意的是其中,高斯樸素貝葉斯分類器沒有參數可以調整,但是支持導入樣本權重sample_weight函數,多項分布樸素貝葉斯分類器有一個參數先驗平滑因子a,伯努利樸素貝葉斯分類器有先驗平滑因子a與一個二值化參數binarize.
同時他們都支持增量訓練方法:partial_fit函數
參考
[1] 機器學習 周志華教授
[2] sklearn 官方文檔
總結
- 上一篇: Python中单线程、多线程与多进程的效
- 下一篇: auto-sklearn手册