sklearn分类器:朴素贝叶斯
樸素貝葉斯
樸素貝葉斯(Naive Bayes)是一個非常簡單,但是實用性很強的分類模型。樸素貝葉斯分類器的構造基礎是貝葉斯理論。
概率論基礎
概率定義為一件事情發生的可能性。事情發生的概率可以 通過觀測數據中的事件發生次數來計算,事件發生的概率等于改事件發生次數除以所有事件發生的總次數。舉一些例子:
- 扔出一個硬幣,結果頭像朝上
- 某天是晴天
- 某個單詞在未知文檔中出現
我們將事件的概率記作$$P\left({X}\right)$$,那么假設這一事件為X屬于樣本空間中的一個類別,那么$${0}\le{P}\left({X}\right)\le{1}$$。
聯合概率與條件概率
- 聯合概率
是指兩件事情同時發生的概率。那么我們假設樣本空間有一些天氣數據:
| 1 | 2 | 晴天 |
| 2 | 1 | 下雨 |
| 3 | 3 | 晴天 |
| 4 | 4 | 晴天 |
| 5 | 1 | 下雨 |
| 6 | 2 | 下雪 |
| 7 | 3 | 下雪 |
那么天氣被分成了三類,那么$$P\left(X=sun\right){=}\frac{3}{7}$$,假如說天氣=下雪且星期幾=2?這個概率怎么求?這個概率應該等于兩件事情為真的次數除以所有事件發生的總次數。我們可以看到只有一個樣本滿足天氣=下雪且星期幾=2,所以這個概率為$$\frac{1}{7}$$。一般對于X和Y來說,對應的聯合概率記為$$P\left({XY}\right)$$。
- 條件概率
那么條件概率形如$$P\left({X}\mid{Y}\right)$$,這種格式的。表示為在Y發生的條件下,發生X的概率。假設X代表星期,Y代表天氣,則
$$P\left({X=3}\mid{Y=sun}\right)$$如何求?
從表中我們可以得出,$$P\left({X=3,Y=sun}\right){=}\frac{1}{7}$$,$$P\left({Y}\right){=}\frac{3}{7}$$
$$P\left({X=3}\mid{Y=sun}\right){=}\frac{1}{3}{=}\frac{P\left({X=3,Y=sun}\right)}{P\left({Y}\right)}$$
在條件概率中,有一個重要的特性
- 如果每個事件之間相互獨立
那么則有$$P\left({X_1,X_2,X_3,...,X_n}\mid{Y_i}\right){=}{P}\left({X_1}\mid{Y_i}\right) {P}\left({X_2}\mid{Y_i}\right) {P}\left({X_3}\mid{Y_i}\right){...}{P}\left({X_n}\mid{Y_i}\right)$$
這個式子的意思是給定條件下,所有的X的概率為單獨的Y條件下每個X發生的概率乘積,我們通過后面再繼續去理解這個式子的具體含義。
貝葉斯公式
首先我們給出該公式的表示,$$P\left({c_i}\mid{W}\right){=}\frac{P\left({W}\mid{C_i}\right)P\left({c_i}\right)}{P\left({W}\right)}$$,其中$$c_i$$為類別,$$W$$為特征向量。
貝葉斯公式最常用于文本分類,上式左邊可以理解為給定一個文本詞向量$$W$$,那么它屬于類別$$c_i$$的概率是多少。那么式子右邊分幾部分,$$P\left({W}\mid{c_i}\right)$$理解為在給定類別的情況下,該文檔的詞向量的概率。可以通過條件概率中的重要特性來求解。
假設我們有已分類的文檔,
a = "life is short,i like python" b = "life is too long,i dislike python" c = "yes,i like python" label=[1,0,1]詞袋法的特征值計算
若使用詞袋法,且以訓練集中的文本為詞匯表,即將訓練集中的文本中出現的單詞(不重復)都統計出來作為詞典,那么記單詞的數目為n,這代表了文本的n個維度。以上三個文本在這8個特征維度上的表示為:
| a' | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
| b' | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
| c' | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
上面a',b'就是兩個文檔的詞向量的表現形式,對于貝葉斯公式,從label中我們可以得出兩個類別的概率為:
$$P\left({c_i=1}\right){=}0.5,P\left({c_i=0}\right){=}0.5$$
對于一個給定的文檔類別,每個單詞特征向量的概率是多少呢?
提供一種TF計算方法,為類別$$y_k$$每個單詞出現的次數$$N_i$$,除以文檔類別$$y_k$$中所有單詞出現次數的總數$$N$$:
$$P_i{=}\frac{N_i}{N}$$
首先求出現總數,對于1類別文檔,在a'中,就可得出總數為1+1+1+1+1+1=6,c'中,總共1+1+1+1=4,故在1類別文檔中總共有10次
每個單詞出現總數,假設是兩個列表,a'+c'就能得出每個單詞出現次數,比如$$P\left({w=python}\right){=}\frac{2}{10}{=}{0.20000000}$$,同樣可以得到其它的單詞概率。最終結果如下:
# 類別1文檔中的詞向量概率 p1 = [0.10000000,0.10000000,0.20000000,0.10000000,0,0.20000000,0,0,0.20000000,0.10000000] # 類別0文檔中的詞向量概率 p0 = [0.16666667,0.16666667,0.16666667,0,0.16666667,0,0.16666667,0.16666667,0.16666667,0]拉普拉斯平滑系數
為了避免訓練集樣本對一些特征的缺失,即某一些特征出現的次數為0,在計算$$P\left({X_1,X_2,X_3,...,X_n}\mid{Y_i}\right)$$的時候,各個概率相乘最終結果為零,這樣就會影響結果。我們需要對這個概率計算公式做一個平滑處理:
$$P_i{=}\frac{N_i+\alpha}{N+\alpha*m}$$
其中$$m$$為特征詞向量的個數,$$\alpha$$為平滑系數,當$$\alpha{=}1$$,稱為拉普拉斯平滑
sklearn.naive_bayes.MultinomialNB
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)""":param alpha:float,optional(default = 1.0)加法(拉普拉斯/ Lidstone)平滑參數(0為無平滑)"""互聯網新聞分類
讀取20類新聞文本的數據細節
from sklearn.datasets import fetch_20newsgroupsnews = fetch_20newsgroups(subset='all')print news.data[0]上述代碼得出該數據共有18846條新聞,但是這些文本數據既沒有被設定特征,也沒有數字化的亮度。因此,在交給樸素貝葉斯分類器學習之前,要對數據做進一步的處理。
20類新聞文本數據分割
from sklearn.cross_validation import train_test_splitX_train,X_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=42)文本轉換為特征向量進行TF特征抽取
from sklearn.feature_extraction.text import CountVectorizervec = CountVectorizer() # 訓練數據輸入,并轉換為特征向量 X_train = vec.fit_transform(X_train) # 測試數據轉換 X_test = vec.transform(X_test)樸素貝葉斯分類器對文本數據進行類別預測
from sklearn.naive_bayes import MultinomialNB# 使用平滑處理初始化的樸素貝葉斯模型 mnb = MultinomialNB(alpha=1.0)# 利用訓練數據對模型參數進行估計 mnb.fit(X_train,y_train)# 對測試驗本進行類別預測。結果存儲在變量y_predict中 y_predict = mnb.predict(X_test)性能測試
- 特點分析
樸素貝葉斯模型被廣泛應用于海量互聯網文本分類任務。由于其較強的特征條件獨立假設,使得模型預測所需要估計的參數規模從冪指數量級想線性量級減少,極大的節約了內存消耗和計算時間。到那時,也正是受這種強假設的限制,模型訓練時無法將各個特征之間的聯系考量在內,使得該模型在其他數據特征關聯性較強的分類任務上的性能表現不佳
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的sklearn分类器:朴素贝叶斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中常见的15中面试题
- 下一篇: Scikit-learn的分类器算法:k