一、前言
? ? ? 貝葉斯算法是機(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è)試集文本
