机器学习:多项式模型朴素贝叶斯分类器(原理机器学习:多项式模型朴素贝叶斯分类器(原理+python实实
现)现)
简介简介
多项式朴素贝叶斯也是多用于文本处理,其原理和计算的流程和伯努利朴素贝叶斯基本一致,唯一的区别在于单词的计数方
式,由《伯努利朴素贝叶斯》一文可知,在文本处理的环节中,我们将单词是否出现在词组作为特征,但在多项式朴素贝叶斯
中,我们将单词在词组中出现的次数作为特征,因此只需要更改文中setOfWords2Vec的函数即可,变成如下方式:
def bagOfWords2VecMN(vocabList, inputSet):
returnVec = [0] * len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] += 1
return returnVec
下面我们就以实例来使用多项式朴素贝叶斯,这次我们使用最著名的贝叶斯应用:垃圾邮件分类。
准备数据准备数据
数据集点击这里,其提取码为x9ko
文本处理文本处理
首先将文本文件的字符变为我们想要的格式,即每个句子都生成单词组的列表,并将每个单词的字符变为小写,具体实现如
下:
# 输入文本
def textParse(bigString):
import re
dataMat = [] for line in bigString:
curLine = line.split()
curLine = [tok.lower() for tok in curLine if len(tok) > 2] dataMat.append(curLine)
return dataMat
接下来,就要构造多项式朴素贝叶斯并进行预测,这次选择50封邮件,其中随机抽取10封进行测试决策效果,以分类错误率
为评价指标(即将垃圾邮件当作正常邮件的比例),此外,我们将错分的邮件进行输出,以便观察我们可以在哪个方面进行精
度上的提升。
import numpy as np
import random
# 根据句子构建单词表
def createVocabList(dataSet):
vocabSet = set([]) # 因为document也是[]结构
for document in dataSet:
vocabSet = vocabSet | set(document) # 集合的并集
return list(vocabSet) # 将集合格式变为list格式
# 根据训练集,计算条件概率
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory) / float(numTrainDocs)
p0Num = np.ones(numWords);
p1Num = np.ones(numWords) # change to ones()
p0Denom = 2.0;
p1Denom = 2.0 # change to 2.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i] p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i] p0Denom += sum(trainMatrix[i])
p1Vect = np.log(p1Num / p1Denom) # change to log()
p0Vect = np.log(p0Num / p0Denom) # change to log()
return p0Vect, p1Vect, pAbusive
# 进行分类
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + np.log(pClass1) # element-wise mult
p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
if p1 > p0:
评论0