基于朴素贝叶斯的机器学习实验教学设计
王敏 罗婧雯 刘军 刘沛泽
【摘要】? ? 贝叶斯学习是机器学习理论中的重要研究方向。本文主要实现基于朴素贝叶斯的机器学习实验教学设计,贝叶斯学习以贝叶斯法则为基础,通过已了解的数据分布的先验知识,结合样本训练数据来估算出整体数据的数学模型。贝叶斯学习的结果是获得一组变量的联合概率分布。贝叶斯学习由于其用概率的形式来表示不确定知识,故对不确定形式的问题它有独特的描述和计算优势。而朴素贝叶斯是在属性独立性假设的条件下进行计算,可以大大减小计算的复杂程度。实验设计目的是根据朴素贝叶斯公式实现对文档的分类,给学生提供一种实验教学案例。
【关键词】? ? 朴素贝叶斯? ? 实验教学设计? ? 文本分类
一、实验研究背景与目的
本实验设计主要基于朴素贝叶斯理论,目前是为学生提供基于贝叶斯理论的实验项目,让学生更好地理解该理论解决实际问题。 随着互联网的飞速发展, 海量数据注入到通讯设备中。如此大量的信息就让信息检索和数据挖掘的重要性更加突出。文本分类作为数据挖掘的一部分也逐渐被人们重视起来。其中文本分类的主要内容是在预先给定的类标签的集下, 根据文章内容, 确定它的类别。我们接下来将要通过三个方面来介绍:文本表示, 分类器构造和分类器评估。
二、实验设计思路
本实验的思路是把一部分含有女性、体育、文学出版、校园的话题用网络爬虫爬下来存在特定的文档中,然后通过朴素贝叶斯分类算法实现贝叶斯分类。
三、方案设计
系统设计流程框图如下。
四、具体算法描述
除去噪声,如格式转换,去掉符号,整体规范化;遍历的读取一个文件下的每个文本。操作如下。
def readFile(path):
with open(path, 'r', errors='ignore') as file:
content = file.read()
return content
def saveFile(path, result):
with open(path, 'w', errors='ignore') as file:
file.write(result)
4.1 jieba分词
1)首先利用import调用jieba模块、TF-IDF分词模块、朴素贝叶斯算法模块;
import jieba
2)jieba分词算法的基本原理是:1.基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG); 2.采用动态规划查找最大概率路径,找出基于词频的最大切分组合; 3.对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法;
代码如下:
def segText(inputPath, resultPath):
fatherLists = os.listdir(inputPath)
for eachDir in fatherLists:
eachPath = inputPath + eachDir + "/"? ? ? ? ? each_resultPath = resultPath + eachDir + "/"
if not os.path.exists(each_resultPath):
os.makedirs(each_resultPath)
childLists = os.listdir(eachPath)
for eachFile in childLists:
eachPathFile = eachPath + eachFile
#? print(eachFile)
content = readFile(eachPathFile)
# content = str(content)
result = (str(content)).replace("\r\n", "").strip()
# result = content.replace("\r\n","").strip()
cutResult = jieba.cut(result)
saveFile(each_resultPath + eachFile, " ".join(cutResult))
4.2 TF-IDF逆文本頻率指数
1)首先调用TF-IDF向量转换类和向量生成类。
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
2)TF-IDF逆文本频率指数是一种用于信息检索与数据挖掘的常用加权技术。是一种统计方法,用以评估一个词对于一个语料库中一份文件的重要程度。词的重要性随着在文件中出现的次数正比增加,同时随着它在语料库其他文件中出现的频率反比下降。
3)TF-IDF词频算法实现。一个词在某一文档中出现次数比较多,其他文档没有出现,说明该词对该文档分类很重要。然而如果其他文档也出现比较多,说明该词的区分性不大,就用IDF来降低该词的权重。
TF-IDF=TF×IDF
其中,词频:TF=词在文档中出现的次数/文档中总词数;
逆文本频率:IDF=log(语料库中文档总数/包含该词的文档数+1)。
def getTFIDFMat(inputPath, stopWordList, outputPath):
bunch = readBunch(inputPath)
tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label, filenames=bunch.filenames, tdm=[],
vocabulary={})
vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5)
transformer = TfidfTransformer()
tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
tfidfspace.vocabulary = vectorizer.vocabulary_
writeBunch(outputPath, tfidfspace)
4.3朴素贝叶斯分类法
1)首先调用贝叶斯分类法算法模块,这个模块是调用已有的别人写好的算法,下面会详细介绍原理过程。
from sklearn.naive_bayes import MultinomialNB
2)朴素贝叶斯原理
朴素贝叶斯分类器采用了“属性条件独立性假设” 对已知类别假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。故贝叶斯公式可以重写为
因为给定样本P(x)为已知的,故贝叶斯准则就可以转化为
显然,朴素贝叶斯分类器的训练过程就是基于训练集 D 来估计类先验概率P(c),并为每个属性估计条件概率。
令Dc表示訓练集D中第c类样本组成的集合,若有充足的独立同分布样本则可容易地估计出类先验概率。
对离散属性而言,令表示Dc中在第i个属性上取值为的样本组成的集合,则条件概率可估计为
程序如下:
def bayesAlgorithm(trainPath, testPath):
trainSet = readBunch(trainPath)
testSet = readBunch(testPath)
clf = MultinomialNB(alpha=0.001).fit(trainSet.tdm, trainSet.label)
#alpha:0.001 alpha 越小,迭代次数越多,精度越高
#print(shape(trainSet.tdm))? #输出单词矩阵的类型
#print(shape(testSet.tdm))
predicted = clf.predict(testSet.tdm)
total = len(predicted)
rate = 0
for flabel, fileName, expct_cate in zip(testSet.label, testSet.filenames, predicted):
if flabel != expct_cate:
rate += 1
print(fileName, ":实际类别:", flabel, "-->预测类别:", expct_cate)
print("erroe rate:", float(rate) * 100 / float(total), "%")
五、系统测试情况
下图中data文件夹中是原始数据,result文件夹是jieba分词结果,stop是文本预处理筛掉的的停用词。test是测试数据,test_segResult是测试结果。
其中测试数据集:女性话题有38个,体育话题115个,文学出版话题31个,校园话题16个,以下是测试出错的结果。其中校园话题出错的概率最大。
六、小结
此程序简单易懂,是在贝叶斯的基础上进一步了解了朴素贝叶斯公式的原理及其运用,介绍了jieba分词和TF-IDF逆文本频率指数及其应用,在实际案例中错误率仅为0.570,准确率较高,可以在实验课程教学中使用。
参? 考? 文? 献
[1]苏金树, 张博锋, 徐昕.基于机器学习的文本分类技术研究进展[J].软件学报, 2006, 17 (09) :1848-1859.
[2]李学明, 李海瑞, 薛亮, 何光军.基于信息增益与信息熵的TFIDF算法[J].计算机工程, 2012, 38 (08) :37-40.
[3]Tom M.Mitchell著;曾华军等译,机器学习[M]. 机械工业出版社,2003.
[4]陈叶旺,余金山. 一种改进的朴素贝叶斯文本分类方法[J].? 华侨大学学报(自然科学版). 2011(04).