本文作者:陳 鼎 中南財經政法大學統計與數學學院
文字編輯:任 哲
技術總編:張馨月
爬蟲俱樂部於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)
特徵工程,是將原始數據轉化為特徵的過程。這些特徵可以更好地向預測模型描述潛在問題,從而提高模型對未見數據的準確性。特徵工程直接影響著模型的預測結果。在本案例中,我們需要將新聞文本數據進行特徵工程處理,即將新聞文本進行分詞,統計每個詞的出現頻數,將具有代表性的詞彙與文本分類結果對應。 常用於文本分類的特徵工程為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()
一位大學黨委書記的自我結束——風波裡的學者本真
Seminar | CEO的哪些特徵和能力更重要?
Python中的這些運算符你真的會用嗎?
微信公眾號「Stata and Python數據分析」分享實用的stata、python等軟體的數據處理知識,歡迎轉載、打賞。我們是由李春濤教授領導下的研究生及本科生組成的大數據處理和分析團隊。
此外,歡迎大家踴躍投稿,介紹一些關於stata和python的數據處理和分析技巧。投稿郵箱:statatraining@163.com投稿要求: