為了便於計算類條件概率\(p(x|c)\),樸素貝葉斯演算法作了乙個關鍵的假設:對已知類別,假設所有屬性相互獨立。
當使用訓練完的特徵向量對新樣本進行測試時,由於概率是多個很小的相乘所得,可能會出現下溢位,故對乘積取自然對數解決這個問題。
在大多數樸素貝葉斯分類器中計算特徵向量時採用的都是詞集模型,即將每個詞的出現與否作為乙個特徵。而在該分類器中採用的是詞袋模型,即文件中每個詞彙的出現次數作為乙個特徵。
當新樣本中有某個詞在原訓練詞中沒有出現過,會使得概率為0,故使用拉普拉斯平滑處理技術解決這一問題。對應公式如下:
在該模型中,所用到的訓練資料和測試資料均來自於搜狗分類語料庫,並選擇了體育類、財經類和教育類這三種新聞的各40個樣本,以作為該多分類器的輸入資料。
為了對文字完成分詞,對於英文文字而言,只需要簡單得利用str.split(" ")
,用空格對整個英文文字進行切割即可。而對於中文文字而言就相對複雜了點,因為在中文文字中,往往包含了中文、英文、數字、標點符號等多種字元,此外中文中常常是多個片語連線起來組成乙個句子,所以也無法類似英文那樣簡單利用某個符號進行分割。為了完成中文文字的分詞,使用了如下的文字過濾演算法:
stopwords = open("stop_words.txt", encoding='utf-8').read().split("\n")
def textparse(inputdata):
import re
global stopwords
inputdata = "".join(re.findall(u'[\u4e00-\u9fa5]+', inputdata))
wordlist = "/".join(jieba.cut(inputdata))
listoftokens = wordlist.split("/")
return [tok for tok in listoftokens if (tok not in stopwords and len(tok) >= 2)]
利用正規表示式u'[\u4e00-\u9fa5]+'
過濾掉輸入資料中的所有非中文本元;
在python下,有個中文分詞元件叫做jieba,可以很好得完成對中文文字的分詞。在這裡便是利用jieba中的cut函式"/".join(jieba.cut(inputdata))
完成對中文的分詞,並且以「/」作為分隔符。
在中文文字中,存在在大量的停用詞,這些停用詞對於表示乙個類別的特徵沒有多少貢獻,因此必需過濾掉輸入資料中的停用詞。這裡所用到的stop_words.txt ,包含了1598個停用詞,利用tok not in stopwords
過濾掉輸入資料中的停用詞。
在利用jieba完成分詞後,往往會存在大量長度為1的詞(不在停用詞表裡),這些詞對特徵表示同樣貢獻不大,利用len(tok) >= 2
將其過濾掉。
通過以上過程,便完成了中文文字的分詞。分詞結果如下:
為了對分類器的泛化誤差進行評估,遂使用留存交叉驗證法,即從輸入的40 * 3共120個樣本中,隨機選中20個樣本作為測試資料,其他100個樣本作為訓練資料,以此來測定泛化誤差。
經過10次測試,得到分類器的泛化誤差為:(0.1 + 0.0 + 0.1 + 0.1 = 0.0 + 0.05 + 0.1 + 0.15 + 0.1 + 0.25)/ 10 = 0.095
,可見該中分多分類器在新樣本上的表現還是很好的。其中部分分類結果如下所示:
樸素貝葉斯
樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...
樸素貝葉斯
1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...
樸素貝葉斯
機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...