樸素貝葉斯

2021-08-28 04:17:43 字數 4218 閱讀 3118

今天看來樸素貝葉斯,最大的進步我覺得就是知道了她的乙個非常重要的用途,用作文字分類任務,下面是copy兩個大佬的**,用來進行記憶:

#!/usr/bin/python

# coding:utf-8

from numpy import *

from math import *

def loaddataset():

postinglist = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],

['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],

['my', 'dalmation', 'is', 'so', 'cute', 'i', 'love', 'him'],

['stop', 'posting', 'stupid', 'worthless', 'garbage'],

['mr', 'licks', 'ate', 'my', 'steak',

'how', 'to', 'stop', 'him'],

['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]

classvec = [0, 1, 0, 1, 0, 1] # 1代表侮辱性文字 0代表正常的言論

return postinglist, classvec

def createvocablist(dataset): # 給定乙個資料集,建立乙個不含重複單詞的詞向量

vocablist = set()

for document in dataset:

vocablist = vocablist | set(document)

return list(vocablist)

def setofwords2vec(vocablist, inputset): #給定乙個詞向量和一條單詞構成的記錄,生成次條記錄的向量

returnvec = [0] * len(vocablist)

for word in inputset:

if word in vocablist:

returnvec[vocablist.index(word)] = 1

return returnvec

def trainnb0(trainmatrix, traincategory): # 訓練引數,得到乙個引數矩陣,對應著各個單詞對應分類的出現頻率

numtraindocs = len(trainmatrix)

numwords = len(trainmatrix[0])

pabusive = sum(traincategory) / float(numtraindocs)

p0num = ones(numwords)

p1num = ones(numwords)

p0denom = 2

p1denom = 2

for i in range(numtraindocs):

if traincategory[i] == 1:

p1num += trainmatrix[i]

p1denom += sum(trainmatrix[i])

else:

p0num += trainmatrix[i]

p0denom += sum(trainmatrix[i])

p1vec = p1num / p1denom

p0vec = p0num / p0denom

return p0vec, p1vec, pabusive

def classifynb(vec2classify, p0vec, p1vec, pclass1): # 計算分類

p1 = sum(vec2classify * p1vec) + log(pclass1) # array相乘並且加上類別個數的對數上

p0 = sum(vec2classify * p0vec) + log(1.0 - pclass1)

if p1 > p0:

return 1

else:

return 0

def testnb(): # 測試貝葉斯

listoposts, listclasses = loaddataset() #載入資料集

myvocablist = createvocablist(listoposts) # 得到詞向量

trainmat =

for postindoc in listoposts: # 生成訓練資料集的向量

vecofword = setofwords2vec(myvocablist, postindoc)

p0v, p1v, pab = trainnb0(trainmat, listclasses) # 根據已有的資料訓練出的引數p0 p1為矩陣

testentry = ['stupid'] # 測試資料

testmatrix = array(setofwords2vec(myvocablist, testentry)) # 得到測試資料的array

return classifynb(testmatrix, p0v, p1v, pab) # 分類

print(testnb()) #測試主函式

下面是呼叫sklearn實現的,用的語料庫是fetch_20newsgroups中的新聞:

#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.*****_bayes import multinomialnb # 從sklean.*****_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 y_train[0:100] #檢視標籤

#文字特徵向量化

vec = countvectorizer()

x_train = vec.fit_transform(x_train)

x_test = vec.transform(x_test)

print(x_train[0],len(x_train)) #檢視訓練樣本,估計有很多維,並列印出維數

#3.使用樸素貝葉斯進行訓練

mnb = multinomialnb() # 使用預設配置初始化樸素貝葉斯

mnb.fit(x_train,y_train) # 利用訓練資料對模型引數進行估計

y_predict = mnb.predict(x_test) # 對引數進行**

#4.獲取結果報告

#驗證正確率

from sklearn.metrics import accuracy_score

print('accuracy : % .2f' % accuracy_score(y_predict, y_test))

print ('the accuracy of ***** bayes classifier is:', mnb.score(x_test,y_test))

print (classification_report(y_test, y_predict, target_names = news.target_names))

我覺得最重要的不是實現,而是明白它的工作原理,明白原理之後你才能自己去寫出比較好的,適用的**

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件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 ...