朴素贝叶斯是一种基于贝叶斯定理的概率机器学习算法,用于各种分类任务。

本文中,您将对朴素贝叶斯算法和所有必要的概念有一定的理解。

1. 引言

朴素贝叶斯是一种概率机器学习算法,可用于各种分类任务。

典型应用包括过滤垃圾邮件、对文档进行分类、情绪预测等。它基于托马斯·贝叶斯(1702 年),因此得名。

但为什么它被称为“朴素”?

之所以使用该名称,是因为它假设进入模型的特征彼此独立。改变一个特征的值,不会直接影响或改变算法中使用的任何其他特征的值。naive

由于它是一个概率模型,因此可以轻松编码算法并快速进行预测。实时快速。

因此,它易于扩展,并且传统上是需要即时响应用户请求的实际应用程序(应用程序)的首选算法。

但在进入朴素贝叶斯之前,你需要了解什么是“条件概率”和什么是“贝叶斯规则”。

下面将逐步介绍:

  • 朴素贝叶斯分类器的确切工作方式
  • 什么是高斯朴素贝叶斯,何时使用以及如何工作?
  • 如何在 Python 中编写代码
  • 如何改进您的朴素贝叶斯模型?

2. 什么是条件概率?

让我们从基础开始,了解条件概率。

python与朴素贝叶斯算法(附示例和代码)_朴素贝叶斯

抛硬币和公平骰子示例:当你掷出一枚公平的硬币时,有相等的机会获得正面或反面。所以你可以说获得正面的概率是 50%。同样,当你掷出一个有 6 张面的骰子时,得到 1 的概率是多少?假设骰子是公平的,则 1/6 的概率 = 0.166。


扑克牌示例:如果你从牌组中挑选一张牌,你能猜出获得女王的概率吗,如果设置了一个条件,即这张牌是黑桃。

因此,分母(符合条件的)是 13 而不是 52。由于黑桃中只有一个皇后,因此如果这张牌是黑桃,它是皇后的概率是 1/13 = 0.077

这是条件概率的一个典型例子。

因此,当你说给定 B 的 A 的条件概率时,它表示 A 发生的概率,因为 B 已经发生。

从数学上讲,给定 B 的 A 的条件概率可以计算为:P(A|B) = P(A 和 B) / P(B)

让我们看一个稍微复杂的例子。

考虑一所总人口为 100 人的学校。这100人既可以看作是“学生”和“教师”,也可以看作是“男性”和“女性”的群体。

在下面的 100 人表格中,假设学校的某个成员是“人”,那么他是“老师”的条件概率是多少?

python与朴素贝叶斯算法(附示例和代码)_拉普拉斯校正_02

为了计算这一点,您可以直观地过滤 60 名男性的子人口,并关注 12 名(男性)教师。所以所需的条件概率P(Teacher |男性)= 12 / 60 = 0.2。 这可以表示为教师 (A) 和男性 (B) 除以男性 (B) 的交点。同样,可以计算给定 A 的 B 的条件概率。我们用于朴素贝叶斯的贝叶斯规则可以从这两个符号中推导出来。

python与朴素贝叶斯算法(附示例和代码)_拉普拉斯校正_03

python与朴素贝叶斯算法(附示例和代码)_高斯朴素贝叶斯_04

3. 贝叶斯规则

贝叶斯规则是一种从训练数据集中已知的 P(X|Y) 找到 P(Y|X).

为此,我们将上述公式中的 A 和 B 替换为特征 X 和响应 Y。

对于测试或评分数据中的观察结果,X 是已知的,而 Y 是未知的。对于测试数据集的每一行,您都希望计算 Y 的概率,因为 X 已经发生。

如果 Y 有 2 个以上的类别会怎样?我们计算 Y 的每个类的概率,并让最高的人获胜。

python与朴素贝叶斯算法(附示例和代码)_条件概率_05

python与朴素贝叶斯算法(附示例和代码)_拉普拉斯校正_06

4. 朴素贝叶斯

贝叶斯规则提供了给定 X 的 Y 概率公式。

但是,在现实世界的问题中,您通常有多个 X 变量。

当特征独立时,我们可以将贝叶斯规则扩展到所谓的朴素贝叶斯

它之所以被称为“朴素”,是因为简单地假设 X 是相互独立的。

不管它的名字是什么,它都是一个强大的公式。

python与朴素贝叶斯算法(附示例和代码)_高斯朴素贝叶斯_07

python与朴素贝叶斯算法(附示例和代码)_模型训练_08

在技术术语中,方程的左侧 (LHS) 被理解为后验概率或简称为后验概率。

RHS 的分子中有 2 个项。第一个术语称为“证据可能性”。它只不过是每个 X 给定 Y 的条件概率属于特定类“c”。由于假设所有 X 都是相互独立的,因此您可以将所有 X 的“可能性”相乘,并将其称为“证据可能性概率”。

这可以通过过滤 Y=c 的记录从训练数据集中得知。第二项称为先验,它是 Y=c 的总概率,其中 c 是 Y 的一类。简单来说,.Prior = count(Y=c) / n_Records


5. 手工朴素贝叶斯示例

假设你有 1000 种水果,可以是“香蕉”、“橙子”或“其他”。这些是 Y 变量的 3 个可能的类。我们有以下 X 个变量的数据,所有这些变量都是二进制的(1 或 0)。

  • 黄色

训练数据集的前几行如下所示(假定,香蕉有长有短的):

水果

长的 (x1)

甜的 (x2)

黄色的 (x3)

0

1

0

香蕉

0

1

1

香蕉

1

1

1

其他

1

1

0

..

..

..

..

为了计算概率,让我们聚合训练数据以形成这样的计数表。

python与朴素贝叶斯算法(附示例和代码)_模型训练_09

因此,分类器的目的是预测给定的水果是“香蕉”还是“橙色”或“其他”,而只有 3 个特征(长、甜和黄色)是已知的。

假设你得到一个水果,它是:长、甜和黄色,你能预测它是什么水果吗?

这与在测试数据中只有 X 变量已知时预测 Y 相同。

让我们使用朴素贝叶斯手动解决它。这个想法是计算 3 个概率,即水果是香蕉、橙子或其他水果的概率。哪种水果类型获得最高概率的水果获胜。

计算这些概率的所有信息都存在于上面的表格中。

第 1 步:计算每类水果的“初始”概率。 也就是说,每个水果类别在种群中所有水果中的比例。

您可以根据有关信息。否则,可以从训练数据中计算出来。对于这种情况,让我们根据训练数据进行计算。在训练数据的 1000 条记录中,有 500 个香蕉、300 个橙子和 200 个其他。

所以各自的优先度是 0.5、0.3 和 0.2。P(Y=香蕉) = 500 / 1000 = 0.50 P(Y=橙色) = 300 / 1000 = 0.30 P(Y=其他) = 200 / 1000 = 0.20

第 2 步:计算分母中的证据概率。 这只不过是所有 X 的 X 的 P 的乘积。这是一个可选步骤,因为所有类的分母都是相同的,因此不会影响概率。P(x1=多头) = 500 / 1000 = 0.50 P(x2=甜) = 650 / 1000 = 0.65 P(x3=黄色) = 800 / 1000 = 0.80

第 3 步:计算分子中的证据可能性概率。 它是 3 个特征的条件概率的乘积。如果你回过头来参考公式,它说 P(X1 |Y=k)。

这里 X1 是“多头”,k 是“香蕉”。

这意味着水果中“长”的概率,是香蕉。在上表中,你有 500 根香蕉。其中 400 个很长。

所以,P(长 |香蕉) = 400/500 = 0.8。在这里,我只为香蕉做了这件事。

香蕉的可能性(likelihood)概率P(x1=长整型 |Y=香蕉) = 400 / 500 = 0.80 P(x2=甜 |Y=香蕉) = 350 / 500 = 0.70 P(x3=黄色 |Y=香蕉) = 450 / 500 = 0.90。

因此,Banana可能性的总体概率 = 0.8 * 0.7 * 0.9 = 0.504

第 4 步:将所有 3 个方程代入朴素贝叶斯公式,以获得它是香蕉的概率。

python与朴素贝叶斯算法(附示例和代码)_条件概率_10

同样,您可以计算“橙子”和“其他水果”的概率。所有 3 种情况的分母都是相同的,因此可以选择进行计算。显然,Banana的概率最高,所以这就是我们预测的结果。

6. 什么是拉普拉斯校正?

P(Orange |Long, Sweet and Yellow)在上面的例子中为零,因为P(Long |橙色)为零。

也就是说,训练数据中没有“长”橙。

这是有道理的,但是当你有一个具有许多特征的模型时,整个概率将变为零,因为其中一个特征的值为零。为了避免这种情况,我们将分子中为零的变量的计数增加到一个小值(通常为 1),这样总概率就不会变为零。这种方法称为“拉普拉斯校正”。

大多数朴素贝叶斯模型实现都接受这种或等效形式的校正作为参数。

7. 什么是高斯朴素贝叶斯?

到目前为止,我们已经看到了 X 是分类的计算。

但是当 X 是连续变量时,如何计算概率呢?

如果我们假设 X 遵循特定分布,那么您可以插入该分布的概率密度函数来计算可能性的概率。

如果你假设 X 遵循正态分布(又称高斯分布),这是相当常见的,我们用正态分布的相应概率密度来代入,并将其称为高斯朴素贝叶斯。

您只需要 X 的均值和方差即可计算此公式。 其中 mu 和 sigma 是为给定类“c”(Y) 计算的连续 X 的均值和方差。

为了使特征更像高斯,您可以考虑使用 Box-Cox 之类的东西来转换变量来实现这一点。

现在,让我们构建一个朴素贝叶斯分类器。

8. 在 Python 中构建朴素贝叶斯分类器

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()

#导入数据
training = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/iris_train.csv')
test = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/iris_test.csv')


# 创建x,y,关于训练和测试
xtrain = training.drop('Species', axis=1)
ytrain = training.loc[:, 'Species']
xtest = test.drop('Species', axis=1)
ytest = test.loc[:, 'Species']


# 初始化高斯分类器
model = GaussianNB()

# 训练模型
model.fit(xtrain, ytrain)

# 预测输出
pred = model.predict(xtest)

# 混淆矩阵
mat = confusion_matrix(pred, ytest)
names = np.unique(pred)
sns.heatmap(mat, square=True, annot=True, fmt='d', cbar=False,
            xticklabels=names, yticklabels=names)
plt.xlabel('Truth')
plt.ylabel('Predicted')

python与朴素贝叶斯算法(附示例和代码)_条件概率_11

9. 改进模型的技巧

  1. 尝试使用 Box-Cox变换 或 Yeo-Johnson变换来转换变量,以使特征接近正常。
  2. 尝试应用拉普拉斯校正来处理 X 变量中值为零的记录。
  3. 检查相关要素,并尝试删除高度相关的要素。朴素贝叶斯基于特征是独立的假设。
  4. 特征工程。将功能(产品)组合在一起以形成具有直观意义的新功能可能会有所帮助。
  5. 尝试根据业务知识为算法提供更现实的先验概率,而不是让算法根据训练样本计算先验概率。