[python機器學習及實踐(2)]Sklearn實現朴素貝葉斯


1.朴素貝葉斯簡介

    朴素貝葉斯(Naive Bayes)是一個基於貝葉斯理論的分類器。它會單獨考量每一唯獨特征被分類的條件概率,進而綜合這些概率並對其所在的特征向量做出分類預測。
因此,朴素貝葉斯的基本數據假設是:各個維度上的特征被分類的條件概率之間是相互獨立的。它經常被應用在文本分類中,包括互聯網新聞的分類,垃圾郵件的篩選。

2.例子:新聞分類

數據:18846條新聞,標簽為0-19個數字,一共20類。

某個樣本:

From: Mamatha Devineni Ratnam <mr47+@andrew.cmu.edu>
Subject: Pens fans reactions
Organization: Post Office, Carnegie Mellon, Pittsburgh, PA
Lines: 12
NNTP-Posting-Host: po4.andrew.cmu.edu

 

I am sure some bashers of Pens fans are pretty confused about the lack
of any kind of posts about the recent Pens massacre of the Devils. Actually,
I am bit puzzled too and a bit relieved. However, I am going to put an end
to non-PIttsburghers' relief with a bit of praise for the Pens. Man, they
are killing those Devils worse than I thought. Jagr just showed you why
he is much better than his regular season stats. He is also a lot
fo fun to watch in the playoffs. Bowman should let JAgr have a lot of
fun in the next couple of games since the Pens are going to beat the pulp out of Jersey anyway. I was very disappointed not to see the Islanders lose the final
regular season game. PENS RULE!!!

代碼:

 

#coding=utf-8

from sklearn.datasets import fetch_20newsgroups  # 從sklearn.datasets里導入新聞數據抓取器 fetch_20newsgroups
from sklearn.model_selection import  train_test_split
from sklearn.feature_extraction.text import CountVectorizer  # 從sklearn.feature_extraction.text里導入文本特征向量化模塊
from sklearn.naive_bayes import MultinomialNB     # 從sklean.naive_bayes里導入朴素貝葉斯模型
from sklearn.metrics import classification_report

#1.數據獲取
news = fetch_20newsgroups(subset='all')
print len(news.data)  # 輸出數據的條數:18846

#2.數據預處理:訓練集和測試集分割,文本特征向量化
X_train,X_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=33) # 隨機采樣25%的數據樣本作為測試集
#print X_train[0]  #查看訓練樣本
#print y_train[0:100]  #查看標簽

#文本特征向量化
vec = CountVectorizer()
X_train = vec.fit_transform(X_train)
X_test = vec.transform(X_test)

#3.使用朴素貝葉斯進行訓練
mnb = MultinomialNB()   # 使用默認配置初始化朴素貝葉斯
mnb.fit(X_train,y_train)    # 利用訓練數據對模型參數進行估計
y_predict = mnb.predict(X_test)     # 對參數進行預測

#4.獲取結果報告
print 'The Accuracy of Naive Bayes Classifier is:', mnb.score(X_test,y_test)
print classification_report(y_test, y_predict, target_names = news.target_names)

 

 運行結果:

 

分析:

3.補充:文本特征向量化

朴素貝葉斯模型去給文本數據分類,就必須對文本數據進行處理。

處理的流程一般是:

  1. 對文本分詞(作為特征)
  2. 統計各詞在句子中是否出現(詞集模型)
  3. 統計各詞在句子中出現次數(詞袋模型)
  4. 統計各詞在這個文檔的TFIDF值(詞袋模型+IDF值)

 文本特征向量化方法有:

(1)詞集模型:one-hot編碼向量化文本;

(2)詞袋模型+IDF:TFIDF向量化文本;

(3)哈希向量化文本。

具體的原理如下:

1.one-hot表示法先將文本數據集中不重復的單詞提取出來,得到一個大小為V的詞匯表。然后用一個V維的向量來表示一個文章,向量中的第d個維度上的1表示詞匯表中的第d個單詞出現在這篇文章中。

如果文本數據集太大,那么得到的詞匯表中可能存在幾千個單詞,這樣會文本的維度太大,不僅會導致計算時間增加,而且帶來了稀疏問題(one-hot矩陣中大多數元素都是0)。因此,我們通常在計算詞匯表的時候,會排除那些出現次數太少的單詞,從而降低文本維度。

2.tf-idf (term frequency–inverse document frequency),不僅考慮了單詞在文章中的出現次數,還考慮了其在整個文本數據集中的出現次數。TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力。

3.TfidfVectorizer在執行時,需要先將詞袋矩陣放入內存,再計算各位置單詞的TFIDF值,如果詞袋維度大,將占用過多內存,效率低,此時可以使用哈希向量化。哈希向量化可以緩解TfidfVectorizer在處理高維文本時內存消耗過大的問題。

參考:

1.https://www.jianshu.com/p/dcc27a28b3f4

2.https://blog.csdn.net/juanqinyang/article/details/58222264


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM