https://www.toutiao.com/a6650068891382841859/

2019-01-24 22:23:40

朴素贝叶斯

朴素贝叶斯中的朴素是指假设各个特征之间相互独立,不会互相影响,所以称为朴素贝叶斯。正是因为这个假设,使得算法的模型简单且容易理解,虽然牺牲了一点准确性,但是如果模型训练的好,也能得到不错的分类效果。

公式简单推导

下面我们简单看一下公式的推导过程

评测指标

我们得出分类的结果后,怎么来评测我们训练的模型的好与不好呢?我们通常「准确度」「精确率」「召回率」这几个指标来进行判断模型的好坏。下边我们用一个简单的例子来说明这几个指标是怎么计算的。

下面我们看一个表。

表中表示实际上科技类的文章有 40 篇,财经类的有 30 篇,然而预测的结果科技类的有 35 篇,其中 30 篇预测正确了,有 5 篇预测错误了;预测结果财经类的有 35 篇,其中 25 篇预测正确了,10 篇预测错误了。

  • 准确度

表示预测正确的文章数比上总的文章数:(30+25)/(40+30)=78%

  • 精确率

表示每一类预测正确的数量比上预测的该类文章总数量,比如科技类精确率:30/(30+5)=85%

  • 召回率

表示每一类预测正确的数量比上实际该类的总数量,比如科技类:30/40=75%

应用实例

上边我们已经了解了朴素贝叶斯公式及推导过程,下边我们来看一下在实际的新闻分类中的应用。

元数据的准备,我们的元数据是网上找来的一些各类的新闻,这里为了简单,我们只选取了科技、财经和体育三类数量不等的新闻,并且都已知他们的类别。然后通过中文结巴分词

对每篇新闻进行分词。这里我们用到的是gihub上的一个开源的python库,有兴趣的可以了解一下。

下面我们来看一下代码的具体实现。

首先我们先把汉字的文章转成每个词所对应的数字id的形式,方便我们后边的操作和计算。

Convert.py

import os
import sys
import random
import re
​
inputPath = sys.argv[1]
outputFile = sys.argv[2]
#训练集所占百分比
trainPercent = 0.8
wordDict = {}
wordList = []
​
trainOutputFile = open('%s.train' % outputFile, "w")
testOutputFile = open('%s.test' % outputFile, "w")
​
for fileName in os.listdir(inputPath):tag = 0if fileName.find('technology') != -1:tag = 1elif fileName.find('business') != -1:tag = 2elif fileName.find('sport') != -1:tag = 3
​outFile = trainOutputFilerd = random.random()if rd >= trainPercent:outFile = testOutputFile
​inputFile = open(inputPath+'/'+fileName, "r")content = inputFile.read().strip()content = content.decode('utf-8', 'ignore')content = content.replace('
', ' ')r1 = u'[a-zA-Z0-9’!"#$%&'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\]^_`{|}~]+'content = re.sub(r1, '', content)outFile.write(str(tag)+' ')words = content.split(' ')for word in words:if word not in wordDict:wordList.append(word)wordDict[word] = len(wordList)
​outFile.write(str(wordDict[word]) + ' ')
​inputFile.close()
​
trainOutputFile.close()
testOutputFile.close()

朴素贝叶斯实现过程

NB.py

#Usage:
#Training: NB.py 1 TrainingDataFile ModelFile
#Testing: NB.py 0 TestDataFile ModelFile OutFile
​
import sys
import os
import math
​
​
DefaultFreq = 0.1
TrainingDataFile = "nb_data.train"
ModelFile = "nb_data.model"
TestDataFile = "nb_data.test"
TestOutFile = "nb_data.out"
ClassFeaDic = {}
ClassFreq = {}
WordDic = {}
ClassFeaProb = {}
ClassDefaultProb = {}
ClassProb = {}
​
#加载数据
def LoadData():i =0infile = open(TrainingDataFile, 'r')sline = infile.readline().strip()while len(sline) > 0:pos = sline.find("#")if pos > 0:sline = sline[:pos].strip()words = sline.split(' ')if len(words) < 1:print("Format error!")breakclassid = int(words[0])if classid not in ClassFeaDic:ClassFeaDic[classid] = {}ClassFeaProb[classid] = {}ClassFreq[classid] = 0ClassFreq[classid] += 1words = words[1:]for word in words:if len(word) < 1:continuewid = int(word)if wid not in WordDic:WordDic[wid] = 1if wid not in ClassFeaDic[classid]:ClassFeaDic[classid][wid] = 1else:ClassFeaDic[classid][wid] += 1i += 1sline = infile.readline().strip()infile.close()print(i, "instances loaded!")print(len(ClassFreq), "classes!", len(WordDic), "words!")
​
#计算模型
def ComputeModel():sum = 0.0for freq in ClassFreq.values():sum += freqfor classid in ClassFreq.keys():ClassProb[classid] = (float)(ClassFreq[classid])/(float)(sum)for classid in ClassFeaDic.keys():sum = 0.0for wid in ClassFeaDic[classid].keys():sum += ClassFeaDic[classid][wid]newsum = (float)(sum + 1)for wid in ClassFeaDic[classid].keys():ClassFeaProb[classid][wid] = (float)(ClassFeaDic[classid][wid]+DefaultFreq)/newsumClassDefaultProb[classid] = (float)(DefaultFreq) / newsumreturn
​
#保存模型
def SaveModel():outfile = open(ModelFile, 'w')for classid in ClassFreq.keys():outfile.write(str(classid))outfile.write(' ')outfile.write(str(ClassProb[classid]))outfile.write(' ')outfile.write(str(ClassDefaultProb[classid]))outfile.write(' ' )outfile.write('
')for classid in ClassFeaDic.keys():for wid in ClassFeaDic[classid].keys():outfile.write(str(wid)+' '+str(ClassFeaProb[classid][wid]))outfile.write(' ')outfile.write('
')outfile.close()
​
#加载模型
def LoadModel():global WordDicWordDic = {}global ClassFeaProbClassFeaProb = {}global ClassDefaultProbClassDefaultProb = {}global ClassProbClassProb = {}infile = open(ModelFile, 'r')sline = infile.readline().strip()items = sline.split(' ')if len(items) < 6:print("Model format error!")returni = 0while i < len(items):classid = int(items[i])ClassFeaProb[classid] = {}i += 1if i >= len(items):print("Model format error!")returnClassProb[classid] = float(items[i])i += 1if i >= len(items):print("Model format error!")returnClassDefaultProb[classid] = float(items[i])i += 1for classid in ClassProb.keys():sline = infile.readline().strip()items = sline.split(' ')i = 0while i < len(items):wid = int(items[i])if wid not in WordDic:WordDic[wid] = 1i += 1if i >= len(items):print("Model format error!")returnClassFeaProb[classid][wid] = float(items[i])i += 1infile.close()print(len(ClassProb), "classes!", len(WordDic), "words!")
​
#预测类别
def Predict():global WordDicglobal ClassFeaProbglobal ClassDefaultProbglobal ClassProb
​TrueLabelList = []PredLabelList = []i =0infile = open(TestDataFile, 'r')outfile = open(TestOutFile, 'w')sline = infile.readline().strip()scoreDic = {}iline = 0while len(sline) > 0:iline += 1if iline % 10 == 0:print(iline," lines finished!
")pos = sline.find("#")if pos > 0:sline = sline[:pos].strip()words = sline.split(' ')if len(words) < 1:print("Format error!")breakclassid = int(words[0])TrueLabelList.append(classid)words = words[1:]for classid in ClassProb.keys():scoreDic[classid] = math.log(ClassProb[classid])for word in words:if len(word) < 1:continuewid = int(word)if wid not in WordDic:continuefor classid in ClassProb.keys():if wid not in ClassFeaProb[classid]:scoreDic[classid] += math.log(ClassDefaultProb[classid])else:scoreDic[classid] += math.log(ClassFeaProb[classid][wid])i += 1maxProb = max(scoreDic.values())for classid in scoreDic.keys():if scoreDic[classid] == maxProb:PredLabelList.append(classid)sline = infile.readline().strip()infile.close()outfile.close()print(len(PredLabelList),len(TrueLabelList))return TrueLabelList,PredLabelList
​
#计算准确度
def Evaluate(TrueList, PredList):accuracy = 0i = 0while i < len(TrueList):if TrueList[i] == PredList[i]:accuracy += 1i += 1accuracy = (float)(accuracy)/(float)(len(TrueList))print("Accuracy:",accuracy)
​
#计算精确率和召回率
def CalPreRec(TrueList,PredList,classid):correctNum = 0allNum = 0predNum = 0i = 0while i < len(TrueList):if TrueList[i] == classid:allNum += 1if PredList[i] == TrueList[i]:correctNum += 1if PredList[i] == classid:predNum += 1i += 1return (float)(correctNum)/(float)(predNum),(float)(correctNum)/(float)(allNum)
​
#main framework
if sys.argv[1] == '1':print("start training:")LoadData()ComputeModel()SaveModel()
elif sys.argv[1] == '0':print("start testing:")
​LoadModel()TList,PList = Predict()i = 0outfile = open(TestOutFile, 'w')while i < len(TList):outfile.write(str(TList[i]))outfile.write(' ')outfile.write(str(PList[i]))outfile.write('
')i += 1outfile.close()Evaluate(TList,PList)for classid in ClassProb.keys():pre,rec = CalPreRec(TList, PList,classid)print("Precision and recall for Class",classid,":",pre,rec)
else:print("Usage incorrect!")
​

朴素贝叶斯算法应用实例相关推荐

  1. 机器学习笔记(五)续——朴素贝叶斯算法的后验概率最大化含义

    上一节中讲了朴素贝叶斯算法将实例分到后验概率最大的类.这等价于期望风险最小化. 假设使用0-1损失函数: L(Y,f(X))={1,0,Y≠f(X)Y=f(X) L(Y, f(X)) = \Bigg\ ...

  2. 朴素贝叶斯算法与应用实例

    本文为转载博客,转自: http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段 ...

  3. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  4. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

  5. java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  6. 朴素贝叶斯算法_机器学习第三篇:详解朴素贝叶斯算法

    一.统计知识 01|随机事件: 1.概念 随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件(简称事件).随机事件通常用大写英文字母A.B.C等表示.随机 ...

  7. 机器学习第三篇:详解朴素贝叶斯算法

    一.统计知识 01|随机事件: 1.概念 随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件(简称事件).随机事件通常用大写英文字母A.B.C等表示.随机 ...

  8. 机器学习之朴素贝叶斯算法原理

    朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法.它和其他绝大多数的分类算法都不同. 对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方 ...

  9. 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现

    应用贝叶斯准则: 使用上面这些定义,可以定义贝叶斯分类准则为: 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1; 如果 P(c2|x, y) > P(c1|x, ...

最新文章

  1. 使用Nginx实现服务器反向代理和负载均衡
  2. OpenGL starfield星空的实例
  3. idea 无法打开项目_Premiere出现quot;项目看来已经损坏,无法打开”的解决方法...
  4. python3九九乘法表儿歌下载_Python3基础 九九乘法表
  5. linux查看文件夹下每个文件大小,linux查看当前文件夹下每个文件大小
  6. Ubuntu 14.04 配置caffe环境
  7. 像科学家一样思考python_像计算机科学家一样思考Python (第2版) 中文pdf完整版
  8. 数据结构实践项目——图的基本运算及遍历操作
  9. pyqt5 登录跳转
  10. express 手册
  11. 小米推送,华为推送,个推,阿里云推送集成(服务端JAVA开发)
  12. Java校验身份证号码的工具类
  13. 封装的PHP爬虫类(一) 单量抓取
  14. UVA:1593 代码对齐
  15. 2023年软考高级信息系统项目管理师报名,这里靠谱
  16. cmd批量创建文件和文件夹
  17. 一款常用文档生成工具:Doxygen
  18. 工业相机在超级高铁管道视觉检测系统中的应用
  19. 南大通用数据库-Gbase-8a-学习-24-全文检索
  20. 转载:传说中的T检验

热门文章

  1. 《预训练周刊》第16期:中科院推出全球首个图文音三模态预训练模型、顶会论文探索100层序列推荐模型的加速训练...
  2. LIVE 预告 | 华为诺亚韩凯:Transformer in Transformer
  3. 用大白话讲解RxJava原理
  4. 直播 | Python Web开发者的破局之道
  5. 《Flex 3权威指南》——Adobe官方培训教材
  6. 《Decoupling Representation and Classifier》笔记
  7. 用rufus f2 制作Ubuntu16.04 U盘启动盘
  8. COCO API的克隆 - http://cocodataset.org/
  9. 区块链相关论文研读7:通过分片(Sharding)扩展区块链
  10. 对抗性攻击的原理简介