AI 术语通俗词典:朴素贝叶斯
朴素贝叶斯是机器学习、概率分类、文本分类和人工智能中非常经典的一个术语。它用来描述一种基于贝叶斯定理进行分类的方法。换句话说朴素贝叶斯是在回答看到一个样本的若干特征之后怎样根据概率判断它最可能属于哪一类。如果说贝叶斯定理回答的是“看到证据之后如何更新对某个假设的判断”那么朴素贝叶斯回答的就是“看到一组特征之后如何判断样本属于哪个类别”。因此朴素贝叶斯常用于垃圾邮件识别、文本分类、情感分析、新闻分类、疾病初筛和简单概率分类任务在人工智能中具有重要基础意义。一、基本概念什么是朴素贝叶斯朴素贝叶斯Naive Bayes是一类基于贝叶斯定理的分类算法。它的核心思想是根据样本特征计算它属于各个类别的概率然后选择概率最大的类别。假设一个样本有多个特征类别为朴素贝叶斯希望计算其中• y 表示类别• x₁, x₂, …, xₙ 表示样本特征• P(y | x₁, x₂, …, xₙ) 表示在观察到这些特征后样本属于类别 y 的概率分类时模型会选择后验概率最大的类别其中• ŷ 表示模型预测类别• argmax 表示选择使概率最大的类别从通俗角度看朴素贝叶斯可以理解为先看每个类别本来有多常见再看当前这些特征有多支持每个类别最后选择综合概率最高的类别。例如在垃圾邮件识别中如果一封邮件中出现“中奖”“免费”“立即领取”等词这些词在垃圾邮件中经常出现而在正常邮件中很少出现那么模型就会提高这封邮件属于垃圾邮件的概率。二、为什么叫“朴素”贝叶斯朴素贝叶斯之所以叫“朴素”不是因为它不重要而是因为它做了一个非常强的简化假设在给定类别的条件下各个特征之间相互独立。这叫做条件独立假设。贝叶斯定理可以写为其中• P(y | x₁, x₂, …, xₙ) 表示后验概率• P(y) 表示类别 y 的先验概率• P(x₁, x₂, …, xₙ | y) 表示在类别 y 下同时观察到这些特征的概率• P(x₁, x₂, …, xₙ) 表示这些特征整体出现的概率问题在于通常很难直接估计。因为特征可能很多而且特征之间可能存在复杂关系。朴素贝叶斯为了简化计算假设在类别 y 已知的情况下各个特征相互独立于是分类规则可以写为从通俗角度看朴素贝叶斯是在说判断类别时把每个特征看作独立证据然后把这些证据对类别的支持程度乘起来。例如在垃圾邮件识别中模型可能把“免费”“中奖”“链接”这些词看作相对独立的证据。虽然现实中这些词之间可能有关联但这种简化能让模型计算非常高效。这就是“朴素”的含义它用一个很强的独立性假设换来了简单、快速、有效的分类方法。三、朴素贝叶斯的核心公式朴素贝叶斯的分类公式来自贝叶斯定理。对于类别 y 和特征 x贝叶斯定理为如果样本有多个特征则有分类时我们比较不同类别 y 的后验概率。由于分母对所有类别都是相同的所以可以忽略它只比较分子再根据条件独立假设因此朴素贝叶斯的分类规则为其中• P(y) 表示类别 y 的先验概率• P(xᵢ | y) 表示在类别 y 下第 i 个特征出现或取某个值的概率• ∏ 表示连乘• ŷ 表示预测类别从通俗角度看这个公式的含义是一个类别最终得分 这个类别本身的常见程度 × 每个特征对这个类别的支持程度。如果某个类别本身很常见而且当前特征也很符合这个类别那么它的后验概率就会较高。四、如何直观理解朴素贝叶斯朴素贝叶斯最核心的直觉是把每个特征都看成一条证据然后综合这些证据判断类别。例如要判断一封邮件是否为垃圾邮件。假设邮件中出现了几个词免费、中奖、点击、链接对于“垃圾邮件”这个类别模型会问• 垃圾邮件中出现“免费”的概率有多大• 垃圾邮件中出现“中奖”的概率有多大• 垃圾邮件中出现“点击”的概率有多大• 垃圾邮件中出现“链接”的概率有多大同时它也会问• 正常邮件中出现这些词的概率有多大如果这些词在垃圾邮件中很常见而在正常邮件中较少出现那么模型就会倾向于判断该邮件是垃圾邮件。从通俗角度看朴素贝叶斯像是在做证据投票• “免费” 支持垃圾邮件• “中奖” 支持垃圾邮件• “点击链接” 支持垃圾邮件这些证据一起出现时垃圾邮件的概率就会提高。不过它不是简单地数词而是根据训练数据估计词语类别也就是某个类别下出现某个特征的概率。因此朴素贝叶斯是一种概率分类方法而不是简单的关键词匹配规则。五、朴素贝叶斯的三种常见类型朴素贝叶斯不是单一模型而是一类模型。不同类型适合不同形式的数据。1、高斯朴素贝叶斯高斯朴素贝叶斯Gaussian Naive Bayes适合连续数值特征。它假设每个特征在某个类别下服从正态分布其中• xᵢ 表示第 i 个特征• y 表示类别• μᵢᵧ 表示类别 y 下第 i 个特征的均值• σᵢᵧ² 表示类别 y 下第 i 个特征的方差• 表示正态分布从通俗角度看高斯朴素贝叶斯认为在每个类别内部数值特征大致围绕某个平均水平上下波动。例如在葡萄酒分类中不同类别的葡萄酒在酒精含量、酸度、颜色强度等数值特征上可能有不同分布。2、多项式朴素贝叶斯多项式朴素贝叶斯Multinomial Naive Bayes常用于计数型特征特别是文本分类。例如一篇文章可以表示为词频向量苹果: 3 次手机: 5 次价格: 2 次发布: 1 次多项式朴素贝叶斯关注的是在某个类别下不同词语出现的次数或频率。它常用于• 垃圾邮件识别• 新闻分类• 文本主题分类• 情感分析从通俗角度看多项式朴素贝叶斯适合处理某些词出现了多少次。3、伯努利朴素贝叶斯伯努利朴素贝叶斯Bernoulli Naive Bayes适合二值特征。例如在文本分类中它不关心某个词出现了几次只关心某个词是否出现.可以表示为• 出现 1• 未出现 0从通俗角度看多项式朴素贝叶斯关心“出现几次”伯努利朴素贝叶斯关心“有没有出现”。例如• 多项式朴素贝叶斯词语“免费”出现了 4 次• 伯努利朴素贝叶斯词语“免费”是否出现过这两种方法都常用于文本任务但适用的数据表示方式不同。六、朴素贝叶斯中的平滑问题朴素贝叶斯在实际使用中经常需要处理一个问题如果某个特征在某个类别中从未出现过概率会变成 0。例如在垃圾邮件训练集中“优惠券”这个词从未出现在正常邮件中那么模型可能估计优惠券正常邮件如果一封邮件中出现“优惠券”那么正常邮件类别的整体概率会乘以 0这会导致模型过于绝对。为了解决这个问题通常使用拉普拉斯平滑Laplace Smoothing。对于词语 w 和类别 c可以写为其中• count(w, c) 表示词语 w 在类别 c 中出现的次数• α 表示平滑参数常取 1• |V| 表示词表大小• Σ count(w′, c) 表示类别 c 中所有词语的总出现次数拉普拉斯平滑的核心思想是即使某个词在训练集中没有出现也不要认为它的概率绝对为 0而是给它一个很小的非零概率。从通俗角度看训练集中没见过不代表现实中不可能出现。这使朴素贝叶斯在处理文本分类时更加稳健。七、朴素贝叶斯的优势、局限与使用注意事项1、朴素贝叶斯的主要优势朴素贝叶斯最大的优势是简单、高效。它训练速度快预测速度也快特别适合高维稀疏特征例如文本词频矩阵。其次它对小数据集也比较友好。在样本不多时朴素贝叶斯仍然可以利用概率统计得到一个可用模型。再次它在文本分类中常有不错表现。尽管条件独立假设并不完全真实但在垃圾邮件识别、新闻分类、情感分类等任务中朴素贝叶斯经常可以作为有效基线模型。此外它具有一定可解释性。通过查看某些特征在不同类别下的概率可以理解哪些词或特征更支持某个类别。从通俗角度看朴素贝叶斯的优势在于它用很简单的概率思想快速完成分类判断。2、朴素贝叶斯的主要局限朴素贝叶斯最大的局限是条件独立假设过强。现实中很多特征并不独立。例如在文本中“人工”和“智能”经常同时出现在医学数据中多个指标之间也可能相关。朴素贝叶斯把它们近似看作独立会带来一定误差。其次朴素贝叶斯的概率估计不一定非常准确。它有时分类效果不错但输出概率可能不够校准。再次如果特征表示不合理模型效果会受到明显影响。例如在文本分类中是否使用词频、是否去除停用词、是否使用 TF-IDF都会影响结果。此外对于复杂非线性边界朴素贝叶斯通常不如树模型、支持向量机或深度学习模型灵活。3、使用朴素贝叶斯时需要注意的问题使用朴素贝叶斯时需要注意以下几点• 连续特征可考虑 GaussianNB• 词频计数特征可考虑 MultinomialNB• 二值特征可考虑 BernoulliNB• 文本分类中要注意特征表示方式• 需要使用平滑避免零概率问题• 输出概率不一定适合作为严格置信度• 类别不平衡时要结合精确率、召回率、F1 值评估从实践角度看朴素贝叶斯非常适合作为文本分类和概率分类任务中的基础模型或基线模型。八、朴素贝叶斯与其他模型的关系朴素贝叶斯常被拿来和逻辑回归、决策树等模型比较。1、朴素贝叶斯与逻辑回归朴素贝叶斯和逻辑回归都可以用于分类也都能输出类别概率。但二者思路不同。朴素贝叶斯是生成式模型。它建模的是以及然后通过贝叶斯定理得到逻辑回归是判别式模型。它直接建模从通俗角度看• 朴素贝叶斯先理解每个类别如何生成特征再判断类别• 逻辑回归直接学习特征如何影响类别概率2、朴素贝叶斯与决策树决策树通过一系列条件判断完成分类。它更像是规则判断如果 特征 A ≤ 某个阈值则进入左分支否则进入右分支朴素贝叶斯则通过概率计算完成分类。它更像是证据综合这些特征共同支持哪个类别从通俗角度看• 决策树像问答流程• 朴素贝叶斯像概率推理3、朴素贝叶斯与文本分类在传统文本分类中朴素贝叶斯非常常见。原因是文本数据通常具有• 特征维度高• 矩阵稀疏• 词频统计自然• 样本数量可能有限这些特点正好适合朴素贝叶斯快速建模。因此在讲文本分类、垃圾邮件识别和新闻分类时朴素贝叶斯常被用作入门模型。九、Python 示例下面给出三个简单示例用来帮助理解朴素贝叶斯的基本使用。示例 1使用 GaussianNB 进行数值分类from sklearn.datasets import load_wine # 加载葡萄酒数据集from sklearn.model_selection import train_test_split # 数据集划分from sklearn.naive_bayes import GaussianNB # 高斯朴素贝叶斯分类器from sklearn.metrics import accuracy_score, classification_report # 评估指标 # 加载葡萄酒数据集178样本13特征3类别wine load_wine()X wine.data # 特征y wine.target # 标签 # 划分训练集和测试集测试集30%分层采样X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy # 保持类别比例) # 创建高斯朴素贝叶斯模型假设特征服从正态分布model GaussianNB() # 训练模型model.fit(X_train, y_train) # 预测测试集类别y_pred model.predict(X_test) # 评估准确率和分类报告print(测试集准确率, accuracy_score(y_test, y_pred)) print(分类报告)print(classification_report(y_test, y_pred, target_nameswine.target_names))这个例子中• GaussianNB 适合连续数值特征• fit() 用训练数据估计每个类别下各特征的均值和方差• predict() 输出预测类别• classification_report() 输出精确率、召回率和 F1 值示例 2使用 MultinomialNB 进行文本分类from sklearn.datasets import fetch_20newsgroups # 加载20个新闻组数据集from sklearn.feature_extraction.text import CountVectorizer # 文本特征提取词频矩阵from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯适用于离散特征from sklearn.pipeline import Pipeline # 管道串联处理步骤from sklearn.metrics import classification_report # 分类报告 # 选择两个新闻类别便于演示categories [ sci.space, # 科学·空间 rec.sport.baseball # 体育·棒球] # 加载训练集和测试集移除元数据只保留正文train_data fetch_20newsgroups( subsettrain, # 训练集 categoriescategories, # 只包含指定类别 remove(headers, footers, quotes) # 去除邮件头/尾/引用减少噪声) test_data fetch_20newsgroups( subsettest, categoriescategories, remove(headers, footers, quotes)) # 构建文本分类 Pipeline先词频向量化再朴素贝叶斯分类model Pipeline([ (vectorizer, CountVectorizer()), # 将文本转为词频矩阵文档×词 (classifier, MultinomialNB()) # 多项式朴素贝叶斯分类器]) # 训练模型model.fit(train_data.data, train_data.target) # 预测测试集y_pred model.predict(test_data.data) # 评估并输出分类报告精确率、召回率、F1等print(分类报告)print(classification_report( test_data.target, y_pred, target_namestrain_data.target_names))这个例子中• CountVectorizer() 把文本转换为词频矩阵• MultinomialNB() 适合词频计数特征• Pipeline 把文本向量化和模型训练放在一起避免流程混乱多项式朴素贝叶斯是传统文本分类中非常常见的基线模型。示例 3使用 BernoulliNB 处理二值文本特征from sklearn.datasets import fetch_20newsgroups # 加载20个新闻组数据集from sklearn.feature_extraction.text import CountVectorizer # 文本特征提取from sklearn.naive_bayes import BernoulliNB # 伯努利朴素贝叶斯适用于二值化特征from sklearn.pipeline import Pipeline # 管道from sklearn.metrics import classification_report # 分类报告 # 选择两个新闻类别空间和棒球categories [ sci.space, rec.sport.baseball] # 加载训练集和测试集移除头部、尾部和引用train_data fetch_20newsgroups( subsettrain, categoriescategories, remove(headers, footers, quotes)) test_data fetch_20newsgroups( subsettest, categoriescategories, remove(headers, footers, quotes)) # 构建 Pipeline词频向量化binaryTrue 只记录词是否出现不计数 伯努利朴素贝叶斯model Pipeline([ (vectorizer, CountVectorizer(binaryTrue)), (classifier, BernoulliNB())]) model.fit(train_data.data, train_data.target) # 训练模型 y_pred model.predict(test_data.data) # 预测测试集 print(分类报告)print(classification_report( test_data.target, y_pred, target_namestrain_data.target_names))这个例子中• CountVectorizer(binaryTrue) 只记录词是否出现• BernoulliNB() 适合二值特征它不关心某个词出现几次只关心这个词是否出现过因此BernoulliNB 更适合“是否出现”这类特征表示。 小结朴素贝叶斯是一类基于贝叶斯定理的概率分类算法。它通过先验概率和特征条件概率计算样本属于各个类别的后验概率并选择概率最大的类别。它之所以叫“朴素”是因为它假设在给定类别的条件下各个特征相互独立。虽然这一假设在现实中往往不完全成立但朴素贝叶斯简单、高效尤其适合文本分类和高维稀疏特征任务。对初学者而言可以把朴素贝叶斯理解为把每个特征看作一条证据再综合这些证据判断样本最可能属于哪一类。“点赞有美意赞赏是鼓励”