一、樸素貝葉斯算法的介紹
1.什么是樸素貝葉斯算法?
樸素貝葉斯算法(Naive Bayes Algorithm)是一種基于貝葉斯定理和特征獨(dú)立性假設(shè)的概率分類算法。它被廣泛應(yīng)用于文本分類、垃圾郵件過濾、情感分析等任務(wù)。
樸素貝葉斯算法的基本思想是基于訓(xùn)練數(shù)據(jù)中的特征和標(biāo)簽之間的概率關(guān)系,通過計(jì)算后驗(yàn)概率來進(jìn)行分類預(yù)測(cè)。
2.樸素貝葉斯算法的應(yīng)用場(chǎng)景
樸素貝葉斯算法在許多應(yīng)用場(chǎng)景中都有廣泛的應(yīng)用,特別適合以下情況:
-
文本分類:樸素貝葉斯算法在文本分類任務(wù)中表現(xiàn)出色,例如垃圾郵件過濾、情感分析、新聞分類等。它可以根據(jù)文本中出現(xiàn)的詞語頻率或TF-IDF值進(jìn)行分類。
-
多類別分類:樸素貝葉斯算法適用于多類別分類問題,可以處理多個(gè)離散類別或標(biāo)簽。
-
實(shí)時(shí)分類:樸素貝葉斯算法具有快速的訓(xùn)練和預(yù)測(cè)速度,適合實(shí)時(shí)分類任務(wù),如實(shí)時(shí)推薦系統(tǒng)、實(shí)時(shí)廣告點(diǎn)擊率預(yù)測(cè)等。
-
高維數(shù)據(jù):樸素貝葉斯算法在高維數(shù)據(jù)集上表現(xiàn)良好,對(duì)于特征維度較大的問題,它的計(jì)算復(fù)雜度較低,能夠高效地進(jìn)行分類。
-
弱相關(guān)特征:樸素貝葉斯算法的特征獨(dú)立性假設(shè)使得它對(duì)于特征之間的相關(guān)性較弱的問題表現(xiàn)良好,當(dāng)特征之間的相關(guān)性較弱或可以近似為獨(dú)立時(shí),樸素貝葉斯算法能夠提供較好的分類效果。
-
數(shù)據(jù)稀疏性:樸素貝葉斯算法對(duì)于數(shù)據(jù)的稀疏性具有較好的魯棒性,在訓(xùn)練數(shù)據(jù)中存在大量缺失值或零值的情況下仍能有效工作。
3.貝葉斯公式和樸素貝葉斯公式
-
貝葉斯公式:
貝葉斯公式(Bayes’ theorem)是概率論中的一個(gè)重要公式,用于計(jì)算在給定一些觀察到的證據(jù)的情況下,某個(gè)事件的后驗(yàn)概率。貝葉斯公式如下:
P ( A ∣ B ) = ( P ( B ∣ A ) ? P ( A ) ) / P ( B ) P(A|B) = (P(B|A) * P(A)) / P(B) P(A∣B)=(P(B∣A)?P(A))/P(B)
其中,P(A|B) 表示在觀察到事件 B 發(fā)生的情況下,事件 A 發(fā)生的概率;P(B|A) 表示在事件 A 發(fā)生的情況下,事件 B 發(fā)生的概率;P(A) 表示事件 A 發(fā)生的先驗(yàn)概率;P(B) 表示事件 B 發(fā)生的先驗(yàn)概率。 -
樸素貝葉斯公式:
樸素貝葉斯公式是在貝葉斯公式的基礎(chǔ)上,引入了"樸素"假設(shè),假設(shè)特征之間相互獨(dú)立。根據(jù)樸素貝葉斯公式,可以計(jì)算在給定一組特征的條件下,某個(gè)類別的后驗(yàn)概率。樸素貝葉斯公式如下:
P ( y ∣ x 1 , x 2 , . . . , x n ) = ( P ( x 1 ∣ y ) ? P ( x 2 ∣ y ) ? . . . ? P ( x n ∣ y ) ? P ( y ) ) / P ( x 1 , x 2 , . . . , x n ) P(y|x1, x2, ..., xn) = (P(x1|y) * P(x2|y) * ... * P(xn|y) * P(y)) / P(x1, x2, ..., xn) P(y∣x1,x2,...,xn)=(P(x1∣y)?P(x2∣y)?...?P(xn∣y)?P(y))/P(x1,x2,...,xn)
其中,P(y|x1, x2, …, xn) 表示在給定特征 x1, x2, …, xn 的條件下,類別 y 的后驗(yàn)概率;P(x1|y), P(x2|y), …, P(xn|y) 表示在類別 y 的條件下,特征 x1, x2, …, xn 出現(xiàn)的概率;P(y) 表示類別 y 的先驗(yàn)概率;P(x1, x2, …, xn) 表示特征 x1, x2, …, xn 的聯(lián)合概率。
4.樸素貝葉斯算法的計(jì)算步驟
- 數(shù)據(jù)預(yù)處理:首先對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理,包括特征選擇、特征縮放、處理缺失值等操作。
- 計(jì)算類別的先驗(yàn)概率:根據(jù)訓(xùn)練數(shù)據(jù),計(jì)算每個(gè)類別出現(xiàn)的先驗(yàn)概率。先驗(yàn)概率可以通過簡(jiǎn)單地計(jì)算每個(gè)類別在訓(xùn)練數(shù)據(jù)中的樣本數(shù)量與總樣本數(shù)量的比例得到。
- 計(jì)算特征的條件概率:對(duì)于每個(gè)特征,計(jì)算在給定類別下的條件概率。這需要計(jì)算每個(gè)特征在每個(gè)類別下的頻率或概率。
- 應(yīng)用貝葉斯定理:根據(jù)貝葉斯定理,利用先驗(yàn)概率和條件概率計(jì)算后驗(yàn)概率,即在給定特征條件下每個(gè)類別的概率。
- 預(yù)測(cè)分類結(jié)果:對(duì)于新的未知樣本,根據(jù)計(jì)算得到的后驗(yàn)概率,選擇具有最高概率的類別作為預(yù)測(cè)結(jié)果。
樸素貝葉斯算法中的"樸素"指的是特征之間的獨(dú)立性假設(shè),即假設(shè)每個(gè)特征在給定類別下是相互獨(dú)立的。這個(gè)假設(shè)簡(jiǎn)化了計(jì)算過程,但在實(shí)際應(yīng)用中可能與實(shí)際情況不符。
以上是樸素貝葉斯算法的一般計(jì)算步驟,具體實(shí)現(xiàn)時(shí)可能還會(huì)包括平滑處理、處理連續(xù)特征、處理離散特征等額外的步驟,以適應(yīng)具體的問題和數(shù)據(jù)。
5.樸素貝葉斯算法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 算法簡(jiǎn)單高效:樸素貝葉斯算法的計(jì)算速度較快,適用于處理大規(guī)模數(shù)據(jù)集。
- 對(duì)小規(guī)模數(shù)據(jù)表現(xiàn)良好:即使在小樣本情況下,樸素貝葉斯算法仍然能夠提供合理的分類結(jié)果。
- 可解釋性強(qiáng):樸素貝葉斯算法基于簡(jiǎn)單的概率模型,分類過程可解釋性強(qiáng),能夠提供關(guān)于特征對(duì)分類結(jié)果的影響程度的信息。
- 處理多類別問題:樸素貝葉斯算法能夠處理多類別分類問題,且在類別數(shù)量較多的情況下也能保持較好的性能。
- 對(duì)缺失數(shù)據(jù)魯棒性強(qiáng):樸素貝葉斯算法對(duì)于缺失數(shù)據(jù)具有較好的魯棒性,在訓(xùn)練數(shù)據(jù)中存在缺失值或零值的情況下仍能有效工作。
缺點(diǎn):
- 特征獨(dú)立性假設(shè)限制:樸素貝葉斯算法假設(shè)各個(gè)特征之間相互獨(dú)立,但在實(shí)際應(yīng)用中,很多特征之間存在相關(guān)性,這種假設(shè)可能不符合實(shí)際情況,導(dǎo)致分類性能下降。
- 對(duì)輸入數(shù)據(jù)的分布假設(shè):樸素貝葉斯算法通常假設(shè)輸入數(shù)據(jù)符合特定的分布,如高斯分布,如果數(shù)據(jù)的分布與該假設(shè)不符,則可能導(dǎo)致分類結(jié)果不準(zhǔn)確。
- 對(duì)數(shù)量較大的特征空間表現(xiàn)不佳:當(dāng)特征空間較大時(shí),樸素貝葉斯算法需要估計(jì)大量的參數(shù),可能會(huì)導(dǎo)致參數(shù)估計(jì)不準(zhǔn)確,影響分類結(jié)果。
- 類別之間的類別概率估計(jì)不準(zhǔn)確:當(dāng)某個(gè)類別在訓(xùn)練集中沒有樣本出現(xiàn)時(shí),樸素貝葉斯算法會(huì)給出概率為零的預(yù)測(cè)結(jié)果,這可能導(dǎo)致誤分類。
6.樸素貝葉斯算法和邏輯回歸算法的區(qū)別
樸素貝葉斯算法和邏輯回歸算法是兩種常見的分類算法,它們?cè)谝恍┓矫嬗幸恍﹨^(qū)別:
- 假設(shè)不同:樸素貝葉斯算法基于樸素貝葉斯公式,假設(shè)特征之間相互獨(dú)立,而邏輯回歸算法沒有明確的假設(shè)。邏輯回歸通過學(xué)習(xí)權(quán)重參數(shù)來建立特征與目標(biāo)變量之間的關(guān)系。
- 模型類型:樸素貝葉斯算法是生成模型,它通過學(xué)習(xí)類別的先驗(yàn)概率和特征的條件概率來建模,從而得到每個(gè)類別的后驗(yàn)概率。邏輯回歸算法是判別模型,它直接建立特征與目標(biāo)變量之間的條件概率,通過將輸入特征映射到一個(gè)概率空間進(jìn)行分類。
- 數(shù)據(jù)假設(shè):樸素貝葉斯算法假設(shè)特征之間相互獨(dú)立,這在處理文本分類等問題時(shí)可能不符合實(shí)際情況。邏輯回歸算法沒有這個(gè)假設(shè),可以更靈活地處理特征之間的相關(guān)性。
- 參數(shù)估計(jì):樸素貝葉斯算法通過計(jì)算先驗(yàn)概率和條件概率來估計(jì)模型參數(shù),可以直接使用最大似然估計(jì)或貝葉斯估計(jì)等方法。邏輯回歸算法通過最大似然估計(jì)或梯度下降等方法來估計(jì)模型參數(shù)。
- 處理連續(xù)特征:樸素貝葉斯算法可以處理連續(xù)特征,常用的方法有高斯樸素貝葉斯、多項(xiàng)式樸素貝葉斯等。邏輯回歸算法也可以處理連續(xù)特征,但需要進(jìn)行適當(dāng)?shù)奶卣骺s放或轉(zhuǎn)換。
總體而言,樸素貝葉斯算法在處理大規(guī)模文本分類等問題時(shí)具有較好的效果,而邏輯回歸算法更適用于建模特征與目標(biāo)變量之間的直接關(guān)系,并且對(duì)特征相關(guān)性的建模更加靈活。
二、樸素貝葉斯的計(jì)算案例
1.案例一
聯(lián)合概率、條件概率與相互獨(dú)立
- 聯(lián)合概率:包含多個(gè)條件,且所有條件同時(shí)成立的概率
- 記作:P(A,B)
- 條件概率(用貝葉斯公式計(jì)算):就是事件A在另外一個(gè)事件B已經(jīng)發(fā)生條件下的發(fā)生概率
- 記作:P(A|B)
- 相互獨(dú)立:如果P(A,B) = P(A)*P(B),則稱事件A與事件B相互獨(dú)立
先計(jì)算幾個(gè)簡(jiǎn)單的概率:
-
女神喜歡的概率:
P(喜歡)=4/7
-
職業(yè)是程序員并且體型勻稱的概率
P(程序員,勻稱) = 1/7
-
在女神喜歡的條件下,職業(yè)是程序員的概率
P(程序員|喜歡) = 2/4 = 1/2
-
在女神喜歡的條件下,職業(yè)是程序員、體重超重的概率
P((程序員,超重)|喜歡) = 1/4
下面計(jì)算:在小明是產(chǎn)品經(jīng)理并且體重超重的情況下,如何計(jì)算小明被女神喜歡的概率?
-
貝葉斯公式計(jì)算:
P(喜歡|(產(chǎn)品,超重)) = {P((產(chǎn)品,超重)|喜歡) * P(喜歡)}/P(產(chǎn)品,超重)
上式中,
- P((產(chǎn)品,超重)|喜歡) 和P(產(chǎn)品,超重) 都是0,導(dǎo)致無法計(jì)算結(jié)果。這是因?yàn)闃颖玖刻倭?,不具有代表性?/li>
- 但在現(xiàn)實(shí)中,肯定存在職業(yè)是產(chǎn)品經(jīng)理并且體重超重的人,所以P(產(chǎn)品,超重)不可能為0。
-
這時(shí)候,就需要引入樸素貝葉斯公式來進(jìn)行計(jì)算
-
樸素貝葉斯,就是假定特征與特征之間相互獨(dú)立,即職業(yè)與體型兩個(gè)特征相互獨(dú)立。
-
則按照樸素貝葉斯公式計(jì)算如下:
則P(產(chǎn)品,超重) = P(產(chǎn)品) * P(超重) = (2/7) * (3/7) = 6/49 P((產(chǎn)品,超重)|喜歡) = P(產(chǎn)品|喜歡) * P(超重|喜歡) = (1/2) * (1/4) = 1/8 P(喜歡|(產(chǎn)品,超重)) = {P((產(chǎn)品,超重)|喜歡) * P(喜歡)}/P(產(chǎn)品,超重) = {(1/8) * (4/7)}/(6/49) = 7/12
-
由上述樸素貝葉斯公式計(jì)算可得,在小明是產(chǎn)品經(jīng)理并且體重超重的情況下,小明被女神喜歡的概率為7/12。
2.案例二(文本分類計(jì)算)
通過前四個(gè)訓(xùn)練樣本,判斷第五個(gè)樣本,屬于China類的概率
-
計(jì)算過程
P ( Y e s ∣ ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) ) = [ P ( ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) ∣ Y e s ) ? P ( Y e s ) ] / P ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) = [ P ( C h i n e s e ∣ Y e s ) 3 ? P ( T o k y o ∣ Y e s ) ? P ( J a p a n ∣ Y e s ) ] ? P ( Y e s ) / [ P ( C h i n e s e ) 3 ? P ( T o k y o ) ? P ( J a p a n ) ] P(Yes|(Chinese,Chinese,Chinese,Tokyo,Japan)) = [P((Chinese,Chinese,Chinese,Tokyo,Japan)|Yes) * P(Yes)]/P(Chinese,Chinese,Chinese,Tokyo,Japan) = [P(Chinese|Yes)^3*P(Tokyo|Yes)*P(Japan|Yes)]*P(Yes)/[P(Chinese)^3*P(Tokyo)*P(Japan)] P(Yes∣(Chinese,Chinese,Chinese,Tokyo,Japan))=[P((Chinese,Chinese,Chinese,Tokyo,Japan)∣Yes)?P(Yes)]/P(Chinese,Chinese,Chinese,Tokyo,Japan)=[P(Chinese∣Yes)3?P(Tokyo∣Yes)?P(Japan∣Yes)]?P(Yes)/[P(Chinese)3?P(Tokyo)?P(Japan)]
而# 屬于China類總共有8個(gè)詞,其中Chinese占5個(gè) P(Chinese|Yes)=5/8 # 屬于China類總共有8個(gè)詞,其中Tokyo占0個(gè) P(Tokyo|Yes)=0/8 # 屬于China類總共有8個(gè)詞,其中Japan占0個(gè) P(Japan|Yes)=0/8
從上面例子可以得到 P(Tokyo|Yes) 和 P(Japan|Yes) 都為0,這是不合理的,如果詞頻列表中有很多出現(xiàn)次數(shù)都是0,很可能計(jì)算結(jié)果都為0。
-
解決方法:引入拉普拉斯平滑系數(shù)
-
拉普拉斯公式:
P ( x ) = ( c o u n t ( x ) + λ ) / ( N + λ ? V ) P(x) = (count(x) + λ) / (N + λ * V) P(x)=(count(x)+λ)/(N+λ?V)
其中:- count(x) 是事件x出現(xiàn)的次數(shù)(觀察到的頻數(shù));
- N 是總的事件數(shù)(總的樣本數(shù)或觀察數(shù));
- V 是事件的可能取值的總數(shù)(唯一的事件數(shù)量);
- λ 是拉普拉斯平滑系數(shù),一般取1。
-
經(jīng)過平滑處理后的值:文章來源:http://www.zghlxwxcb.cn/news/detail-467707.html
# 這里count(x)=5,N=8,λ=1。V指的是"文檔中的詞"這一特征總共有幾種值(6種值:Chinese、Beijing、Shanghai、Macao、Tokyo、Japan) # 則經(jīng)過平滑處理后的值如下 P(Chinese|Yes)=5/8=(5+1)/(8+6)=6/14=3/7 P(Tokyo|Yes)=0/8=(0+1)/(8+6)=1/14 P(Japan|Yes)=0/8=(0+1)/(8+6)=1/14 # 然后再代入公式計(jì)算最終結(jié)果即可
-
三、樸素貝葉斯的代碼實(shí)現(xiàn)案例
1.API介紹
- sklearn.naive_bayes.MultinomialNB(alpha=1.0)
- 樸素貝葉斯分類算法
- alpha:拉普拉斯平滑系數(shù)
2.案例:商品評(píng)論分析
文章來源地址http://www.zghlxwxcb.cn/news/detail-467707.html
2.1步驟分析
- 獲取數(shù)據(jù)
- 數(shù)據(jù)基本處理
- 取出內(nèi)容列,對(duì)數(shù)據(jù)進(jìn)行分析
- 判定評(píng)判標(biāo)準(zhǔn)
- 選擇停用詞
- 把內(nèi)容處理,轉(zhuǎn)換成標(biāo)準(zhǔn)格式
- 統(tǒng)計(jì)詞的個(gè)數(shù)
- 準(zhǔn)備訓(xùn)練集和測(cè)試集
- 模型訓(xùn)練
- 模型評(píng)估
2.2代碼實(shí)現(xiàn)
import pandas as pd
import numpy as np
import jieba
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# 1.獲取數(shù)據(jù)
data = pd.read_csv("./data/書籍評(píng)價(jià).csv",encoding="gbk")
# 2.數(shù)據(jù)基本處理
# 2.1 取出內(nèi)容列,對(duì)數(shù)據(jù)進(jìn)行分析
content = data["內(nèi)容"]
# 2.2 判定評(píng)判標(biāo)準(zhǔn)
data.loc[:,"評(píng)價(jià)"]
# 添加一列“評(píng)價(jià)標(biāo)號(hào)”,值為1代表這一評(píng)論是好評(píng)
data.loc[data.loc[:,"評(píng)價(jià)"]=="好評(píng)","評(píng)價(jià)標(biāo)號(hào)"]=1
# 添加一列“評(píng)價(jià)標(biāo)號(hào)”,值為0代表這一評(píng)論是差評(píng)
data.loc[data.loc[:,"評(píng)價(jià)"]=="差評(píng)","評(píng)價(jià)標(biāo)號(hào)"]=0
# 2.3 選擇停用詞
stopwords=[]
with open("./data/stopwords.txt",mode="r",encoding="utf-8") as f:
lines = f.readlines()
for tmp in lines:
line = tmp.strip()
stopwords.append(line)
# 對(duì)停用詞進(jìn)行去重
stopwords = list(set(stopwords))
# 2.4 把內(nèi)容處理,轉(zhuǎn)換成標(biāo)準(zhǔn)格式
comment_list = []
for tmp in content:
# 把一句句話分割成一個(gè)個(gè)詞:需要用jieba
seg_list = jieba.cut(tmp,cut_all=False)
seg_str = ",".join(seg_list)
comment_list.append(seg_str)
# 2.5 統(tǒng)計(jì)詞的個(gè)數(shù)
con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(comment_list)
# 2.6 準(zhǔn)備訓(xùn)練集和測(cè)試集
# 取前十行作為訓(xùn)練集
x_train = X.toarray()[:10,:]
y_train = data["評(píng)價(jià)"][:10]
# 取第十行以后的作為訓(xùn)練集
x_test = X.toarray()[10:,:]
y_test = data["評(píng)價(jià)"][10:]
# 3.模型訓(xùn)練,樸素貝葉斯算法,拉普拉斯系數(shù)為1
estimator = MultinomialNB(alpha=1)
estimator.fit(x_train,y_train)
y_pre = estimator.predict(x_test)
print("預(yù)測(cè)值為:\n",y_pre)
print("真實(shí)值為:\n",y_test)
# 4.模型評(píng)估
estimator.score(x_test,y_test)
到了這里,關(guān)于樸素貝葉斯算法的介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!