《程哥精品02-机器学习_第2天(贝叶斯分类算法与应用) (2).pdf》由会员分享,可在线阅读,更多相关《程哥精品02-机器学习_第2天(贝叶斯分类算法与应用) (2).pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、机器学习算法 day02_贝叶斯分类算法及应用课程大纲课程大纲朴素贝叶斯算法原理Bayes 算法概述Bayes 算法思想Bayes 算法要点朴素贝叶斯算法案例 1朴素贝叶斯算法案例 2需求Python 实现需求Python 实现课程目标:1、理解朴素贝叶斯算法的核心思想2、理解朴素贝叶斯算法的代码实现3、掌握朴素贝叶斯算法的应用步骤:数据处理、建模、运算和结果判定1.1.朴素贝叶斯分类算法原理朴素贝叶斯分类算法原理1.11.1 概述概述贝叶斯分类算法贝叶斯分类算法是一大类分类算法的总称贝叶斯分类算法以样本可能属于某类的概率来作为分类依据样本可能属于某类的概率来作为分类依据朴素贝叶斯分类算法是贝
2、叶斯分类算法中最简单的一种注:朴素的意思是条件概率独立性1.21.2 算法思想算法思想朴素贝叶斯的思想思想是这样的:如果一个事物在一些属性条件发生的情况下,事物属于A 的概率属于 B 的概率,则判定事物属于 A通俗来说比如,你在街上看到一个黑人,我让你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?在你的脑海中,有这么一个判断流程:1、这个人的肤色是黑色 2、非洲人中黑色人种概率最高 而用于判断的标准是:P(非洲人|黑色)3、没有其他辅助信息的情况下,最好的判断就是非洲人这就是朴素贝叶斯的思想基础。再扩展一下,假如某条街上,有100 人,其中有50 个美国人,50 个非洲人,看到一个讲英语的黑人
3、,那我们是怎么去判断他来自于哪里?提取特征:肤色:黑语言:英语先验知识:P(黑色|非洲人)=0.8P(讲英语|非洲人)=0.1P(黑色|美国人)=0.2P(讲英语|美国人)=0.9要判断的概率是:P(非洲人|(讲英语,黑色)P(美国人|(讲英语,黑色)思考过程:P(非洲人|(讲英语,黑色)的 分子=0.1*0.8*0.5=0.04P(美国人|(讲英语,黑色)的 分子=0.9*0.2*0.5=0.09从而比较这两个概率的大小就等价于比较这两个分子的值:可以得出结论,此人应该是:美国人我们的判断结果就是:此人来自美国!其蕴含的数学原理如下:p(A|xy)=p(Axy)/p(xy)=p(Axy)/p
4、(x)p(y)=p(A)/p(x)*p(A)/p(y)*p(xy)/p(xy)=p(A|x)p(A|y)p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)*p(xy)/p(xy)=p(A|x)p(A|y)朴素贝叶斯分类器朴素贝叶斯分类器讲了上面的小故事,我们来朴素贝叶斯分类器的表示形式:当特征为为 x 时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,即朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。1.31.
5、3 算法要点算法要点1.3.11.3.1 算法步骤算法步骤1、分解各类先验样本数据中的特征2、计算各类数据中,各特征的条件概率(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1).)3、分解待分类数据中的特征(特征 1、特征 2、特征 3、特征 4.)4、计算各特征的各条件概率的乘积,如下所示:判断为 A 类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4).判断为 B 类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4).判断为 C 类的概率:p(C|特征1)*p(C
6、|特征2)*p(C|特征3)*p(C|特征4).5、结果中的最大值就是该样本所属的类别1.3.21.3.2 算法应用举例算法应用举例大众点评、淘宝等电商上都会有大量的用户评论,比如:1、衣服质量太差了!颜色根本不纯!2、我有一有种上当受骗的感觉!3、质量太差,衣服拿到手感觉像旧货!4、上身漂亮,合身,很帅,给卖家点赞5、穿上衣服帅呆了,给点一万个赞6、我在他家买了三件衣服!质量都很差!000110其中 1/2/3/6 是差评,4/5 是好评现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:a、这么差的衣服以后再也不买了b、帅,有逼格1.3.31.3.3 算法应用流程算法应用流程1、分解
7、出先验数据中的各特征(即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”)2、计算各类别(好评、差评)中,各特征的条件概率(比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评)、p(“差”|差评))3、计算类别概率P(好评|(c1,c2,c5,c8)的分子=p(“c1”|好评)*p(“c2”|好评)*p(好评)P(好评|(c1,c2,c5,c8)的分子=p(“c1”|差评)*p(“c2”|差评)*p(差评)5、显然 P(差评)的结果值更大,因此a 被判别为“差评”2.2.朴素贝叶斯分类算法案例朴素贝叶斯分类算法案例 1 12.12.1 需求需求客户评论分类:客
8、户评论分类:以在线社区的留言板为例。为了不影响社区的发展,我们要屏蔽侮辱性的言论,所以要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。过滤这类内容是一个很常见的需求。对此问题建立两个类别:侮辱类和非侮辱类,使用 1 和 0 分别标识。有以下先验数据,使用 bayes 算法对未知类别数据分类帖子内容my,dog,has,flea,problems,help,please类别0maybe,not,take,him,to,dog,park,stupidmy,dalmation,is,so,cute,I,love,himstop,posting,stupid
9、,worthless,garbagemr,licks,ate,my,steak,how,to,stop,himquit,buying,worthless,dog,food,stupid待分类数据:love,my,dalmationstupid,garbage?10101p(好评|c1,c2,c3)-p(c1,c2,c3|好评)p(好评)-p(c1|好评)p(c2|好评)p(c3|好评)p(好评)p(c1|好评)求解:c1 在样本好评中出现的总次数/先算出样本好评类的句子中总的词数p(好评)求解:样本中好评的条数/样本的总条数p(差评|c1,c2,c3)-p(c1,c2,c3|差评)p(差评)-
10、p(c1|(差评)p(c2|好(差评)p(c3|(差评)p(差评)2.22.2 模型分析模型分析参见 1.3.2跟 1.3.2 节中的举例基本一致,中文换成英文即可2.2Python2.2Python 实现实现(1)(1)词表到词向量的转换函数词表到词向量的转换函数from numpy import*#过滤网站的恶意留言#创建一个实验样本def loadDataSet():postingList=my,dog,has,flea,problems,help,please,maybe,not,take,him,to,dog,park,stupid,my,dalmation,is,so,cute,I
11、,love,him,stop,posting,stupid,worthless,garbage,mr,licks,ate,my,steak,how,to,stop,him,quit,buying,worthless,dog,food,stupidclassVec=0,1,0,1,0,1return postingList,classVec#创建一个包含在所有文档中出现的不重复词的列表def createVocabList(dataSet):vocabSet=set()#创建一个空集for document in dataSet:vocabSet=vocabSet|set(document)#创
12、建两个集合的并集return list(vocabSet)#将文档词条转换成词向量def setOfWords2Vec(vocabList,inputSet):returnVec=0*len(vocabList)#创建一个其中所含元素都为0 的向量for word in inputSet:if word in vocabList:#returnVecvocabList.index(word)=1#index 函数在字符串里找到字符第一次出现的位置词集模型returnVecvocabList.index(word)+=1#文档的词袋模型每个单词可以出现多次else:print the word:
13、%s is not in my Vocabulary!%wordreturn returnVec(2)(2)从词向量计算概率从词向量计算概率#朴素贝叶斯分类器训练函数从词向量计算概率def trainNB0(trainMatrix,trainCategory):numTrainDocs=len(trainMatrix)numWords=len(trainMatrix0)pAbusive=sum(trainCategory)/float(numTrainDocs)#p0Num=zeros(numWords);p1Num=zeros(numWords)#p0Denom=0.0;p1Denom=0.
14、0p0Num=ones(numWords);#避免一个概率值为 0,最后的乘积也为 0p1Num=ones(numWords);#用来统计两类数据中,各词的词频p0Denom=2.0;#用于统计 0 类中的总数p1Denom=2.0#用于统计 1 类中的总数for i in range(numTrainDocs):if trainCategoryi=1:p1Num+=trainMatrixip1Denom+=sum(trainMatrixi)else:p0Num+=trainMatrixip0Denom+=sum(trainMatrixi)#p1Vect=p1Num/p1Denom#p0Vec
15、t=p0Num/p0Denomp1Vect=log(p1Num/p1Denom)#在类 1 中,每个次的发生概率p0Vect=log(p0Num/p0Denom)#避免下溢出或者浮点数舍入导致的错误下溢出是由太多很小的数相乘得到的return p0Vect,p1Vect,pAbusive(3)(3)根据现实情况修改分类器根据现实情况修改分类器注意:主要从以下两点对分类器进行修改贝叶斯概率需要计算多个概率的乘积以获得文档属于某个类别的概率,即计算p(w0|1)p(w1|1)p(w2|1)。如果其中一个概率值为0,那么最后的乘积也为0第二个问题就是下溢出,这是由于太多过小的数相乘造成的。由于大部分
16、因子都非常小,所以程序会下溢出或者得不到正确的答案。解决办法是对乘积取自然对数这样可以避免下溢出或者浮点数舍入导致的错误。每个单词的出现与否作为一个特征,被称为词集模型;在词袋模型中,每个单词可以出现多次。#朴素贝叶斯分类器def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):p1=sum(vec2Classify*p1Vec)+log(pClass1)p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)if p1 p0:return 1else:return 0def testingNB():listOPosts,
17、listClasses=loadDataSet()myVocabList=createVocabList(listOPosts)trainMat=for postinDoc in listOPosts:trainMat.append(setOfWords2Vec(myVocabList,postinDoc)p0V,p1V,pAb=trainNB0(array(trainMat),array(listClasses)testEntry=love,my,dalmationthisDoc=array(setOfWords2Vec(myVocabList,testEntry)print testEnt
18、ry,classified as:,classifyNB(thisDoc,p0V,p1V,pAb)testEntry=stupid,garbagethisDoc=array(setOfWords2Vec(myVocabList,testEntry)print testEntry,classified as:,classifyNB(thisDoc,p0V,p1V,pAb)(4)(4)运行测试运行测试reload(bayes)bayes.testingNB()love,my,dalmation classified as:0stupid,garbage classified as:13 3、朴素贝
19、叶斯分类算法案例、朴素贝叶斯分类算法案例 2 23.13.1 需求需求利用大量邮件先验数据,使用朴素贝叶斯分类算法来自动识别垃圾邮件3.2 python3.2 python实现实现#过滤垃圾邮件def textParse(bigString):#正则表达式进行文本解析import relistOfTokens=re.split(rW*,bigString)return tok.lower()for tok in listOfTokens if len(tok)2def spamTest():docList=;classList=;fullText=for i in range(1,26):#导
20、入并解析文本文件wordList=textParse(open(email/spam/%d.txt%i).read()docList.append(wordList)fullText.extend(wordList)classList.append(1)wordList=textParse(open(email/ham/%d.txt%i).read()docList.append(wordList)fullText.extend(wordList)classList.append(0)vocabList=createVocabList(docList)trainingSet=range(50)
21、;testSet=for i in range(10):#随机构建训练集randIndex=int(random.uniform(0,len(trainingSet)testSet.append(trainingSetrandIndex)#随机挑选一个文档索引号放入测试集del(trainingSetrandIndex)#将该文档索引号从训练集中剔除trainMat=;trainClasses=for docIndex in trainingSet:trainMat.append(setOfWords2Vec(vocabList,docListdocIndex)trainClasses.app
22、end(classListdocIndex)p0V,p1V,pSpam=trainNB0(array(trainMat),array(trainClasses)errorCount=0for docIndex in testSet:#对测试集进行分类wordVector=setOfWords2Vec(vocabList,docListdocIndex)if classifyNB(array(wordVector),p0V,p1V,pSpam)!=classListdocIndex:errorCount+=1print the error rate is:,float(errorCount)/len(testSet)