概念
朴素贝叶斯 (naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方 法①。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率 分布;然后基于此模型,对给定的输入x, 利用贝叶斯定理求出后验概率最大的输出 y。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。
朴素贝叶斯算法它在做分类决策时,会假设各特征之间是相互独立的。下面我用一个简单的例子来说明它的工作原理:
想象你有一个水果篮,里面装有苹果、香蕉和橘子。每种水果都有一些特征,比如颜色和形状。现在,如果我给你一个水果,让你根据它的颜色和形状来判断它是哪种水果,你可以怎么做呢?
-
收集数据:首先,你需要知道篮子里每种水果的数量以及它们各自的特征。比如,苹果大多是红色,香蕉是黄色,而橘子是橙色。
-
贝叶斯定理:这时候,朴素贝叶斯算法就要用到贝叶斯定理了。这个定理帮助我们计算在已知某特征的情况下,这个水果是某一种水果的概率。比如,如果一个水果是红色的,那它是苹果的概率有多大?
-
假设特征独立:朴素贝叶斯算法的“朴素”之处在于它假设各个特征之间是相互独立的。在我们的例子中,这就意味着水果的颜色和形状是互不影响的。
-
分类决策:最后,算法会比较这个水果是每种水果的概率,然后选择概率最高的那个作为它的分类。
朴素贝叶斯算法因其简单和高效,在文本分类(如垃圾邮件和情感分析)等领域被广泛应用。尽管它的“朴素”假设有时可能过于简化,但在很多情况下,这个算法仍然能够给出令人满意的结果。
贝叶斯定理
贝叶斯定理是概率论中非常重要的一个定理,它告诉我们如何根据新的证据更新我们对一个事件的概率估计。贝叶斯定理的数学表达式相对简单,我会尽量用简洁的方式来解释。
贝叶斯定理的公式是:
这个公式中包含了以下几个部分:
-
P(A∣B):这是我们想要计算的东西,称为后验概率。它表示在已知事件B发生的条件下,事件A发生的概率。
-
P(B∣A):这是似然概率。它表示在事件A发生的条件下,事件B发生的概率。
-
P(A):这是事件A的先验概率,即在没有考虑B的影响之前,A发生的概率。
-
P(B):这是事件B的边际概率,即无论事件A是否发生,B发生的总概率。
贝叶斯定理的关键在于,它允许我们使用新的证据(即B的发生)来更新对A发生概率的估计。这是一个迭代过程,随着我们获取更多信息,我们可以更精确地估计概率。
朴素贝叶斯法原理
设 C 是类别变量,X=(x1,x2,...,xn) 是一个特征向量,其中 x1,x2,...,xn 是独立特征。我们的目标是在给定特征的情况下找到类别的概率,即计算 P(C∣X)。根据贝叶斯定理,我们有:
在朴素贝叶斯中,因为特征被假设为条件独立,所以 P(X∣C) 可以分解为:
P(X∣C)=P(x1,x2,...,xn∣C)=P(x1∣C)×P(x2∣C)×...×P(xn∣C)
将这个分解后的表达式代入贝叶斯定理,我们得到:
其中:
- P(xi∣C) 是在类别 C 下特征 xi 出现的概率。
- P(C) 是类别 C 的先验概率,可以根据训练集中类别 C 的相对频率来估计。
- P(X) 是特征向量 X 出现的概率,通常作为归一化常数。
在实际应用中,为了找到给定特征向量 X 最可能的类别,我们计算每个类别 C 下 P(C∣X) 的值,然后选择具有最大后验概率的类别:
C^=argmaxCP(C∣X)
由于 P(X) 对于所有类别都是相同的,所以在比较不同类别的 P(C∣X) 时,通常可以忽略它。
朴素贝叶斯方法在处理具有大量特征的数据集(如文本分类)时特别有效,因为它的简化假设(特征条件独立)使得模型即使在小数据集上也能够有效地训练,并且计算效率高。不过,这种独立性假设有时可能过于简化,不适用于所有问题。
假设我们有一个很小的数据集,它涉及判断天气条件下是否会进行网球比赛。我们的目标是基于天气条件预测是否会进行网球比赛。
假设我们有以下数据集:
| 天气 | 温度 | 湿度 | 风速 | 网球比赛 |
|-------|-------|-------|-------|----------|
| 晴朗 | 炎热 | 高 | 弱 | 是 |
| 晴朗 | 炎热 | 高 | 强 | 否 |
| 阴天 | 炎热 | 高 | 弱 | 是 |
| 雨天 | 适中 | 高 | 弱 | 是 |
| 雨天 | 寒冷 | 正常 | 弱 | 是 |
| 雨天 | 寒冷 | 正常 | 强 | 否 |
| 阴天 | 寒冷 | 正常 | 强 | 是 |
我们想预测在下列条件下会不会有网球比赛:天气=阴天,温度=适中,湿度=高,风速=强。
首先,我们需要计算各个特征的概率以及类别的先验概率。
1. 类别的先验概率:在这个数据集中,有5天进行了网球比赛(是),2天没有进行(否)。
P(是) =
P(否) =
2. 计算特征的条件概率:以“天气=阴天”且“网球比赛=是”为例,
同样的方法计算其他特征的条件概率。
3. 应用朴素贝叶斯公式:我们计算在给定特征条件下进行网球比赛的概率 P(是|X) 和不进行网球比赛的概率 P(否|X) ,其中 X 是给定的特征组合。
因为我们只是比较这两个概率的相对大小,所以可以忽略分母 \( P(X) \)。
4. 比较两个概率:比较 P(是|X) 和 P(否|X)的大小,选择较大的那个作为预测结果。
现在,让我们根据这些步骤计算具体的概率。
根据计算结果:
- 进行网球比赛的概率 P(是|X)约为 0.0274。
- 不进行网球比赛的概率 P(否|X) 为 0。
在这个特定的例子中,由于在给定的条件(天气=阴天,温度=适中,湿度=高,风速=强)下没有出现过“不进行网球比赛”的情况,因此 P(否|X) 的值为 0。这意味着,在这些特定条件下,根据我们的模型和数据集,比赛是会进行的。
需要注意的是,这个结果完全取决于我们的数据集大小和分布。在实际应用中,朴素贝叶斯模型的准确性会受到数据集质量和数量的影响。此外,由于我们的数据集非常小,所以这个结果可能并不具有强大的预测力。在更大和更复杂的数据集上应用朴素贝叶斯时,结果通常会更加可靠和准确。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 创建数据集
data = [
("体育 新闻 足球 比赛", "体育"),
("科技 新闻 科学 探索", "科技"),
("体育 赛事 直播", "体育"),
("科技 世界 发展", "科技"),
("足球 比赛 观看", "体育"),
("科学 实验", "科技")
]
texts, labels = zip(*data)
# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)
# 模型训练
model = MultinomialNB()
model.fit(X, labels)
# 模型测试
test_texts = ["足球 赛事", "科学 新发现"]
test_X = vectorizer.transform(test_texts)
predicted = model.predict(test_X)
# 结果展示
for text, category in zip(test_texts, predicted):
print(f"{text} => {category}")
足球 赛事 => 体育
科学 新发现 => 科技