帶拉普拉斯估計(jì)的樸素貝葉斯算法的一個(gè)python例子

一、前言

? ? ? 貝葉斯算法是機(jī)器學(xué)習(xí)中用來分類的,比如下面這個(gè)例子,假如你有個(gè)文本,里面有5500封郵件,包括正常郵件和垃圾郵件。后面你又收到一封郵件,你想通過它跟之前的郵件比較得出是正常郵件還是垃圾郵件。貝葉斯算法是基于概率論的,公式如下:


Conditions:

1、熟悉python基礎(chǔ)語法和數(shù)據(jù)結(jié)構(gòu)。

2、熟悉機(jī)器學(xué)習(xí)基本理論。

3、熟悉貝葉斯算法。

源碼步驟:

step1、讀取文件sms_spam.txt,將前5550行寫入訓(xùn)練集,后10行寫入測(cè)試集。

step2、將分類放到label[]、label_test[],將值放到corpus[]、corpus_test[]

Step3、將訓(xùn)練集向量化vectorizer.fit_transform(corpus)

Step4、將測(cè)試集向量化vectorizer2.fit_transform(corpus_test),只計(jì)算訓(xùn)練集的詞組

Step5、拉普拉斯(alpha=1)預(yù)測(cè)測(cè)試集


二、源碼

import os

import sys

import codecs

from sklearn.naive_bayesimport MultinomialNB

from sklearn.feature_extraction.textimport CountVectorizer

print('*************************\nNaive Bayes\n*************************')

if __name__ =='__main__':

# 讀取文本構(gòu)建語料庫

? ? corpus = []

labels = []

corpus_test = []

labels_test = []

f = codecs.open("./sms_spam.txt","rb")

count =0

? ? while True:

# readline() 方法用于從文件讀取整行,包括 "\n" 字符。

? ? ? ? line = f.readline().decode("utf-8")

# 讀取第一行,第一行數(shù)據(jù)是列頭,不統(tǒng)計(jì)

? ? ? ? if count ==0:

count = count +1

? ? ? ? ? ? continue

? ? ? ? if line:

count = count +1

? ? ? ? ? ? line = line.split(",")

label = line[0]

sentence = line[1]

corpus.append(sentence)

if "ham" == label:

labels.append(0)

elif "spam" == label:

labels.append(1)

if count >5550:

corpus_test.append(sentence)

if "ham" == label:

labels_test.append(0)

elif "spam" == label:

labels_test.append(1)

else:

break

# 詞袋法

? ? vectorizer = CountVectorizer()

# 每行的詞向量,fea_train是一個(gè)矩陣

? ? fea_train = vectorizer.fit_transform(corpus)

print("vectorizer.get_feature_names is ", vectorizer.get_feature_names())# 特征名稱

? ? print("fea_train is ", fea_train.toarray())

# vocabulary=vectorizer.vocabulary_ 只計(jì)算上面vectorizer中單詞的tf(term frequency 詞頻)

? ? vectorizer2 = CountVectorizer(vocabulary=vectorizer.vocabulary_)# 特征在列表中的索引位置

? ? fea_test = vectorizer2.fit_transform(corpus_test)

# alpha = 1 拉普拉斯估計(jì)給每個(gè)單詞個(gè)數(shù)加1

? ? clf = MultinomialNB(alpha=1)

clf.fit(fea_train, labels)

pred = clf.predict(fea_test);

for pin pred:

if p ==0:

print("正常郵件")

else:

print("垃圾郵件")

print(pred)


三、訓(xùn)練集和測(cè)試集文本

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容