ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【老计带你懂AI算法】06:朴素贝叶斯,用概率算一算,垃圾邮件过滤的老功臣

【老计带你懂AI算法】06:朴素贝叶斯,用概率算一算,垃圾邮件过滤的老功臣 【老计带你懂AI算法】06朴素贝叶斯用概率算一算垃圾邮件过滤的老功臣开头一个靠算概率吃饭的分类器前面几篇的分类器各有各的招逻辑回归压概率、决策树分叉、SVM找间隔、KNN看邻居。这一篇的朴素贝叶斯又是一条完全不同的路子它靠算概率来判断。它最有名的战绩就是垃圾邮件过滤。早年的邮箱能自动把垃圾邮件挑出来背后很多就是朴素贝叶斯在干活。直到今天它在文本分类判断一段文字是什么主题、什么情感、是不是垃圾内容上仍然是又快又好用的常青树。这个模型有意思的地方在于它的核心思想贝叶斯定理其实是几百年前的一个数学结论被拿来做机器学习效果却出奇地好。而且它有个大胆到有点天真的假设朴素这个名字就是从这来的。我们一步步讲清楚。先讲个直觉看到线索反推可能性朴素贝叶斯的核心是一种特别符合人类直觉的推理方式看到一些线索反过来推断某件事的可能性。举个生活例子。你收到一封邮件标题里带着中奖“免费”立即领取这些词。你几乎立刻就会犯嘀咕这多半是垃圾邮件。你脑子里其实做了这么个推理根据我以前的经验垃圾邮件里特别爱出现这些词现在这封邮件恰好一堆这种词那它是垃圾邮件的可能性就很大。你是从出现了什么词这个线索反推它是不是垃圾邮件这个结论。这就是贝叶斯思想的精髓用已知的经验垃圾邮件里各种词出现的规律结合眼前观察到的线索这封邮件里有哪些词来更新对某件事的判断它是不是垃圾邮件。朴素贝叶斯就是把这套人人都会的推理用概率精确地算出来。贝叶斯定理把这套推理变成公式但不吓人支撑这套推理的数学叫贝叶斯定理。我不堆公式用大白话讲清它在算什么。它要算的是在看到了这些词的前提下这封邮件是垃圾邮件的概率有多大。为了算这个它反过来用几样容易统计的东西垃圾邮件本身有多常见比如历史上收到的邮件里三成是垃圾邮件这叫先验概率是没看内容前的初始判断。垃圾邮件里这些词各自有多爱出现比如中奖这个词在垃圾邮件里出现的频率很高在正常邮件里很低。贝叶斯定理干的事就是把垃圾邮件本来有多常见和垃圾邮件里这些词有多爱出现这两样一综合反算出看到这些词后它是垃圾邮件的概率。然后它同样算一遍是正常邮件的概率两个一比哪个大就判成哪类。这里有个特别重要、也特别实用的点先验概率。哪怕你还没看邮件内容光凭垃圾邮件本来就占三成这个背景知识你心里就有个初始判断了。看到内容里的词只是在这个初始判断上做修正。这种先有个底、再根据证据调整的思路是贝叶斯方法最迷人的地方也很符合人的认知习惯。朴素在哪一个天真但好用的假设那朴素到底朴素在哪问题在于一封邮件里有很多词这些词之间其实是有关联的。比如免费和领取经常一起出现。要精确计算它们组合起来的概率非常复杂词一多就算不动了。朴素贝叶斯干脆一拍脑袋做了个大胆的简化假设假设每个词的出现都是互相独立、互不影响的。也就是说它假装免费出现不出现跟领取出现不出现毫无关系各算各的最后简单相乘。这个假设显然是不符合现实的词当然有关联所以它很天真、很朴素。可神奇的是就算这个假设不成立朴素贝叶斯在实践中的效果依然出奇地好尤其在文本分类上。为什么因为分类要的只是哪个类别的概率更大这个相对结果而不是精确的概率值。就算每个词的概率算得不那么准只要不影响最后谁大谁小的判断分类结果照样对。这就是朴素贝叶斯给我们的一个重要启发一个理论上不完美、甚至假设错误的模型在实践中依然可能非常有用。工程上很多时候够用、够快、够简单比理论上完美更重要。顺便说个能拓宽视野的点贝叶斯这套先有个初始判断再根据新证据不断修正的思想远不止用在这一个模型上它是一整套看待世界的方法论。医生看病就是典型的贝叶斯过程先根据经验有个初步怀疑先验做了检查看到结果证据再修正诊断后验侦探破案、投资决策、甚至我们日常判断一个人靠不靠谱都在不自觉地用这套推理看到新信息就更新看法。在AI领域贝叶斯思想还衍生出贝叶斯网络、贝叶斯优化自动调参的一种主流方法等一大家子方法。理解了朴素贝叶斯你其实是摸到了一种极其通用的推理范式的门槛这比记住这一个模型本身更有价值。输入和输出长什么样输入一段段文本比如一封封邮件、一条条评论通常先转成词频这种数值形式每个词出现了几次变成模型能吃的特征。输出类别垃圾/正常、正面/负面等也能给出属于每个类别的概率。朴素贝叶斯特别适合处理高维稀疏的文本特征词表可能有几万个词但一封邮件只出现其中很少一部分这也是它在文本领域吃香的原因。上代码一个迷你垃圾邮件分类器用sklearn做一个文本分类。输入几条短信文本。输出垃圾/正常以及概率。# 依赖pip install scikit-learnfromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.naive_bayesimportMultinomialNBfromsklearn.pipelineimportmake_pipeline# 造一份迷你训练数据短信文本 标签(1垃圾, 0正常)texts[恭喜中奖 免费领取大奖 立即点击,限时免费 领取优惠券 手慢无,点击链接 领取现金红包 中奖名额有限,明天下午开会 记得带上项目文档,妈 我周末回家吃饭 你别太累,会议纪要已发你邮箱 请查收确认,]labels[1,1,1,0,0,0]# CountVectorizer把中文文本按空格切成词、转成词频向量; MultinomialNB是适合词频的朴素贝叶斯modelmake_pipeline(CountVectorizer(),MultinomialNB())model.fit(texts,labels)# 训练:统计各词在两类里的出现规律# 预测两条新短信new[免费领取 中奖大礼包 立即点击,晚上一起吃饭吗 老地方见]predmodel.predict(new)probamodel.predict_proba(new)fort,p,prinzip(new,pred,proba):print(f文本:{t})print(f 判定:{垃圾ifp1else正常}(垃圾概率{pr[1]:.2f}))运行输出示例文本: 免费领取 中奖大礼包 立即点击 判定: 垃圾 (垃圾概率0.87) 文本: 晚上一起吃饭吗 老地方见 判定: 正常 (垃圾概率0.18)运行你会看到满是免费/中奖/点击的那条被判成垃圾且概率很高聊吃饭的那条判成正常。注意真实场景里中文要先用分词工具如jieba切词这里为了演示直接用空格分好了词。这段代码完整展示了文本分类的标准流程文本转词频、训练、预测、看概率。关键参数与一个必知的坑朴素贝叶斯参数很少但有个坑必须知道零概率问题以及它的解药平滑。想象一个词在训练数据的垃圾邮件里从没出现过。那按统计它在垃圾邮件里的出现概率就是零。而朴素贝叶斯是把各词概率相乘的一旦有个零整个乘积就变成零了一个没见过的词就能把整个判断带偏太脆弱了。解药叫拉普拉斯平滑给每个词的计数都先加上一个小小的数比如1这样就没有哪个词的概率是绝对的零了。sklearn里这个参数叫alpha默认就是1即默认开了平滑。这个给没见过的情况留一点点余地的平滑思想在很多概率模型里都会用到值得记住。朴素贝叶斯还有个在工程上很讨喜的特性值得一提它天生支持增量学习也叫在线学习。意思是它不需要每次来了新数据就把所有历史数据翻出来从头训练一遍而是可以在已有的统计基础上把新数据的词频加进去就完成了更新。这对垃圾邮件过滤这种场景太合适了因为垃圾邮件的花样天天在变模型需要不断吸收新样本、快速适应而朴素贝叶斯更新起来几乎零成本。sklearn里对应的是partial_fit方法。很多又重又强的模型做不到这种轻量的持续更新这也是朴素贝叶斯历经这么多年、在实时性要求高的场景里依然活跃的原因之一它简单但简单得恰到好处。优缺点与适用场景优点快、省资源训练和预测都极快就是数数和乘除能处理海量文本。在文本分类上效果好尤其数据量不大时常常不输复杂模型。对高维稀疏数据友好天生适合词表巨大的文本。简单、好实现、需要的训练数据也不算多。缺点那个各特征独立的朴素假设在特征强相关时会拖累效果。主要用于文本这类离散特征处理连续数值特征时不如树模型灵活虽然有高斯朴素贝叶斯变体。适合场景文本分类垃圾邮件、情感分析、新闻分类、需要极快速度和轻量部署、想要一个简单又不差的文本基线。不适合特征间强相关、需要精细捕捉特征交互的复杂任务。这里也说一句它和其他模型的关系帮你放进全局里理解。做文本分类朴素贝叶斯常常是那个先跑起来的基线简单快速、还不差如果追求更高精度、数据也够可以再上逻辑回归、SVM甚至后面要讲的深度学习模型如今做文本一线基本是BERT这类预训练模型的天下。但朴素贝叶斯的价值恰恰在于它的轻在算力受限、要求实时、或者只是想快速验证一个想法时它依然是顺手好用的第一选择。记住这个定位你就不会纠结都有大模型了还学它干嘛工具箱里有把趁手的小刀和有台重型机床是不冲突的两回事。小结与承上启下朴素贝叶斯用贝叶斯思想看到线索反推可能性结合先验概率和各词出现规律算出属于每类的概率来分类思路清晰又轻巧。朴素在哪假设各特征独立天真但实用理论不完美不妨碍它好用。必知的坑零概率问题用拉普拉斯平滑解决。选型文本分类的又快又好的常青树特征强相关时不占优。到这里传统机器学习里最主流的分类和回归模型线性、树、集成、间隔、近邻、概率就讲全了。它们有个共同点都需要你事先给数据打好标签这是垃圾邮件、那不是。可现实里很多数据是没有标签的一大堆用户、一大堆数据怎么自动分出群体下一篇我们进入无监督学习的世界讲聚类让机器自己把数据分堆。我们下一篇见一起看机器怎么无师自通地把数据分堆。延伸阅读scikit-learn 官方文档朴素贝叶斯https://scikit-learn.org/stable/modules/naive_bayes.htmlscikit-learn 官方文档文本特征提取CountVectorizer等https://scikit-learn.org/stable/modules/feature_extraction.html说明以上为官方公开文档地址可能随版本调整如打不开可用标题搜索。
返回列表