樸素貝葉斯算法——以20Newsgroups數據集為例

2021-02-19 Stata and Python數據分析

本文作者:陳   鼎 中南財經政法大學統計與數學學院

文字編輯:任   哲

技術總編:張馨月

  爬蟲俱樂部於2020年暑期在線上舉辦的Stata與Python編程技術訓練營和Stata數據分析法律與制度專題訓練營在不久前已經圓滿結束啦~應廣大學員需求,我們的課程現已在騰訊課堂全面上線,且繼續提供答疑服務。現在關注公眾號並在朋友圈轉發推文《來騰訊課堂學Stata和Python啦》或《8月Stata數據分析法律與制度專場來啦!》,即可獲得600元課程優惠券,集贊50個再領200元課程優惠券!(截圖發至本公眾號後臺領取)原價2400元的課程,現在只要1600元!   

樸素貝葉斯分類器是由英國數學家託馬斯·貝葉斯提出的。該模型使用概率統計的知識對樣本數據集進行分類,通過計算條件概率進行最終決策。樸素貝葉斯分類器的基本思想是,若在給定條件下,預測的某個樣本屬於某個類別的條件概率最大,則將該樣本判定為該類別。樸素貝葉斯分類器在數據集較大的情況下表現出較高的準確率,同時算法本身也較為簡單。在之前的推文《基於貝葉斯定理的算法——樸素貝葉斯分類》中,我們對該算法進行過簡單了解。今天,本文基於20Newsgroups數據集,利用樸素貝葉斯算法,對20Newsgroups數據集進行文本分類,並對其分類結果進行簡要闡述。

一、算法簡介(一)樸素貝葉斯模型

設有樣本數據集D = {d1,d2,d3,,dn},對應樣本數據的特徵屬性為X = {x1,x2,x3,,xn1},類變量為Y = {y1,y2,y3,,yn2}(即我們所預測的分類結果可以是第ym類(m=1,2,3,...,n2))。樣本數據的特徵屬性之間相互獨立,由貝葉斯公式可知,在給定特徵值(x1,x2,x3,....,xn1)的條件下,我們預測的樣本屬於第ym類(m=1,2,3,...,n2)的條件概率為: 分析上述公式,容易得出,在給定一個樣本的狀態下,P(x1,x2,x3,....,xn1)的概率值是固定不變的,與類變量無關。因此,要想比較在某個給定樣本下該樣本屬於不同類別的後驗概率,僅需比較P(x1,x2,x3,...,xn1|ym)P(ym)部分即可。因此,我們有如下判別公式: 在樸素貝葉斯模型中,不同的特徵屬性相互獨立,因此,上述公式等價於: 需注意,如果某個屬性值在訓練集中沒有與某個類別同時出現過,以上述判別公式計算後驗概率時,將出現概率為0的問題。為了避免其他屬性攜帶的信息被訓練集的不充分所抹去,常用拉普拉斯平滑給予修正。 α的係數一般為1,Ni為在ym類別中xi特徵出現的次數,N為在ym類別下所有特徵出現的次數和,m為訓練樣本中統計的特徵個數。顯然,拉普拉斯修正避免了因為訓練集樣本的不充分導致的概率估計值為0的問題。(二)20Newsgroups數據集與文本分類

20Newsgroups數據集收錄了共18000篇新聞文章(D={d1,d2,....,d18000}),涉及20種新聞分類(Y={y1,y2,y3,..,y20})。該數據集常用於文本分類,即在給定的一篇文章中,統計文章中出現的重點詞頻數,根據重點詞的頻數分布判定文章所屬的類別。數據集中的新聞文本內容及新聞分類如圖所示: 圖2.數據集的新聞分類(即y1,y2,...,y20)二、代碼實現(一)導入數據集

from sklearn.datasets import fetch_20newsgroups #導入模塊
news_data = fetch_20newsgroups(subset="all") #讀取數據

(二)劃分訓練集,測試集

將導入的20Newsgroups數據集劃分為訓練集與測試集,利用訓練集訓練模型,用測試集測試模型的預測結果與預測精度。通常使用sklearn.model_selection模塊中的train_test_split方法對數據集進行劃分,實現過程如下:

from sklearn.model_selection import train_test_split #導入模塊
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)

變量
含義
用於設定測試集佔數據集的樣本比例,test_size=0.25表示測試集佔總數據集比例的25%(三)數據的預處理——特徵工程

特徵工程,是將原始數據轉化為特徵的過程。這些特徵可以更好地向預測模型描述潛在問題,從而提高模型對未見數據的準確性。特徵工程直接影響著模型的預測結果。在本案例中,我們需要將新聞文本數據進行特徵工程處理,即將新聞文本進行分詞,統計每個詞的出現頻數,將具有代表性的詞彙與文本分類結果對應。 常用於文本分類的特徵工程為Tfidf(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)。它是一種常見的加權統計方法,用於評估每個詞彙對每篇文章的重要程度。其基本思想為:如果某個詞在某一篇文章中出現的頻率較高,而在其他文章中很少出現,則認為這個詞具有很好的類別區分能力。我們導入sklearn.feature_extraction.text中的TfidfVectorizer方法,即可對新聞文本數據進行重點詞抽取。

from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer() #實例化
x_train = tf.fit_transform(x_train) #將訓練集中的新聞文本數據進行特徵抽取,返回一個sparse矩陣
x_test = tf.transform(x_test) #將測試集中的新聞文本數據進行特徵抽取,返回一個sparse矩陣

(四)使用樸素貝葉斯分類器進行分類

from sklearn.naive_bayes import MultinomialNB

實例化一個樸素貝葉斯分類器,並將我們的訓練集特徵與訓練集特徵對應的分類結果導入到模型中,供分類器學習。

bayes = MultinomialNB(alpha=1.0) #alpha為拉普拉斯修正的α
bayes.fit(x_train,y_train)

y_predict = bayes.predict(x_test)
print("測試集的預測結果為:",y_predict)
print("模型的預測準確率為:",bayes.score(x_test,y_test))

分析上述預測結果與預測精度可以看出,測試集中的第一篇文章被分類為第11類,第二篇文章被分類為第17類……,模型預測的準確率為84.65%,屬於相對可以接受的範圍。 到這裡,我們就完成了樸素貝葉斯算法的基本實現。最後,我們來簡單總結一下它的優缺點。(1)樸素貝葉斯發源於古典概率統計理論,很好地利用了先驗信息,具有相對穩定的分類效率;(2)對缺失值數據不太敏感,算法較為簡單,具有一定的魯棒性;(1)依賴於利用訓練集來計算先驗概率,如果訓練集的表現不佳,則對模型的預測結果也會有一定影響;(2)樸素貝葉斯分類器假設每個特徵之間是相互獨立的,但是在文本分類中,不同詞之間的出現頻率往往不是互相獨立的;(3)樸素貝葉斯分類器沒有超參數供我們進行調參,模型相對較難優化。三、源碼

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_20newsgroups

def naive_bayes():
#1.讀取數據
news_data = fetch_20newsgroups(subset="all")
#2.劃分訓練集,測試集
x_train,x_test,y_train,y_test = train_test_split(news_data.data,news_data.target,test_size=0.25)
#3.進行特徵抽取
tf = TfidfVectorizer()
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)
#4.進行樸素貝葉斯算法分類
bayes = MultinomialNB(alpha=1.0)
bayes.fit(x_train,y_train)
y_predict = bayes.predict(x_test)
print("測試集的預測結果為:",y_predict)
print("模型的預測準確率為:",bayes.score(x_test,y_test))

if __name__ == '__main__':
naive_bayes()

對我們的推文累計打賞超過1000元,我們即可給您開具發票,發票類別為「諮詢費」。用心做事,不負您的支持!

一位大學黨委書記的自我結束——風波裡的學者本真

Seminar | CEO的哪些特徵和能力更重要?

Python中的這些運算符你真的會用嗎?

微信公眾號「Stata and Python數據分析」分享實用的stata、python等軟體的數據處理知識,歡迎轉載、打賞。我們是由李春濤教授領導下的研究生及本科生組成的大數據處理和分析團隊。

此外,歡迎大家踴躍投稿,介紹一些關於stata和python的數據處理和分析技巧。投稿郵箱:statatraining@163.com投稿要求:
1)必須原創,禁止抄襲;
2)必須準確,詳細,有例子,有截圖;
注意事項:
1)所有投稿都會經過本公眾號運營團隊成員的審核,審核通過才可錄用,一經錄用,會在該推文裡為作者署名,並有賞金分成。
2)郵件請註明投稿,郵件名稱為「投稿+推文名稱」。
3)應廣大讀者要求,現開通有償問答服務,如果大家遇到有關數據處理、分析等問題,可以在公眾號中提出,只需支付少量賞金,我們會在後期的推文裡給予解答。

相關焦點

  • 樸素貝葉斯算法及應用案例
    作者:陳千鶴 來源:人工智慧學習圈本篇主要介紹樸素貝葉斯算法及應用案例。以Tatinic數據集為例進行應用,同時介紹數據處理,數據集的劃分,算法效果評估等內容。一、簡介樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法 。和決策樹模型相比,樸素貝葉斯分類器(Naive Bayes Classifier 或 NBC)發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。
  • 基於貝葉斯定理的算法——樸素貝葉斯分類
    ,這兩種算法在數據量較大時複雜度很高,一般只用在數據量較小的情況下,這樣數據可以放入內存中運行。不過今天我們介紹的樸素貝葉斯分類器通過獨立假設簡化了概率的計算,節省了內存,可以很好地用於數據量大的情況。下面我們首先來了解這一算法的數理背景——貝葉斯定理。這一算法是由我們在概率論中學到的貝葉斯定理延伸出來的。我們知道貝葉斯公式為:其中,
  • 樸素貝葉斯算法的案例實現
    一、樸素貝葉斯分類的R函數介紹1、樸素貝葉斯分類算法的實現函數R中的e1071包中的naiveBayes函數可以實現樸素貝葉斯算法,具體的函數格式如下:naiveBayes(x, y,laplace=0)常用變量具體的參數解釋如下:
  • 【機器學習】樸素貝葉斯算法(Naive Bayes,NB)
    樸素貝葉斯是貝葉斯分類算法中的一種,是對貝葉斯的一個改進。樸素貝葉斯與貝葉斯顯著的不同之處在於,樸素貝葉斯進行了獨立性假設,假設各個特徵之間相互獨立不相關。)plt.hist(X[:,2], bins=20)
  • 聚類算法簡析(一):樸素貝葉斯算法的場景案例
    本文作者通過一些場景案例,帶領大家了解一下樸素貝葉斯算法作為聚類算法中的一員,如何來區分各類數組。通過一組參數模型來區分互斥群組中的個體十分常見,我們可以使用樸素貝葉斯分析來應用於這種場景,取決於模型的相似矩陣算法常常運用在估算決策論框架的矩陣中。
  • 乾貨|非常通俗的樸素貝葉斯算法(Naive Bayes)
    本文介紹樸素貝葉斯分類器(Naive Bayes classifier),它是一種簡單有效的常用分類算法。讓我從一個例子開始講起,你會看到貝葉斯分類器很好懂,一點都不難。某個醫院早上收了六個門診病人,如下表截圖。現在又來了第七個病人,是一個打噴嚏的建築工人。請問他患上感冒的概率有多大?
  • 機器學習算法實踐-樸素貝葉斯(Naive Bayes)
    熟悉數值算法(最優化方法,蒙特卡洛算法等)與並行化算法(MPI,OpenMP等多線程以及多進程並行化)以及python優化方法,經常使用C++給python寫擴展。正文與決策樹分類和k近鄰分類算法不同,貝葉斯分類主要藉助概率論的知識來通過比較提供的數據屬於每個類型的條件概率, 將他們分別計算出來然後預測具有最大條件概率的那個類別是最後的類別。
  • 樸素貝葉斯分類算法原理與實踐
    (點擊上方公眾號,可快速關注)來源: CodeMealscnblogs.com/fengfenggirl/p/classification_evaluate.html如有好文章投稿,請點擊 → 這裡了解詳情今天介紹一下樸素貝葉斯分類算法
  • scikit-learn—樸素貝葉斯
    多項式(Multinomial)樸素貝葉斯MultinomialNB實現了服從多項式分布數據的樸素Bayes算法,是文本分類中使用的兩個經典樸素Bayes變體之一(數據通常表示為詞向量,儘管tf-idf向量在實踐中也很有效)。對於每個類y,分布由向量
  • 樸素貝葉斯(Naive Bayes)和校正曲線(Calibration Curve)
    算法回顧圖片來源:medium.com貝葉斯分類算法屬於有監督機器學習(Supervised Learning)。貝葉斯分類器是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。其中樸素貝葉斯分分類是貝葉斯分類中最簡單的,也是最常見的一種分類方法。樸素貝葉斯分類算法的核心如下公式:P(A):它是先驗(Prior Probability),是A發生的概率。P(B): 是邊際可能性(Marginal Likelihood):是B發生的概率。
  • 機器學習 | Sklearn中的樸素貝葉斯全解
    前期文章介紹了樸素貝葉斯理論,掌握理論後如何去使用它,是數據挖掘工作者需要掌握的實操技能,下面來看看Sklearn中都有哪些樸素貝葉斯。通過繪製高斯樸素貝葉斯的學習曲線與分類樹,隨機森林和支持向量機的學習曲線的對比,來探索高斯樸素貝葉斯算法在擬合上的性質。
  • 機器學習測試筆記(21)——樸素貝葉斯算法
    item.m.jd.com/product/10023427978355.html以前兩本書的網上購買地址:《軟體測試技術實戰設計、工具及管理》:https://item.jd.com/34295655089.html《基於Django的電子商務網站》:https://item.jd.com/12082665.html1.樸素貝葉斯概率統計概念
  • 教你明白啥是樸素貝葉斯分類器
    前言樸素貝葉斯算法仍然是流行的十大挖掘算法之一,該算法是有監督的學習算法,解決的是分類問題
  • 機器學習基礎:樸素貝葉斯及經典實例講解
    (前例中,由於計算出來,男生概率大,對於分類問題,我們認為是男生)優點:(1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。(2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。
  • 分類算法之貝葉斯網絡
    》2.1、摘要在上一篇文章中我們討論了樸素貝葉斯分類。樸素貝葉斯分類有一個限制條件,就是特徵屬性必須有條件獨立或基本獨立(實際上在現實應用中幾乎不可能做到完全獨立)。當這個條件成立時,樸素貝葉斯分類法的準確率是最高的,但不幸的是,現實中各個特徵屬性間往往並不條件獨立,而是具有較強的相關性,這樣就限制了樸素貝葉斯分類的能力。
  • 【算法】樸素貝葉斯法
    筆者邀請您,先思考:1 您怎麼理解樸素貝葉斯法
  • 使用python訓練貝葉斯模型預測貸款逾期
    Bayes算法對貸款歷史數據進行建模。依次為數值計算庫numpy,科學計算庫pandas,交叉驗證庫cross_validation和樸素貝葉斯算法庫GaussianNB。#查看數據集的維度X.shape,Y.shape((823, 2), (823,))將數據分割為訓練集和測試集使用交叉檢驗庫通過隨機方式將特徵數據和目標數據分為測試集和訓練集,其中訓練集為原數據集的60%,測試集為40%。
  • 樸素貝葉斯詳解及中文輿情分析(附代碼實踐)
    作者|楊秀璋  整理|AI科技大本營本文主要講述樸素貝葉斯分類算法並實現中文數據集的輿情分析案例,希望這篇文章對大家有所幫助,提供些思路
  • 解讀實踐中最廣泛應用的分類模型:樸素貝葉斯算法
    貝葉斯模型在機器學習以及人工智慧中都有出現,cherry 分類器使用了樸素貝葉斯模型算法,經過簡單的優化,使用 1000 個訓練數據就能得到 97.5% 的準確率。雖然現在主流的框架都帶有樸素貝葉斯模型算法,大多數開發者只需要直接調用 api 就能使用。但是在實際業務中,面對不同的數據集,必須了解算法的原理,實現以及懂得對結果進行分析,才能達到高準確率。