朴素贝叶斯Python实例及解析
本文实例为大家分享了Python朴素贝叶斯实例代码,供大家参考,具体内容如下
#-*-coding:utf-8-*-#添加中文注释 fromnumpyimport* #过滤网站的恶意留言 #样本数据 defloadDataSet(): postingList=[['my','dog','has','flea','problems','help','please'], ['maybe','not','take','him','to','dog','park','stupid'], ['my','dalmation','is','so','cute','I','love','him'], ['stop','posting','stupid','worthless','garbage'], ['mr','licks','ate','my','steak','how','to','stop','him'], ['quit','buying','worthless','dog','food','stupid']] #类别标签:1侮辱性文字,0正常言论 classVec=[0,1,0,1,0,1] #返回文档向量,类别向量 returnpostingList,classVec #创建词汇表 #输入:dataSet已经经过切分处理 #输出:包含所有文档中出现的不重复词的列表 defcreateVocabList(dataSet): #构建set集合,会返回不重复词表 vocabSet=set([]) #遍历每篇文档向量,扫描所有文档的单词 fordocumentindataSet: #通过set(document),获取document中不重复词列表 vocabSet=vocabSet|set(document)#求并集 returnlist(vocabSet) #***词集模型:只考虑单词是否出现 #vocabList:词汇表 #inputSet:某个文档向量 defsetOfWords2Vec(vocabList,inputSet): #创建所含元素全为0的向量 returnVec=[0]*len(vocabList) #依次取出文档中的单词与词汇表进行对照,若在词汇表中出现则为1 forwordininputSet: ifwordinvocabList: #单词在词汇表中出现,则记为1 returnVec[vocabList.index(word)]=1#词集模型 #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示 else:print"theword:%sisnotinmyVocabulary!"%word returnreturnVec #====训练分类器,原始的朴素贝叶斯,没有优化===== #输入trainMatrix:词向量数据集 #输入trainCategory:数据集对应的类别标签 #输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度 #输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度 #输出pAbusive:侮辱性言论在整个数据集中的比例 deftrainNB00(trainMatrix,trainCategory): #numTrainDocs训练集总条数 numTrainDocs=len(trainMatrix) #训练集中所有不重复单词总数 numWords=len(trainMatrix[0]) #侮辱类的概率(侮辱类占总训练数据的比例) pAbusive=sum(trainCategory)/float(numTrainDocs) #*正常言论的类条件概率密度p(某单词|正常言论)=p0Num/p0Denom p0Num=zeros(numWords);#初始化分子为0 #*侮辱性言论的类条件概率密度p(某单词|侮辱性言论)=p1Num/p1Denom p1Num=zeros(numWords)#初始化分子为0 #初始化分母置为0 p0Denom=0; p1Denom=0 #遍历训练集数据 foriinrange(numTrainDocs): #若为侮辱类 iftrainCategory[i]==1: #统计侮辱类所有文档中的各个单词总数 p1Num+=trainMatrix[i] #p1Denom侮辱类总单词数 p1Denom+=sum(trainMatrix[i]) #若为正常类 else: #统计正常类所有文档中的各个单词总数 p0Num+=trainMatrix[i] #p0Denom正常类总单词数 p0Denom+=sum(trainMatrix[i]) #词汇表中的单词在侮辱性言论文档中的类条件概率 p1Vect=p1Num/p1Denom #词汇表中的单词在正常性言论文档中的类条件概率 p0Vect=p0Num/p0Denom returnp0Vect,p1Vect,pAbusive #=====训练分类器,优化处理===== #输入trainMatrix:词向量数据集 #输入trainCategory:数据集对应的类别标签 #输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度 #输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度 #输出pAbusive:侮辱性言论在整个数据集中的比例 deftrainNB0(trainMatrix,trainCategory): #训练集总条数:行数 numTrainDocs=len(trainMatrix) #训练集中所有单词总数:词向量维度 numWords=len(trainMatrix[0]) #侮辱类的概率(侮辱类占总训练数据的比例) pAbusive=sum(trainCategory)/float(numTrainDocs) #*拉普拉斯平滑防止类条件概率为0,初始化分子为1,分母为2 #正常类向量置为1 p0Num=ones(numWords);#初始化分子为1 #侮辱类向量置为1 p1Num=ones(numWords)#初始化分子为1 #初始化分母置为2 p0Denom=2.0; p1Denom=2.0 #遍历训练集每个样本 foriinrange(numTrainDocs): #若为侮辱类 iftrainCategory[i]==1: #统计侮辱类所有文档中的各个单词总数 p1Num+=trainMatrix[i]#向量 #p1Denom侮辱类总单词数 p1Denom+=sum(trainMatrix[i]) #若为正常类 else: #统计正常类所有文档中的各个单词总数 p0Num+=trainMatrix[i] #p0Denom正常类总单词数 p0Denom+=sum(trainMatrix[i]) #数据取log,即单个单词的p(x1|c1)取log,防止下溢出 p1Vect=log(p1Num/p1Denom) p0Vect=log(p0Num/p0Denom) returnp0Vect,p1Vect,pAbusive #vec2Classify:待分类文档 #p0Vect:词汇表中每个单词在训练样本的正常言论中的类条件概率密度 #p1Vect:词汇表中每个单词在训练样本的侮辱性言论中的类条件概率密度 #pClass1:侮辱性言论在训练集中所占的比例 defclassifyNB(vec2Classify,p0Vect,p1Vect,pClass1): #在对数空间中进行计算,属于哪一类的概率比较大就判为哪一类 #print'0p1=',sum(vec2Classify*p0Vect)#查看结果 #print'0p0=',sum(vec2Classify*p0Vect) p1=sum(vec2Classify*p1Vect)+log(pClass1) p0=sum(vec2Classify*p0Vect)+log(1.0-pClass1) #print'p1=',p1 #print'p0=',p0 ifp1>p0: return1 else: return0 deftestingNB(): #获得训练数据,类别标签 listOPosts,listClasses=loadDataSet() #创建词汇表 myVocabList=createVocabList(listOPosts) #构建矩阵,存放训练数据 trainMat=[] #遍历原始数据,转换为词向量,构成数据训练矩阵 forpostinDocinlistOPosts: #数据转换后存入数据训练矩阵trainMat中 trainMat.append(setOfWords2Vec(myVocabList,postinDoc)) #训练分类器 p0V,p1V,pAb=trainNB0(array(trainMat),array(listClasses)) #===测试数据(1) testEntry=['love','my','dalmation'] #测试数据转为词向量 thisDoc=array(setOfWords2Vec(myVocabList,testEntry)) #输出分类结果 printtestEntry,'classifiedas:',classifyNB(thisDoc,p0V,p1V,pAb) #===测试数据(2) testEntry=['stupid','garbage'] #测试数据转为词向量 thisDoc=array(setOfWords2Vec(myVocabList,testEntry)) #输出分类结果 printtestEntry,'classifiedas:',classifyNB(thisDoc,p0V,p1V,pAb) #***词袋模型:考虑单词出现的次数 #vocabList:词汇表 #inputSet:某个文档向量 defbagOfWords2VecMN(vocabList,inputSet): #创建所含元素全为0的向量 returnVec=[0]*len(vocabList) #依次取出文档中的单词与词汇表进行对照,统计单词在文档中出现的次数 forwordininputSet: ifwordinvocabList: #单词在文档中出现的次数 returnVec[vocabList.index(word)]+=1 #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示 else:print"theword:%sisnotinmyVocabulary!"%word returnreturnVec #准备数据,按空格切分出词 #单词长度小于或等于2的全部丢弃 deftextParse(bigString): importre listOfTokens=re.split(r'\W*',bigString) #tok.lower()将整个词转换为小写 return[tok.lower()fortokinlistOfTokensiflen(tok)>2] defspamTest(): #文章按篇存放 docList=[]; #存放文章类别 classList=[]; #存放所有文章内容 fullText=[] foriinrange(1,26): #读取垃圾邮件 #wordList=textParse(open('D:/work/python/email/spam/%d.txt'%i).read()) wordList=textParse(open('D:/machinelearning/python/bayes/email/spam/%d.txt'%i).read()) #docList按篇存放文章 docList.append(wordList) #fullText邮件内容存放到一起 fullText.extend(wordList) #垃圾邮件类别标记为1 classList.append(1) #读取正常邮件 #wordList=textParse(open('D:/work/python/email/ham/%d.txt'%i).read()) wordList=textParse(open('D:/machinelearning/python/bayes/email/ham/%d.txt'%i).read()) docList.append(wordList) fullText.extend(wordList) #正常邮件类别标记为0 classList.append(0) #创建词典 vocabList=createVocabList(docList) #训练集共50篇文章 trainingSet=range(50); #创建测试集 testSet=[] #随机选取10篇文章为测试集,测试集中文章从训练集中删除 foriinrange(10): #0-50间产生一个随机数 randIndex=int(random.uniform(0,len(trainingSet))) #从训练集中找到对应文章,加入测试集中 testSet.append(trainingSet[randIndex]) #删除对应文章 del(trainingSet[randIndex]) #准备数据,用于训练分类器 trainMat=[];#训练数据 trainClasses=[]#类别标签 #遍历训练集中文章数据 fordocIndexintrainingSet: #每篇文章转为词袋向量模型,存入trainMat数据矩阵中 trainMat.append(bagOfWords2VecMN(vocabList,docList[docIndex])) #trainClasses存放每篇文章的类别 trainClasses.append(classList[docIndex]) #训练分类器 p0V,p1V,pSpam=trainNB0(array(trainMat),array(trainClasses)) #errorCount记录测试数据出错次数 errorCount=0 #遍历测试数据集,每条数据相当于一条文本 fordocIndexintestSet: #文本转换为词向量模型 wordVector=bagOfWords2VecMN(vocabList,docList[docIndex]) #模型给出的分类结果与本身类别不一致时,说明模型出错,errorCount数加1 ifclassifyNB(array(wordVector),p0V,p1V,pSpam)!=classList[docIndex]: errorCount+=1 #输出出错的文章 print"classificationerror",docList[docIndex] #输出错误率,即出错次数/总测试次数 print'theerrorrateis:',float(errorCount)/len(testSet) #returnvocabList,fullText if__name__=="__main__": ###**********************留言板数据:观察参数值start ####获取数据 listOPosts,listClasses=loadDataSet() ##构建词汇表 myVocabList=createVocabList(listOPosts) print'myVocabList=',myVocabList print'result=',setOfWords2Vec(myVocabList,listOPosts[0]) trainMat=[] forpostinDocinlistOPosts: #构建训练矩阵 trainMat.append(setOfWords2Vec(myVocabList,postinDoc)) p0Vect,p1Vect,pAbusive=trainNB0(trainMat,listClasses) print'p0Vect=' printp0Vect print'p1Vect=' printp1Vect print'pAbusive=' printpAbusive print'trainMatrix=' printtrainMat print'listClasses=',listClasses ###**********************留言板数据:观察参数值end ###测试留言板文档 print'===================================' testingNB() #***********************垃圾邮件 ###垃圾邮件分类 print'=======spamfiltering=============' spamTest()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。