当前位置: 首页 > article >正文

AI学习-朴素贝叶斯垃圾邮件识别:从理论到实现

朴素贝叶斯垃圾邮件识别从理论到实现摘要本文从理论推导角度完整解释朴素贝叶斯模型做垃圾邮件识别的可行性包括为什么文字需要向量化、贝叶斯公式如何推导出分类规则、朴素假设为什么不严格但仍然好用、训练集拆分的细节以及这套流程是否适用于其他分类任务。一、问题定义给定一封邮件判断它是垃圾邮件spam还是正常邮件ham。预期行为输入一段文字模型输出一个判断以及对应的置信度。输入: Win FREE money now, click here! 输出: 垃圾邮件置信度 97%二、为什么需要向量化模型的本质是数学运算无法直接处理文字。向量化的作用是把文字转换成数字。最常用的方式是词频向量CountVectorizer统计训练集里出现过的所有词构建一个词汇表然后用每封邮件里各词出现的次数表示这封邮件。词汇表: [click, free, hello, money, win, ...] ↓ Win FREE money → [1, 1, 0, 1, 1, ...] Hello, how are you → [0, 0, 1, 0, 0, ...]每封邮件变成一个数字数组模型才能进行计算。关键细节vectorizer.fit_transform(X_train)和vectorizer.transform(X_test)是两个不同的步骤。fit_transform在训练集上学习词汇表同时完成转换transform用已经学好的词汇表转换新数据不重新学习测试集和预测时只能用transform否则词汇表不一致模型就失效了。三、标签映射结果同样需要数字化df[label_num]df[label].map({spam:1,ham:0})训练集里每封邮件都有正确答案0 或 1模型在训练时以此为目标反复调整参数。理论上在训练集上准确率应该接近 100%因为模型见过这些数据相当于对着答案学习。真正衡量模型好坏的是测试集上的准确率——在没见过的数据上表现如何才能说明模型真正学到了规律。四、贝叶斯公式推导4.1 我们想要什么给定邮件内容计算它是垃圾邮件的概率P(spam | win free money) ← 这封邮件是垃圾邮件的概率 P(ham | win free money) ← 这封邮件是正常邮件的概率 比大小谁大判谁4.2 贝叶斯公式直接计算P(spam | 邮件)很难但可以用贝叶斯公式翻转条件P(spam | 邮件) P(邮件 | spam) × P(spam) ───────────────────────── P(邮件)三个部分分别是符号名称含义怎么得到P(spam)先验概率训练集里垃圾邮件占比直接统计P(邮件|spam)似然假设是垃圾邮件这些词同时出现的概率统计各词频率P(邮件)证据这组词在所有邮件里出现的概率对两类都一样可以消掉4.3 消掉分母比较 spam 和 ham 时分母P(邮件)对两边完全一样比大小时可以直接消掉比较: P(spam) × P(邮件|spam) vs P(ham) × P(邮件|ham) 谁大判谁结论和除以相同分母后完全一致五、朴素假设5.1 假设内容P(邮件|spam)是多个词同时出现的联合概率严格计算应该是P(win 且 free 且 money | spam) P(win|spam) × P(free|spam, win已出现) × P(money|spam, win和free已出现)朴素贝叶斯直接假设每个词独立无视词与词之间的关联P(win free money | spam) ≈ P(win|spam) × P(free|spam) × P(money|spam)5.2 假设成不成立严格来说不成立。free和money同时出现的概率显然高于各自独立出现概率的乘积它们之间有关联。5.3 为什么还能用我们不需要概率值精确只需要比大小只要: P(spam) × ∏P(词|spam) P(ham) × ∏P(词|ham) 分类结果就是正确的中间的计算误差不影响最终判断实验结果也证明了这点垃圾邮件分类准确率能稳定达到 98% 以上朴素假设够用。5.4 对数处理防止下溢实际代码里不直接连乘而是取对数原始连乘会下溢变成 0: 0.134 × 0.0234 × 0.0456 × 0.0289 × ... 0.000000000000001 取对数加法不会下溢: log(0.134) log(0.0234) log(0.0456) log(0.0289) ... -2.01 (-3.75) (-3.09) (-3.54) ... -12.39对数是单调递增函数两边同时取对数不改变大小关系结论完全一致。六、置信度是怎么来的model.predict_proba()输出的不是原始贝叶斯后验概率而是经过归一化的结果原始值: P(spam|邮件) 0.0000041 P(ham|邮件) 0.000000000008 归一化强制两者加起来等于 1: 置信度(spam) 0.0000041 / (0.0000041 0.000000000008) ≈ 0.9999 置信度(ham) 1 - 0.9999 ≈ 0.0001置信度的含义在 spam 和 ham 两种可能里模型更倾向哪一边以及倾向程度有多强。注意置信度高不代表模型一定对只代表模型很确定。模型可能非常自信地判断错了这种情况在训练数据不平衡或者样本很罕见时会出现。七、训练集拆分7.1 为什么要拆分如果用同一批数据训练和评估模型相当于对着答案学习再对着答案考试准确率虚高无法反映真实能力。拆分后训练集80%模型学习规律测试集20%模拟真实场景评估模型在没见过的数据上的表现7.2random_state42是什么X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42# ← 这个参数)拆分时需要随机打乱数据再切割random_state是随机数种子——固定种子每次运行得到完全相同的拆分结果。random_state4242 本身没有特殊含义只是约定俗成的写法来自《银河系漫游指南》里宇宙终极答案是 42的梗不设置此参数每次运行拆分结果不同准确率数字会变动难以复现和对比团队协作时统一random_state值保证大家在相同数据上做实验7.3 拆分的实际过程原始数据 5572 条 ↓ 随机打乱顺序按 random_state42 的规则 ↓ 前 80% → 训练集4457 条 ↓ 后 20% → 测试集1115 条测试集在整个训练过程中模型完全看不到只在最后评估时用一次。八、这套流程是否通用是的这是监督学习分类任务的标准流程换数据就能做不同的事。原始数据文字/图片/数字 ↓ 特征工程向量化/归一化/编码 ↓ 训练集/测试集拆分 ↓ 选择模型朴素贝叶斯/逻辑回归/随机森林/神经网络 ↓ 训练model.fit ↓ 预测model.predict ↓ 评估准确率/精确率/召回率同一套框架换数据集能做的事换成什么数据能做什么电商评论好评/差评情感分析新闻文章政治/科技/体育文本分类用户行为日志流失/留存用户流失预测医疗指标患病/健康疾病风险预测金融交易记录欺诈/正常欺诈检测不同任务之间的差别主要在特征工程文本用 CountVectorizer图片用像素值表格数据可能需要处理缺失值和类别编码模型选择文本分类朴素贝叶斯/SVM 效果好图像分类用 CNN表格数据用随机森林/XGBoost核心流程完全一致。九、完整推导回顾目标: 判断 Win FREE money 是 spam 还是 ham Step 1 向量化 Win FREE money → [1, 1, 0, 1, 1, 0, ...] Step 2 计算先验概率从训练集统计 P(spam) 747 / 5572 0.134 P(ham) 4825 / 5572 0.866 Step 3 计算似然朴素假设各词独立 P(win|spam) 0.0234, P(win|ham) 0.0003 P(free|spam) 0.0456, P(free|ham) 0.0001 P(money|spam) 0.0289, P(money|ham) 0.0003 Step 4 取对数计算得分 score(spam) log(0.134) log(0.0234) log(0.0456) log(0.0289) -12.8 score(ham) log(0.866) log(0.0003) log(0.0001) log(0.0003) -29.6 Step 5 比大小 -12.8 -29.6 → spam 得分更高 → 判定为垃圾邮件 Step 6 归一化输出置信度 置信度(spam) ≈ 97%十、问题fit_transform 和 transform 的区别fit 做的事情就是建词汇表扫描所有训练集文本把出现过的词收集起来给每个词分配一个固定的索引位置。训练集: Win FREE money Hello how are you Click here FREE prize fit 之后建立的词汇表: { are: 0, click: 1, free: 2, hello: 3, here: 4, how: 5, money: 6, prize: 7, win: 8, you: 9 } transform 做的是按已有词汇表把文本转成向量不修改词汇表。 所以 fit_transform先建词汇表再转换只能在训练集上用 transform直接用已有词汇表转换测试集和新数据用这个 直接忽略不报错不影响其他词。遇到没见过的词怎么办比如训练时没有 “lottery” 这个词predict_spam(“Win FREE lottery money”)向量化结果lottery 对应的列根本不存在直接跳过只保留词汇表里有的: win, free, money这是合理的处理方式——模型对没见过的词一无所知与其猜测不如忽略。代价是信息有损失但不会崩溃。词汇表里的词是唯一的邮件怎么向量化词汇表里每个词只出现一次每个词对应向量里的一个位置。向量的长度 词汇表的大小每个位置存的是这个词在这封邮件里出现的次数。具体示例“free free” 的情况词汇表简化版只用5个词: {click: 0, free: 1, hello: 2, money: 3, win: 4} 索引位置: 0 1 2 3 4 三封邮件的向量化结果 click free hello money win free free → [ 0, 2, 0, 0, 0 ] ← free出现2次索引1位置填2 win free money → [ 0, 1, 0, 1, 1 ] hello → [ 0, 0, 1, 0, 0 ] 所以你的理解是对的free free 对应的那个位置会是 2。 用代码验证一下 python from sklearn.feature_extraction.text import CountVectorizer corpus [ Win FREE money, Hello how are you, Click here FREE prize ] vectorizer CountVectorizer() X vectorizer.fit_transform(corpus) # 查看词汇表 print(vectorizer.vocabulary_) # {win: 8, free: 2, money: 6, hello: 3, ...} # 查看矩阵 print(X.toarray()) # 每一行是一封邮件每一列是一个词的出现次数 # 测试 free free test vectorizer.transform([free free]) print(test.toarray()) # [[0, 2, 0, 0, 0, 0, 0, 0, 0, 0]] # ↑ 索引2(free)位置是2在 Jupyter 里跑一下这段把词汇表和矩阵都打印出来看比文字描述直观很多。参考资料scikit-learn MultinomialNB 文档scikit-learn CountVectorizer 文档SMS Spam Collection 数据集

相关文章:

AI学习-朴素贝叶斯垃圾邮件识别:从理论到实现

朴素贝叶斯垃圾邮件识别:从理论到实现 摘要 本文从理论推导角度,完整解释朴素贝叶斯模型做垃圾邮件识别的可行性,包括:为什么文字需要向量化、贝叶斯公式如何推导出分类规则、"朴素"假设为什么不严格但仍然好用、训练…...

终极指南:3分钟掌握跨平台网络资源下载神器res-downloader

终极指南:3分钟掌握跨平台网络资源下载神器res-downloader 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为…...

机器学习——聚类评价指标SSE、SC、CH演示案例

一.评价指标简介SSE考虑了簇内因素SSE越越小越好SSE+肘部法常用来确定聚类的最佳K值SC轮廓系数法考虑了簇内和簇间因素,数值越大越好CH考虑簇内,簇间以及K值因素,数值越大越好二.代码部分详解1.SSE+肘部法#1.演示SSE&a…...

5分钟掌握OpenTracks:隐私优先的开源运动跟踪应用全面指南

5分钟掌握OpenTracks:隐私优先的开源运动跟踪应用全面指南 【免费下载链接】OpenTracks Repository moved to: https://codeberg.org/OpenTracksApp/OpenTracks 项目地址: https://gitcode.com/gh_mirrors/op/OpenTracks 你是否厌倦了那些不断要求网络权限、…...

Taotoken官方折扣活动如何帮助开发者降低大模型使用门槛

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken官方折扣活动如何帮助开发者降低大模型使用门槛 对于个人开发者和学生群体而言,探索和应用大模型技术时&#…...

通过 TaoToken 统一网关体验不同主流模型的生成效果差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 TaoToken 统一网关体验不同主流模型的生成效果差异 1. 引言:统一接口下的模型体验 在构建基于大语言模型的应用时…...

AI调用BurpSuite实现可审计漏洞检测闭环

1. 这不是“AI安全工具”的营销话术,而是一套可落地的漏洞发现流水线最近帮一家做金融SaaS的客户做渗透测试流程优化,他们原来的方案是:每周安排2名中级渗透工程师,用BurpSuite手动跑一遍核心业务流,再人工翻看Proxy历…...

AI模型连接失败的四大根源与10分钟排查指南

1. 这不是网络问题,是连接逻辑没对上“模型连接失败”这六个字,几乎每个刚接触AI开发的新手都见过——在本地跑通了代码,调用OpenAI或国内大模型API时突然卡在requests.exceptions.ConnectionError,或者返回一串看不懂的401 Unaut…...

Qwen-Image-2512+LoRA:构建Godot原生像素素材生成管线

1. 这不是“AI画图”,而是一次像素艺术工作流的底层重写你有没有试过在Godot 4.x里导入一张用Qwen-VL或Stable Diffusion生成的“像素风”图?放大一看——边缘糊成一团,颜色溢出格子,连88的精灵都对不齐网格。我去年帮一个独立游戏…...

LivePortrait技术突破:企业级肖像动画生成与部署实战指南

LivePortrait技术突破:企业级肖像动画生成与部署实战指南 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 从静态到动态:如何用AI技术让肖像"活"起来 在数字…...

FTP明文传输风险与Wireshark抓包实证分析

1. 这不是危言耸听:FTP 的“裸奔”现状每天都在发生你有没有在公司内网用过 FTP 上传一份财务报表?有没有在校园网里用 FileZilla 向老师提交课程设计源码?有没有在运维后台用 ftp 命令同步过网站静态资源?如果答案是肯定的&#…...

初步认识假设检验

下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文6102字) 2篇3章3节:从案例中认识假设检验_认识参数假设检验-CSDN博客 假设检验是统计学中一种用于判断数据是否支持某一特定假设的常用方法。在数据分析中,假设检验…...

中国开源大模型工程化实践:从数据治理到企业落地

1. 项目概述:一场被误读为“军备竞赛”的开源模型战略博弈“TAI #159”这个编号本身就像一个行业内部的暗号——它指向的不是某款具体产品,而是一期深度技术简报的核心议题:当全球AI格局进入新阶段,中国开源大模型生态的系统性突围…...

如何快速构建数学可视化:Manim交互式开发完整教程

如何快速构建数学可视化:Manim交互式开发完整教程 【免费下载链接】manim Animation engine for explanatory math videos 项目地址: https://gitcode.com/GitHub_Trending/ma/manim 想要告别数学动画制作中反复修改代码、重新渲染的烦恼吗?&…...

OpenSpeedy:开源游戏加速神器,彻底告别卡顿体验

OpenSpeedy:开源游戏加速神器,彻底告别卡顿体验 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 还在为游戏中的卡顿、掉帧和加载缓慢而烦恼吗&#xf…...

CV产线MLOps平台:图像原生处理与硬件感知交付

1. 项目概述:这不是又一个“模型训练平台”,而是一套能真正跑通CV产线的MLOps工作流“Streamline Your Computer Vision Stack with an End-to-End MLOps Platform”——这个标题里藏着三个被太多团队长期忽视的关键事实:第一,“C…...

Triton模型服务化实战:从Notebook到高可用推理API

1. 项目概述:这不是一次模型训练,而是一场工程交付“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着一个被太多人轻描淡写、却让无数团队在临门一脚时彻底卡死的真相:Notebook 是思考的草稿纸&…...

Akamai通用版边缘认证参数固化与SHA256签名还原

1. 这不是“破解”,而是对Akamai边缘认证机制的一次系统性拆解你有没有遇到过这样的情况:写好一个爬虫,目标网站明明没上WAF、也没用Cloudflare,但一发请求就返回403,Header里还带着x-akamai-session-info这种神秘书码…...

AI Agent自主操作软件的“最后一公里”危机:当它成功调用API却误删生产数据库——12个真实事故根因与防御性沙箱配置模板

更多请点击: https://codechina.net 第一章:AI Agent自主操作软件的“最后一公里”危机本质 当AI Agent在模拟环境中流畅调用API、生成SQL、解析PDF时,它却在真实办公桌面前频频卡壳——点击错按钮、误判窗口焦点、无法处理弹窗验证码、对非…...

【限时公开】华为昇腾+寒武纪MLU双平台AI Agent边缘部署Checklist(含功耗约束下模型剪枝精度损失≤0.3%的黄金参数表)

更多请点击: https://intelliparadigm.com 第一章:AI Agent边缘计算应用 AI Agent在边缘计算场景中正从“云端智能”转向“端侧自治”,通过轻量化模型部署、本地决策闭环与低延迟响应,显著提升工业质检、智能安防、车载感知等实时…...

FModel实战指南:UE4/5游戏pak资源提取与3D模型导出

1. 为什么是FModel?——当UE4/5游戏资源提取变成“开箱即用”的工程问题你刚下载完《堡垒之夜》最新赛季的离线安装包,或者拿到一份《黑神话:悟空》的测试版本地资源目录,双击打开后只看到一堆命名像WindowsNoEditor.pak、Content…...

Agent驱动的机器学习 pipeline 全链路拆解,深度解析LLM+ML协同训练的4大范式演进

更多请点击: https://codechina.net 第一章:Agent驱动的机器学习 pipeline 全链路拆解,深度解析LLMML协同训练的4大范式演进 Agent驱动的机器学习 pipeline 正在重构传统ML工程范式——它不再将数据预处理、特征工程、模型训练与部署割裂为静…...

Unity WebGL文本输入解决方案:WebGLInput原理与集成指南

1. 为什么Unity WebGL的文本输入让人反复抓狂“WebGL平台不能打字”——这句话在Unity开发者社区里出现的频率,几乎和“打包报错”“内存泄漏”一样高。我第一次遇到这个问题是在2021年,给一个教育类Web应用做跨平台迁移:iOS和Android端的Inp…...

AI Agent驱动的管理咨询实战手册(麦肯锡/BCG未公开方法论首次披露)

更多请点击: https://intelliparadigm.com 第一章:AI Agent驱动的管理咨询范式革命 传统管理咨询依赖专家经验、手工访谈与静态模型,响应周期长、知识复用率低、规模化交付困难。AI Agent 的崛起正从根本上重构这一价值链——它不再是辅助工…...

GPU选型实战指南:TFLOPS、VRAM、HBM与NVLink的工程真相

1. 为什么我花三周重读了A100规格表——一个AI工程师的GPU认知重建实录刚入行那会儿,我买显卡全靠TFLOPS数字大小排序。看到RTX 4090标称82.6 TFLOPS,立刻下单;后来做模型训练,发现A100的FP16算力只有312 TFLOPS,却比4…...

企业从 Excel 管理转向系统化管理的关键步骤

企业从 Excel 管理转向系统化管理的关键步骤 几乎每家中小企业都经历过 Excel 管理阶段。客户表、合同表、项目表、库存表、资产表、员工表、回款表,一个个表格撑起了企业早期管理。Excel 的优势很明显:灵活、低成本、人人会用。 但企业规模一旦扩大&…...

零基础30天掌握渗透测试实战路径

1. 别被“渗透测试”四个字吓住:它本质是“合法授权的系统体检”很多人第一次看到“渗透测试”这个词,脑子里立刻浮现出黑客电影里飞速滚动的代码、黑底绿字的终端、戴着兜帽在咖啡馆敲键盘的神秘人——这种刻板印象害了不少想入门的朋友。我带过三十多个…...

渗透测试小白上手指南:系统化故障排查能力迁移手册

1. 别被“渗透测试”四个字吓住:它本质是系统化的故障排查能力很多人第一次听说“渗透测试”,脑子里立刻浮现出黑客电影里飞速滚动的代码、黑底绿字的终端、几秒钟攻破银行防火墙的炫酷场面。结果一搜学习资料,满屏都是“Kali Linux”“Metas…...

Rshell框架实战:红队内网渗透的信道管理与双平台协同

1. 这不是“教你怎么黑”,而是还原一次真实红队作业的完整切片Rshell框架——这个名字在渗透测试圈子里不算陌生,但真正把它用透、用稳、用出生产级效果的人,远比想象中少。我见过太多人把Rshell当成一个“带图形界面的msfvenomnc组合包”&am…...

Hurley:C#到裸机C的语义重铸编译器

1. 这不是代码转换器,而是一台“语义重铸机”你有没有试过把一段写得工整、泛型丰富、LINQ链式调用如行云流水的C#代码,硬生生塞进一个只认int main()和malloc的嵌入式环境?我去年在给某款国产工业PLC做边缘协议适配时就撞上了这堵墙&#xf…...