一、简介
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单概率分类器。它之所以被称为“朴素”,是因为它假设特征之间相互独立,这个假设在现实世界中通常不成立,但朴素贝叶斯分类器在实践中往往表现出色,尤其是在文本分类和垃圾邮件过滤等领域。
二、数学原理——贝叶斯定理
先验概率:即基于统计的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件。
后验概率:则是从条件概率而来,由因推果,是基于当下发生了事件之后计算的概率,依赖于当前发生的条件。
条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。
贝叶斯公式:贝叶斯公式便是基于条件概率,通过P(B|A)来求P(A|B),如下:
其中:
P ( A ∣ B )表示在事件B发生的条件下,事件A发生的概率;
P ( B ∣ A )表示在事件A发生的条件下,事件B发生的概率;
P ( A ) 和 P ( B ) 分别表示事件A和事件B单独发生的概率。
这个定理的核心思想就是,当我们知道了某个条件事件B已经发生,我们可以根据这个条件来更新A事件发生的概率。也就是说,我们可以利用已知的信息(条件概率)来推测未知的概率。
三、朴素贝叶斯
在朴素贝叶斯算法中,特征条件假设(Feature Conditional Assumption)是指算法在计算后验概率时,假设所有特征都是相互独立的。这个假设是朴素贝叶斯算法的核心,也是它“朴素”名称的由来。
1.特征条件假设
在朴素贝叶斯算法中,对于给定的类别 𝑐 和样本 𝑥=(𝑥1,𝑥2,...,𝑥𝑛),算法需要计算条件概率 𝑃(𝑥∣𝑐),即在类别 𝑐c 发生的条件下,观察到样本 𝑥 的概率。根据特征条件假设,我们可以将这个联合概率分解为各个特征的条件概率的乘积:
其中,𝑃(𝑥𝑖∣𝑐) 是在类别 𝑐 发生的条件下,第 𝑖 个特征 𝑥𝑖 发生的概率。
特征条件假设的影响
-
简化计算:特征条件假设大大简化了后验概率的计算。如果没有这个假设,我们需要计算所有特征组合的条件概率,这在特征数量很大时是不可行的。
-
降低性能:在现实世界中,特征之间往往是相关的。特征条件假设忽略了这些相关性,这可能会导致算法的性能下降。
-
适用性:尽管特征条件假设在理论上是不现实的,但在许多实际应用中,朴素贝叶斯算法仍然能够提供良好的分类性能。这可能是因为在某些情况下,特征之间的相关性对分类结果的影响较小。
2.原理
朴素贝叶斯算法的核心思想是利用贝叶斯定理来计算给定输入数据的类别概率。具体来说,对于一个给定的样本 𝑥,朴素贝叶斯算法会计算它属于每个类别 𝑐 的概率 𝑃(𝑐∣𝑥),然后选择概率最高的类别作为预测结果。
根据贝叶斯定理,我们可以将 𝑃(𝑐∣𝑥) 表示为:
其中:
- 𝑃(𝑐∣𝑥)是后验概率,即在给定样本 𝑥 的条件下,它属于类别 𝑐 的概率。
- 𝑃(𝑥∣𝑐)是似然,即在类别 𝑐 发生的条件下,观察到样本 𝑥 的概率。
- 𝑃(𝑐)是类别 𝑐 的先验概率,即在没有观察到样本 𝑥 之前,类别 𝑐 发生的概率。
- 𝑃(𝑥)是样本 𝑥 的边缘概率,即不考虑类别的情况下,样本 𝑥 发生的概率。
3.朴素贝叶斯分类器
朴素贝叶斯分类器的工作原理是,给定一个样本,通过计算它属于各个类别的后验概率,选择后验概率最大的类别作为预测结果。对于一个具有多个特征的分类问题,朴素贝叶斯分类器会假设所有特征都是相互独立的。
假设我们有类别集合 𝐶={𝑐1,𝑐2,...,𝑐𝑛} 和特征集合 𝐹={𝑥1,𝑥2,...,𝑥𝑚}。对于一个给定的样本 𝑋={𝑥1,𝑥2,...,𝑥𝑚},朴素贝叶斯分类器计算每个类别 𝑐𝑖 的后验概率 𝑃(𝑐𝑖∣𝑋),然后选择具有最高后验概率的类别作为预测结果。根据贝叶斯定理,后验概率可以表示为:
𝑃(𝑐𝑖∣𝑋)=𝑃(𝑋∣𝑐𝑖)⋅𝑃(𝑐𝑖)
由于朴素贝叶斯假设特征之间相互独立,似然 𝑃(𝑋∣𝑐𝑖)可以进一步表示为:
其中,𝑃(𝑥𝑗∣𝑐𝑖)是在类别 𝑐𝑖 发生的条件下特征 𝑥𝑗 发生的概率。
4.拉普拉斯修正
拉普拉斯修正(Laplace correction),也称为加一平滑(add-one smoothing),是一种在概率估计中用于处理零概率问题的方法。在朴素贝叶斯分类器或其他统计模型中,当遇到某个类别或特征组合在训练数据中没有出现时,会导致概率估计为零,这在实际应用中是不现实的,因为即使是训练数据中未出现的事件,在测试数据中也可能会以非零概率出现。
拉普拉斯修正的数学表达
拉普拉斯修正的基本思想是在每个事件发生的计数上加上一个常数(通常是1),以避免零概率的问题。对于一个特征 𝑥𝑖 在类别 𝑐c 下的条件概率 𝑃(𝑥𝑖∣𝑐),如果没有出现过 𝑥𝑖 和 𝑐 的组合,在应用拉普拉斯修正后的概率估计可以表示为:
其中:
- 𝑁𝑥𝑖,𝑐 是在类别 𝑐c 中出现特征 𝑥𝑖 的次数。
- 𝑁𝑐 是类别 𝑐 在训练数据集中的总次数。
- 𝑉 是类别 𝑐 下特征 𝑥𝑖 可能取的不同值的数量(即特征 𝑥𝑖 的类别 𝑐 条件下的值域大小)。
拉普拉斯修正的作用
-
避免零概率:通过为每个类别和特征值组合添加一个常数,确保所有事件的概率都是正的。
-
平滑概率分布:拉普拉斯修正可以看作是一种概率分布的平滑技术,它减少了模型对训练数据的敏感度,从而提高模型的泛化能力。
-
处理稀疏数据:在文本分类等特征空间非常大的应用中,拉普拉斯修正特别有用,因为很多特征组合在训练数据中可能根本不会出现。
5.实现步骤
-
数据准备:收集并准备训练数据集,包括输入特征和对应的类别标签。
-
特征独立性假设:朴素贝叶斯算法假设所有特征都是相互独立的。这意味着一个特征的出现不会影响其他特征的出现。
-
计算先验概率:根据训练数据集中每个类别的样本数量,计算每个类别的先验概率 𝑃(𝑐)P(c)。
-
计算条件概率:对于每个类别 𝑐c 和每个特征 𝑥𝑖xi,计算条件概率 𝑃(𝑥𝑖∣𝑐)P(xi∣c)。这通常是通过计算给定类别 𝑐c 时,特征 𝑥𝑖xi 出现的概率来实现的。
-
计算边缘概率:边缘概率 𝑃(𝑥)P(x) 可以通过所有类别的条件概率和先验概率的乘积之和来计算。
-
应用贝叶斯定理:使用贝叶斯定理计算后验概率 𝑃(𝑐∣𝑥)P(c∣x)。
-
类别预测:对于新的样本 𝑥x,计算它属于每个类别的后验概率,并选择概率最高的类别作为预测结果。
四、代码实现
实验内容:sklearn20类新闻分类,20个新闻组数据集包含20个主题的18000个新闻组帖子。
实验方法:首先,加载20类新闻数据,并进行分割。然后,生成文章特征词,接着,使用朴素贝叶斯分类器进行预估。
# coding:utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def naviebayes():
news = fetch_20newsgroups()
# 进行数据分割
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 对数据集进行特征抽取
tf = TfidfVectorizer()
# 以训练集当中词的列表进行每篇文章重要性统计['a','b','c','d']
x_train = tf.fit_transform(x_train)
print(tf.get_feature_names())
x_test = tf.transform(x_test)
# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)
print(x_train.toarray())
mlt.fit(x_train, y_train)
y_predict = mlt.predict(x_test)
print("预测的文章类别为:", y_predict)
# 得出准确率
print("准确率为:", mlt.score(x_test, y_test))
if __name__ == '__main__':
naviebayes()