tft每日頭條

 > 生活

 > python 貝葉斯實現分類

python 貝葉斯實現分類

生活 更新时间:2024-10-13 20:18:18

免責聲明:本文是通過網絡收集并結合自身學習等途徑合法獲取,僅作為學習交流使用,其版權歸出版社或者原創作者所有,并不對涉及的版權問題負責。若原創作者或者出版社認為侵權,請聯系及時聯系,我将立即删除文章,十分感謝!

注:來源劉順祥《從零開始學Python數據分析與挖掘》,版權歸原作者或出版社所有,僅供學習使用,不用于商業用途,如有侵權請留言聯系删除,感謝合作。

10.1 樸素貝葉斯理論基礎

在介紹如何使用貝葉斯概率公式計算後驗概率之前,先回顧一下概率論與數理統計中的條件概率和全概率公式:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)1

如上等式為條件概率的計算公式,表示在已知事件A的情況下事件B發生的概率,其中P(AB)表示事件A與事件B同時發生的概率。所以, 根據條件概率公式得到概率的乘法公式:P(AB)=P(A)P(B|A)=P(B)P(A|B)。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)2

如上等式為全概率公式,其中事件B1,B2,…,Bn構成了一個完備的事件組,并且每一個P(Bi)均大于0。該公式表示,對于任意的一個事件A來說,都可以表示成n個完備事件組與其乘積的和。

在具備上述的基礎知識之後,再來看看貝葉斯公式。如前文所說, 貝葉斯分類器的核心就是在已知X的情況下,計算樣本屬于某個類别的概率,故這個條件概率的計算可以表示為:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)3

其中,Ci表示樣本所屬的某個類别。假設數據集的因變量y一共包含k個不同的類别,故根據全概率公式,可以将上式中的分母表示成

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)4

;再根據概率的乘法公式,可以将上式中的分子重新改寫為P(Ci)P(X|Ci)。對于上面的條件概率公式而言,樣本最終屬于哪個類别Ci,應該将計算所得的最大概率值P(Ci|X)對應的類别作為樣本的最終分類,所以上式可以表示為:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)5

如上公式所示,對于已知的X,樸素貝葉斯分類器就是計算樣本在各分類中的最大概率值。接下來詳細拆解公式中的每一個部分,為獲得條件概率的最大值,尋找最終的影響因素。分母是一個常量,它與樣本屬于哪個類别沒有直接關系,所以計算P(Ci|X)的最大值就轉換成了計算分子的最大值,即argmax P(Ci)P(X|Ci);如果分子中的P(Ci)項未知的話,一般會假設每個類别出現的概率相等,隻需計算P(X|Ci)的最大值,然而在絕大多數情況下,P(Ci)是已知的,它以訓練數據集中類别Ci的頻率作為先驗概率, 可以表示為NCi/N。所以,現在的主要任務就是計算P(X|Ci)的值,即已知某個類别的情況下自變量X為某種值的概率。假設數據集一共包含p個自變量,則X可以表示成(x1,x2,…,xp),進而條件概率P(X|Ci)可以表示為:P(X|Ci)=P(x1,x2,…,xp|Ci)很顯然,條件聯合概率值的計算還是比較複雜的,尤其是當數據集的自變量個數非常多的時候。為了使分類器在計算過程中提高速度,提出了一個假設前提,即自變量是條件獨立的(自變量之間不存在相關 性),所以上面的計算公式可以重新改寫為:

P(X|Ci)=P(x1,x2,…,xp|Ci)=P(x1|Ci)P(x2|Ci)…P(xp|Ci)

如上式所示,将條件聯合概率轉換成各條件概率的乘積,進而可以大大降低概率值P(X|Ci)的運算時長。但問題是,在很多實際項目的數據集中,很難保證自變量之間滿足獨立的假設條件。根據這條假設,可以得到一般性的結論,即自變量之間的獨立性越強,貝葉斯分類器的效果就會越好;如果自變量之間存在相關性,就會在一定程度提高貝葉斯分類器的錯誤率,但通常情況下,貝葉斯分類器的效果不會低于決策樹。

接下來的章節将介紹如何計算P(Ci)P(x1|Ci)P(x2|Ci)…P(xp|Ci)的最大概率值,從而實現一個未知類别樣本的預測。

10.2 幾種貝葉斯模型

自變量X的數據類型可以是連續的數值型,也可以是離散的字符 型,或者是僅含有0-1兩種值的二元類型。通常會根據不同的數據類型選擇不同的貝葉斯分類器,例如高斯貝葉斯分類器、多項式貝葉斯分類器和伯努利貝葉斯分類器,下面将結合案例詳細介紹這幾種分類器的使用方法。

10.2.1 高斯貝葉斯分類器

如果數據集中的自變量X均為連續的數值型,則在計算P(X|Ci)時會假設自變量X服從高斯正态分布,所以自變量X的條件概率可以表示成:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)6

其中,xj表示第j個自變量的取值,μji為訓練數據集中自變量xj屬于類别Ci的均值,σji為訓練數據集中自變量xj屬于類别Ci的标準差。所以, 在已知均值μji和标準差σji時,就可以利用如上的公式計算自變量xj取某種值的概率。

為了使讀者理解P(xj|Ci)的計算過程,這裡虛拟一個數據集,并通過手工的方式計算某個新樣本屬于各類别的概率值。

如表10-1所示,假設某金融公司是否願意給客戶放貸會優先考慮兩個因素,分别是年齡和收入。現在根據已知的數據信息考察一位新客 戶,他的年齡為24歲,并且收入為8500元,請問該公司是否願意給客戶放貸?手工計算P(Ci|X)的步驟如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)7

表10-1 适合高斯貝葉斯的數據類型

(1) 因變量各類别頻率

P(loan=0)=5/10=0.5

P(loan=1)=5/10=0.5

(2) 均值

μAge0=21.40 μAge1=29.8

μIncome0=5900 μIncome1=10500

(3) 标準差

σAge0=2.42 σAge1=8.38

σIncome0=734.85 σIncome12576.81

(4) 單變量條件概率

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)8

(5) 貝葉斯後驗概率

P(loan=0|Age=24,Income=8500)

=P(loan=0)×P(Age=24|loan=0)×P(Income=8500|loan=0)

=0.5×0.0926×1.0384×10-6=4.8079×10-8

P(loan=1|Age=24,Income=8500)

=P(loan=1)×P(Age=24|loan=1)×P(Income=8500|loan=1)

=0.5×0.0375×1.1456×10-4=2.1479×10-6

經過上面的計算可知,當客戶的年齡為24歲,并且收入為8500時, 被預測為不放貸的概率是4.8079×10-8,放貸的概率為2.1479×10-6,所以根據argmax P(Ci)P(X|Ci)的原則,最終該金融公司決定給客戶放貸。

高斯貝葉斯分類器的計算過程還是比較簡單的,其關鍵的核心是假設數值型變量服從正态分布,如果實際數據近似服從正态分布,分類結果會更加準确。sklearn模塊提供了實現該分類器的計算功能,它就是naive_bayes子模塊中的GaussianNB類。首先介紹一下該“類”的語法和參數含義:

GaussianNB(priors=None)

priors:用于指定因變量各類别的先驗概率,默認以數據集中的類别頻率作為先驗概率。

由于該“類”僅包含一個參數,且參數的默認值是以各類别的頻率作為先驗概率,因此在調用GaussianNB類構造高斯貝葉斯分類器時,可以不傳遞任何參數值,接下來利用該分類器實現面部皮膚區分的判别。

10.2.2 高斯貝葉斯分類器的應用

面部皮膚區分數據集來自于UCI網站,該數據集含有兩個部分,一部分為人類面部皮膚數據,該部分數據是由不同種族、年齡和性别人群的圖片轉換而成的;另一部分為非人類面部皮膚數據。兩個部分的數據集一共包含245 057條樣本和4個變量,其中用于識别樣本是否為人類面部皮膚的因素是圖片中的三原色R、G、B,它們的值均落在0~255;因變量為二分類變量,表示樣本在對應的R、G、B值下是否為人類面部皮膚,其中1表示人類面部皮膚,2表示非人類面部皮膚。

通常情況下,研究人員會對樣本是否為人類面部皮膚更加感興趣, 所以需要将原始數據集中因變量為1的值設置為正例、因變量為2的值設置為負例,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)9

如上結果所示,因變量0表示負例,說明樣本為非人類面部皮膚, 一共包含194198個觀測;因變量1表示正例,說明樣本為人類面部皮膚,一共包含50 859個觀測;因變量值為0和1之間的比例為5:1。接下來将該數據集拆分為訓練集和測試集,分别用于模型的構建和模型的評 估,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)10

如上結果所示,通過構建高斯樸素貝葉斯分類器,實現測試數據集上的預測,經統計,預測為負例的一共有50 630條樣本、預測為正例的一共有10 635條樣本。為檢驗模型在測試數據集上的預測效果,需要構建混淆矩陣和繪制ROC曲線,其中混淆矩陣用于模型準确率、覆蓋率、精準率指标的計算;ROC曲線用于計算AUC值,并将AUC值與0.8相比,判斷模型的拟合效果,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)11

見圖10-1。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)12

圖10-1 混淆矩陣的可視化展現

如圖10-1所示,将混淆矩陣做了可視化處理,其中主對角線的數值表示正确預測的樣本量,剩餘的4720條樣本為錯誤預測的樣本。經過對混淆矩陣的計算,可以得到模型的整體預測準确率為92.30%;進一步可以得到每個類别的預測精準率(precision=正确預測某類别的樣本量/該類别的預測樣本個數)和覆蓋率(recall=正确預測某類别的樣本量/該類别的實際樣本個數),通過準确率、精準率和覆蓋率的對比,模型的預測效果還是非常理想的。接下來繪制ROC曲線,用于進一步驗證得到的結論,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)13

見圖10-2。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)14

圖10-2 高斯貝葉斯分類器的ROC曲線

如圖10-2所示的ROC曲線,計算得到的AUC值為0.94,超過用于評判模型好壞的阈值0.8,故可以認為構建的貝葉斯分類器是非常理想的,進而驗證了前文所得的結論。最後需要強調的是,利用高斯貝葉斯分類器對數據集進行分類時要求輸入的數據集X為連續的數值型變量。

10.2.3 多項式貝葉斯分類器

如果數據集中的自變量X均為離散型變量,就無法使用高斯貝葉斯分類器,而應該選擇多項式貝葉斯分類器。在計算概率值P(X|Ci)時,會假設自變量X的條件概率滿足多項式分布,故概率值P(X|Ci)的計算公式可以表示為:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)15

其中,xjk表示自變量xj的取值;Nik表示因變量為類别Ci時自變量xj取xjk的樣本個數;Ni表示數據集中類别Ci的樣本個數;α為平滑系數,用于防止概率值取0可能,通常将該值取為1,表示對概率值做拉普拉斯平 滑;n表示因變量的類别個數。

同樣,為了使讀者理解P(xj=xjk|Ci)的計算過程,這裡虛拟一個離散型自變量的數據集,并通過手工方式計算某個新樣本屬于各類别的概率值。

如表10-2所示,假設影響女孩是否參加相親活動的重要因素有三 個,分别是男孩的職業、受教育水平和收入狀況;如果女孩參加相親活動,則對應的Meet變量為1,否則為0。請問在給定的信息下,對于高收入的公務員,并且其學曆為碩士的男生來說,女孩是否願意參與他的相親?接下來通過手動的方式,計算女生是否與該男生見面的概率,步驟如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)16

表10-2 适合多項式貝葉斯的數據類型

(1) 因變量各類别頻率

P(Meet=0)=4/10=0.4 P(Meet=1)=6/10=0.6

(2) 單變量條件概率

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)17

(3) 貝葉斯後驗概率

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)18

經計算發現,當男生為高收入的公務員,并且受教育水平也很高 時,女生願意見面的概率約為0.0703、不願意見面的概率約為0.0056。所以根據argmaxP(Ci)P(X|Ci)的原則,最終女生會選擇參加這位男生的相親。

需要注意的是,如果在某個類别樣本中沒有出現自變量xj取某種值的觀測時,條件概率P(xj=xjk|Ci)就會為0。例如,當因變量Meet為0時, 自變量Occupation中沒有取值為公務員的樣本,所以就會導緻單變量條件概率為0,進而使得P(Ci)P(X|Ci)的概率為0。為了避免貝葉斯後驗概率為0的情況,會選擇使用平滑系數α,這就是為什麼自變量X的條件概率寫成P(xj=xjk|Ci)= 的原因。

多項式貝葉斯分類器的計算過程也同樣比較簡單,讀者如需使用Python實現該分類器的構造,可以直接導入sklearn的子模塊naive_bayes 模塊,然後調用MultinomialNB類。有關該“類”的語法和參數含義如 下:

MultinomialNB(alpha = 1.0, fit_prior = True, class_prior = N

alpha:用于指定平滑系數α的值,默認為1.0。fit_prior:bool類型參數,是否以數據集中各類别的比例作為P(Ci)的先驗概率,默認為True。

class_prior:用于人工指定各類别的先驗概率P(Ci),如果指定該參數,則參數fit_prior不再有效。

為了使讀者理解多項式貝葉斯分類器的功效,接下來将使用MultinomialNB類進行項目實戰,實戰的内容就是根據蘑菇的各項特征判斷其是否有毒。

10.2.4 多項式貝葉斯分類器的應用

蘑菇數據集來自于UCI網站,一共包含8 124條觀測和22個變量,其中因變量為type,表示蘑菇是否有毒,剩餘的自變量是關于蘑菇的形 狀、表面光滑度、顔色、生長環境等。首先将該數據集讀入Python,并預覽前5行數據,代碼如下:

# 讀取數據 mushrooms = pd.read_csv(r'C:\Users\Administrator\Desktop\mus # 數據的前5行,見表10-3 mushrooms.head()

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)19

表10-3 數據的前5行預覽

如表10-3所示,表中的所有變量均為字符型的離散值,由于Python 建模過程中必須要求自變量為數值類型,因此需要對這些變量做因子化處理,即把字符值轉換為對應的數值。接下來利用pandas模塊中的factorize函數對離散的自變量進行數值轉換,代碼如下:

# 将字符型數據做因子化處理,将其轉換為整數型數據 columns = mushrooms.columns[1:] for column in columns: mushrooms[column] = pd.factorize(mushrooms[column])[0] mushrooms.head()

見表10-4。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)20

表10-4 離散變量的數值化處理

如表10-4所示,所有的字符型變量全部轉換成了數值,而且每一列中的數值都代表了各自不同的字符值。需要注意的是,factorize函數返回的是兩個元素的元組,第一個元素為轉換成的數值,第二個元素為數值對應的字符水平,所以在類型轉換時,需要通過索引方式返回因子化的值。接着就可以使用多項式貝葉斯分類器對如上數據集進行類别的預測,為了實現模型的驗證,需要将該數據集拆分為訓練集和測試集,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)21

見圖10-3。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)22

圖10-3 淆矩陣的可視化展現

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)23

在如上的混淆矩陣圖中,橫坐标代表測試數據集中的實際類别值, 縱坐标為預測類别值,正确預測無毒的有981個樣本,正确預測有毒的有786個樣本。基于混淆矩陣的進一步運算,可以得到如上所示的兩部分結果,并從中發現,模型在測試數據集上的整體預測準确率為87%, 而且從各類别值來看,無毒蘑菇的預測覆蓋率為92%、有毒蘑菇的預測覆蓋率為82%。總體來說,模型的預測效果還是非常理想的,接下來繼續繪制ROC曲線,查看對應的AUC值的大小,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)24

見圖10-4。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)25

圖10-4 多項式貝葉斯分類器的ROC曲線

如圖10-4所示,ROC曲線下的面積為0.94,超過阈值0.8,可以認為模型的效果是可以接受的。需要注意的是,當因變量為字符型的值時, 子模塊metrics中的函數roc_curve必須傳入數值型的因變量(如代碼所 示,将字符值和數值做了映射),否則會報錯誤信息。對于離散型自變量的數據集而言,在分類問題上并非都可以使用多項式貝葉斯分類器,如果自變量在特定y值下的概率不服從多項式分布的話,分類器的預測效果就不會很理想。通常情況下,會利用多項式貝葉斯分類器作文本分類,如一份郵件是否垃圾郵件、用戶評論是否為正面等。

10.2.5 伯努利貝葉斯分類器

當數據集中的自變量X均為0-1二元值時(例如在文本挖掘中,判斷某個詞語是否出現在句子中,出現用1表示,不出現用0表示),通常會優先選擇伯努利貝葉斯分類器。利用該分類器計算概率值P(X|Ci)時,會假設自變量X的條件概率滿足伯努利分布,故概率值P(X|Ci)的計算公式可以表示為:

P(xj|Ci)=pxj (1-p) (1-xj)

其中,xj為第j個自變量,取值為0或1;p表示類别為Ci時自變量取1 的概率,該概率值可以使用經驗頻率代替,即

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)26

其中,Ni表示類别Ci的樣本個數;Nxj表示在類别為Ci時,xj變量取1 的樣本量;α為平滑系數,同樣是為了避免概率為0而設置的;n為因變量中的類别個數。

下面舉一個通俗易懂的例子,并通過手工計算的方式來說明伯努利貝葉斯分類器在文本分類中的應用。

假設對10條評論數據做分詞處理後,得到如表10-5所示的文檔詞條矩陣,矩陣中含有5個詞語和1個表示情感的結果,其中類别為0表示正面情緒,1表示負面情緒。如果一個用戶的評論中僅包含“還行”一詞, 請問該用戶的評論屬于哪種情緒?接下來通過手動的方式,計算該用戶的評論屬于正面和負面的概率,步驟如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)27

表10-5 适合伯努利貝葉斯的數據類型

(1) 因變量各類别頻率

P(類别=0)=4/10=2/5 P(類别=1)=6/10=3/5

(2) 單變量條件概率

P(x1=0|類别=0)=(1 1)/(4 2)=1/3 P(x1=0|類别=1)=(4 1)/(6 2)=5/8 P(x2=0|類别=0)=(1 1)/(4 2)=1/3 P(x2=0|類别=1)=(4 1)/(6 2)=5/8 P(x3=0|類别=0)=(4 1)/(4 2)=5/6 P(x3=0|類别=1)=(1 1)/(6 2)=1/4 P(x4=1|類别=0)=(2 1)/(4 2)=1/2

P(x4=1|類别=1)=(0 1)/(6 2)=1/8 P(x5=0|類别=0)=(4 1)/(4 2)=5/6 P(x5=0|類别=1)=(1 1)/(6 2)=1/4

(3) 貝葉斯後驗概率

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)28

如上結果所示,當用戶的評論中隻含有“還行”一詞時,計算該評論為正面情緒的概率約為0.015,評論為負面情緒的概率約為0.00073,故根據貝葉斯後驗概率最大原則将該評論預判為正面情緒。

伯努利貝葉斯分類器的計算與多項式貝葉斯分類器的計算非常相 似,在文本分類問題中,如果構造的數據集是關于詞語出現的次數,通常會選擇多項式貝葉斯分類器進行預測;如果構造的數據集是關于詞語是否會出現的0-1值,則會選擇伯努利貝葉斯分類器進行預測。當讀者需要構造伯努利貝葉斯分類器時,可以直接調用sklearn子模塊naive_bayes中的BernoulliNB類。有關該“類”的語法和參數含義如下:

BernoulliNB (alpha = 1.0, binarize=0.0, fit_prior = True, cl

alpha:用于指定平滑系數α的值,默認為1.0。

binarize:如果該參數為浮點型數值,則将以該值為界限,當自變量的值大于該值時,自變量的值将被轉換為1,否則被轉換為0;如果該參數為None時,則默認訓練數據集的自變量均為0-1 值。

fit_prior:bool類型參數,是否以數據集中各類别的比例作為P(Ci)的先驗概率,默認為True。

class_prior:用于人工指定各類别的先驗概率P(Ci),如果指定該參數,則參數fit_prior不再有效。

接下來将利用Python中的BernoulliNB類對用戶的評價數據進行分 類,分類的目的是預測用戶的評價内容所表達的情緒(積極或消極)。

10.2.6 伯努利貝葉斯分類器的應用

用戶對其購買的蚊帳進行評論,該數據集是通過爬蟲的方式獲得, 一共包含10 644條評論,數據集中的Type變量為評論所對應的情緒。首先将爬蟲獲得的數據集讀入Python中,并預覽前幾行數據,代碼如下:

# 讀入評論數據 evaluation = pd.read_excel(r'C:\Users\Administrator\Desktop\ # 查看數據前10行,見表10-6 evaluation.head(10)

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)29

表10-6 數據的前10行預覽

如表10-6所示,數據集包含4個字段,分别是用戶昵稱、評價時間、評價内容和對應的評價情緒。從評價内容來看,會有一些“髒”文本在内,如數字、英文等,所以需要将這些“髒”文本删除,代碼如下:

# 運用正則表達式,将評論中的數字和英文去除 evaluation.Content = evaluation.Content.str.replace('[0-9a-z evaluation.head()

見表10-7。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)30

表10-7 文本數據清洗後的前5行預覽

經過數據的初步清洗後,下一步要做的就是對文本進行切詞,但在切詞前,通常需要引入用戶自定義的詞庫和停止詞。利用詞典的目的是将無法正常切割的詞實現正确切割(如“沙瑞金書記”會被切詞為“沙”“瑞金”“書記”,為了避免這種情況,就需要将類似“沙瑞金”這樣的詞組合為詞庫),使用停止詞的目的是将句子中無意義的詞語删除(如“的”“啊”“我們”等)。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)31

如上結果所示,通過調入第三方包jieba實現中文的切詞,并在切詞過程中加入自定義詞庫和删除停止詞。接下來利用如上的切詞結果,構造文檔詞條矩陣,矩陣的每一行代表一個評論内容,矩陣的每一列代表切詞後的詞語,矩陣的元素為詞語在文檔中出現的頻次。代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)32

見表10-8。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)33

表10-8 切詞後構成的文檔——詞條矩陣

如表10-8所示,将文檔詞條矩陣轉換為數據框後得到一個龐大的稀疏矩陣,即數據框中的大部分值為0。為了避免數據框的列數過多,在構造文檔詞條矩陣時做了相應的限制條件,即代碼中的CountVectorizer(min_df = 0.01),表示詞語所對應的文檔數目必須在所有文檔中至少占1%的比例,最終得到表10-8中所呈現的99個變量。有了如上的數據框,接下來要做的就是将數據集拆分為訓練集和測試集,并利用訓練集構建伯努利貝葉斯分類器,利用測試集對分類器的預測效果進行評估,具體代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)34

見圖10-5。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)35

圖10-5 混淆矩陣的可視化展現

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)36

如上結果所示,從混淆矩陣圖形來看,伯努利貝葉斯分類器在預測數據集上的效果還是非常棒的,絕大多數的樣本都被預測正确(因為主對角線上的數據非常大),而且總的預測準确率接近85%;從模型的評估報告來看,預測為消極情緒的覆蓋率0.9相比于積極情緒的覆蓋率0.8 要更高一些,但總體來說模型的預測效果還是不錯的。同理,再繪制一下關于模型在測試數據集上的ROC曲線,代碼如下:

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)37

見圖10-6。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)38

圖10-6 伯努利貝葉斯分類器的ROC曲線

如圖10-6所示,繪制的ROC曲線所對應的AUC值為0.93,同樣是一個非常高的數值,再結合模型準确率、覆蓋率等指标,可以認為該模型在測試數據集上的預測效果是非常理想的。需要說明的是,如果訓練數據集是關于詞語在各文檔中出現的頻次,直接調用BernoulliNB類是沒有問題的,因為該“類”中參數binarize默認值為0,即如果詞的頻次大于0,則對應的變量值在模型運算時會轉換成1,否則轉換為0。

10.3 本章小結

本章介紹了有關三種樸素貝葉斯分類器,這三種分類器的選擇主要依賴于自變量X數據的類型。如果自變量X均為連續的數值型,則需要選擇高斯貝葉斯分類器;如果自變量X均表示為離散的數據類型,則需要選擇多項式貝葉斯分類器;如果自變量X為0-1二元值,則需要選擇伯努利貝葉斯分類器。樸素貝葉斯分類器的核心假設為自變量之間是條件獨立的,該假設的主要目的是為了提高算法的運算效率,如果實際數據集中的自變量不滿足獨立性假設時,分類器的預測結果往往會産生錯 誤。

本章的主要内容包含了三種樸素貝葉斯分類器的理論思想、運算過程和應用實戰,通過本章内容的學習,讀者可以對比三者的差異和應用場景,并從中選擇合理的是算法完成工作中的實際需求。

為了使讀者掌握有關本章内容所涉及的函數和“方法”,這裡将其重新梳理一下,以便讀者查閱和記憶。

python 貝葉斯實現分類(利用Python實現樸素貝葉斯模型)39

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved