java朴素贝叶斯算法_朴素贝叶斯算法&应用实例

朴素贝叶斯

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

d55ab3ec82c751aee9d8151719b2c1eb.png

公式简单推导

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

b4090959ccc2fd3386949ba5a7d9e808.png

评测指标

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

下面我们看一个表。

c77175c8a8f175152334373212e81fac.png

表中表示实际上科技类的文章有 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 osimport sysimport randomimport re​inputPath = sys.argv[1]outputFile = sys.argv[2]#训练集所占百分比trainPercent = 0.8wordDict = {}wordList = []​trainOutputFile = open('%s.train' % outputFile, "w")testOutputFile = open('%s.test' % outputFile, "w")​for fileName in os.listdir(inputPath): tag = 0 if fileName.find('technology') != -1: tag = 1 elif fileName.find('business') != -1: tag = 2 elif fileName.find('sport') != -1: tag = 3​ outFile = trainOutputFile rd = 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 sysimport osimport math​​DefaultFreq = 0.1TrainingDataFile = "nb_data.train"ModelFile = "nb_data.model"TestDataFile = "nb_data.test"TestOutFile = "nb_data.out"ClassFeaDic = {}ClassFreq = {}WordDic = {}ClassFeaProb = {}ClassDefaultProb = {}ClassProb = {}​#加载数据def LoadData(): i =0 infile = 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!") break classid = int(words[0]) if classid not in ClassFeaDic: ClassFeaDic[classid] = {} ClassFeaProb[classid] = {} ClassFreq[classid] = 0 ClassFreq[classid] += 1 words = words[1:] for word in words: if len(word) < 1: continue wid = int(word) if wid not in WordDic: WordDic[wid] = 1 if wid not in ClassFeaDic[classid]: ClassFeaDic[classid][wid] = 1 else: ClassFeaDic[classid][wid] += 1 i += 1 sline = infile.readline().strip() infile.close() print(i, "instances loaded!") print(len(ClassFreq), "classes!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值