今天看來樸素貝葉斯,最大的進步我覺得就是知道了她的乙個非常重要的用途,用作文字分類任務,下面是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 ...