一、前言
贝叶斯算法是机器学习中用来分类的,比如下面这个例子,假如你有个文本,里面有5500封邮件,包括正常邮件和垃圾邮件。后面你又收到一封邮件,你想通过它跟之前的邮件比较得出是正常邮件还是垃圾邮件。贝叶斯算法是基于概率论的,公式如下:
Conditions:
1、熟悉python基础语法和数据结构。
2、熟悉机器学习基本理论。
3、熟悉贝叶斯算法。
源码步骤:
step1、读取文件sms_spam.txt,将前5550行写入训练集,后10行写入测试集。
step2、将分类放到label[]、label_test[],将值放到corpus[]、corpus_test[]
Step3、将训练集向量化vectorizer.fit_transform(corpus)
Step4、将测试集向量化vectorizer2.fit_transform(corpus_test),只计算训练集的词组
Step5、拉普拉斯(alpha=1)预测测试集
二、源码
import os
import sys
import codecs
from sklearn.naive_bayesimport MultinomialNB
from sklearn.feature_extraction.textimport CountVectorizer
print('*************************\nNaive Bayes\n*************************')
if __name__ =='__main__':
# 读取文本构建语料库
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")
# 读取第一行,第一行数据是列头,不统计
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是一个矩阵
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_ 只计算上面vectorizer中单词的tf(term frequency 词频)
vectorizer2 = CountVectorizer(vocabulary=vectorizer.vocabulary_)# 特征在列表中的索引位置
fea_test = vectorizer2.fit_transform(corpus_test)
# alpha = 1 拉普拉斯估计给每个单词个数加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)