📜  Python朴素贝叶斯分类器

📅  最后修改于: 2020-05-12 05:02:49             🧑  作者: Mango

本文讨论了朴素贝叶斯分类器背后的理论及其实现。

朴素贝叶斯分类器是基于贝叶斯定理的分类算法的集合。 它不是一个单一的算法,而是一系列算法,它们全部共享一个共同的原理,即,每对被分类的特征彼此独立。
首先,让我们考虑一个数据集。
考虑一个虚构的数据集,该数据集描述了打高尔夫球的天气状况。 给定天气条件,每个元组将条件分为适合普通高尔夫的条件(“是”)或不适合(“否”)。

这是我们的数据集的表格表示。

表现 温度 湿度 有风的 打高尔夫球
0 多雨的 没有
1个 多雨的 没有
2 灰蒙蒙
3 阳光明媚 温和
4 阳光明媚 正常
5 阳光明媚 正常 没有
6 灰蒙蒙 正常
7 多雨的 温和 没有
8 多雨的 正常
9 阳光明媚 温和 正常
10 多雨的 温和 正常
11 灰蒙蒙 温和
12 灰蒙蒙 正常
13 阳光明媚 温和 没有

数据集分为两部分,即特征矩阵响应向量 。

  • 特征矩阵包含数据集的所有向量(行),其中每个向量都包含相关特征的值。 在以上数据集中,特征为“ 表现”,“温度”,“湿度”和“风”。
  • 响应向量包含特征矩阵每一行的类变量 (预测或输出)的值。 在上述数据集中,类变量名称为“ 打高尔夫球”。

假设:

朴素贝叶斯(Naive Bayes)的基本假设是,每个功能都具有:

  • 独立
  • 等于

对结果的贡献。
关于我们的数据集,这个概念可以理解为:

  • 我们假设没有一对特征是依赖的。 例如,温度为“高温”与湿度无关,或者视线为“多雨”对风没有影响。 因此,假定这些特征是独立的 。
  • 其次,每个功能都具有相同的权重(或重要性)。 例如,仅了解温度和湿度并不能正确预测结果。 没有任何属性是无关紧要的,并且被认为对结果有同样的贡献。

注意:朴素贝叶斯(Naive Bayes)所做的假设在现实世界中通常并不正确。 实际上,独立性假设永远是不正确的,但在实践中通常效果很好。

现在,在转向朴素贝叶斯公式之前,了解贝叶斯定理很重要。

贝叶斯定理

给定已经发生的另一事件的概率,贝叶斯定理找到发生事件的概率。 贝叶斯定理在数学上由以下等式表示:
 P(A|B) = \frac{P(B|A) P(A)}{P(B)}
其中A和B是事件

  • 基本上,鉴于事件B为真,我们试图找到事件A的概率。 事件B也被称为证据 。
  • P(A)是A的先验 (先验概率,即在看到证据之前发生事件的概率)。 证据是未知实例的属性值(这里是事件B)。
  • P(A | B)是B的后验概率,即看到证据后发生事件的概率。

现在,关于我们的数据集,我们可以通过以下方式应用贝叶斯定理:

 P(y|X) = \frac{P(X|y) P(y)}{P(X)}
其中,y是类变量,X是从属特征向量(大小为n ),其中:
 X = (x_1,x_2,x_3,.....,x_n)
为了清楚起见,特征向量和相应的类变量的示例可以是:(请参阅数据集的第一行)

X = (Rainy, Hot, High, False) y = No

因此,基本上,P(X | y)表示在天气状况为“多雨的”,“温度较高”,“高湿度”和“无风”的情况下“不打高尔夫球”的可能性。

 

天真的假设

现在,是时候对贝叶斯定理做出天真的假设了,即特征之间的独立性 。 所以现在,我们将证据分为独立的部分。
现在,如果事件A和B中的任何两个是独立的,

P(A,B) = P(A)P(B)

因此,我们得出的结果是:

 P(y|x_1,...,x_n) = \frac{ P(x_1|y)P(x_2|y)...P(x_n|y)P(y)}{P(x_1)P(x_2)...P(x_n)}
可以表示为:

 P(y|x_1,...,x_n) = \frac{P(y)\prod_{i=1}^{n}P(x_i|y)}{P(x_1)P(x_2)...P(x_n)}
现在,由于分母对于给定的输入保持不变,因此我们可以删除该术语:

 P(y|x_1,...,x_n)\propto P(y)\prod_{i=1}^{n}P(x_i|y)
现在,我们需要创建一个分类器模型。 为此,我们找到类别变量y的所有可能值的给定输入集的概率,并以最大概率获取输出。 这可以用数学表示为:
y = argmax_{y} P(y)\prod_{i=1}^{n}P(x_i|y)

因此,最后,剩下的工作是计算P(y)和P(x i | y)。
请注意,P(y)也称为类概率 ,P(x i | y)也称为条件概率 。
不同的朴素贝叶斯分类器的主要区别在于它们对P(x i | y)的分布所做的假设。
让我们尝试将上述公式手动应用于天气数据集。 为此,我们需要对数据集进行一些预计算。
我们需要为X中的每个x i和y中的y j找到P(x i | y j )。 下表演示了所有这些计算:

table23

因此,在上图中,我们在表1-4中为X中的每个x i和y中的y j手动计算了P(x i | y j )。 例如,假设温度凉爽,打高尔夫球的概率,即P(温度=凉|打高尔夫球=是)= 3/9。
另外,我们需要找到已在表5中计算的类别概率(P(y))。例如,P(打高尔夫球=是)= 9/14。
现在,我们已经完成了预计算,分类器已准备就绪!
让我们在一组新功能上对其进行测试(今天让我们称之为):today = (Sunny, Hot, Normal, False)因此,打高尔夫球的概率由下式给出:

 P(Yes | today) = \frac{P(Sunny Outlook|Yes)P(Hot Temperature|Yes)P(Normal Humidity|Yes)P(No Wind|Yes)P(Yes)}{P(today)}
不打高尔夫的概率由下式给出:

 P(No | today) = \frac{P(Sunny Outlook|No)P(Hot Temperature|No)P(Normal Humidity|No)P(No Wind|No)P(No)}{P(today)}
由于P(today)在两个概率中都是通用的,因此我们可以忽略P(today)并按比例找到概率:

 P(Yes | today) \propto \frac{2}{9}.\frac{2}{9}.\frac{6}{9}.\frac{6}{9}.\frac{9}{14} \approx 0.0141

 P(No | today) \propto \frac{3}{5}.\frac{2}{5}.\frac{1}{5}.\frac{2}{5}.\frac{5}{14} \approx 0.0068
现在,因为:
 P(Yes | today) + P(No | today) = 1

通过使总和等于1(归一化),可以将这些数字转换为概率:
 P(Yes | today) = \frac{0.0141}{0.0141 + 0.0068} = 0.67

和:
 P(No | today) = \frac{0.0068}{0.0141 + 0.0068} = 0.33

以来
 P(Yes | today) > P(No | today)
因此,将要打高尔夫球的预测是“是”。
我们上面讨论的方法适用于离散数据。 在连续数据的情况下,我们需要对每个要素的值的分布进行一些假设。 不同的朴素贝叶斯分类器的主要区别在于它们对P(x i | y)的分布所做的假设。
现在,我们在这里讨论这样的分类器之一。

高斯朴素贝叶斯分类器

在高斯朴素贝叶斯中,与每个特征相关的连续值被假定为根据高斯分布进行分布 。 高斯分布也称为正态分布 。 绘制时,它给出了一个钟形曲线,该曲线关于特征值的平均值对称,如下所示:
normal
假设特征的似然性是高斯的,因此条件概率由下式给出:
 P(x_i | y) = \frac{1}{\sqrt{2\pi\sigma _{y}^{2} }} exp \left (-\frac{(x_i-\mu _{y})^2}{2\sigma _{y}^{2}} \right )

现在,我们看一下使用scikit-learn的高斯朴素贝叶斯分类器的实现。

 # 加载虹膜数据集
  from sklearn.datasets import load_iris
  iris = load_iris()
 # 存储特征矩阵(X)和响应向量(y)
  X = iris.data
  y = iris.target
 # 将X和y分为训练和测试集
  from sklearn.model_selection import train_test_split
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4 , random_state = 1 )
 # 在训练集上训练模型
  from sklearn.naive_bayes import GaussianNB
  gnb = GaussianNB() gnb GaussianNB()
 gnb.fit(X_train, y_train)
 # 对测试集进行预测
  y_pred = gnb.predict(X_test)
 # 比较实际响应值(y_test)和预测响应值(y_pred)
  from sklearn import metrics
  print ( "Gaussian Naive Bayes model accuracy(in %):" , metrics.accuracy_score(y_test, y_pred) * 100 )

输出:

Gaussian Naive Bayes model accuracy(in %): 95.0

其他流行的朴素贝叶斯分类器是:

  • 多项式朴素贝叶斯 :特征向量表示通过多项式分布生成某些事件的频率。 这是通常用于文档分类的事件模型。
  • Bernoulli Naive Bayes :在多元Bernoulli事件模型中,特征是描述输入的独立布尔值(二进制变量)。 像多项模型一样,该模型在文档分类任务中也很流行,其中使用二进制术语出现(即单词是否出现在文档中)特征而不是术语频率(即文档中单词的频率)。

当我们到达本文结尾时,需要考虑以下一些重要点:

  • 尽管朴素的贝叶斯分类器似乎过分简化了假设,但它们在许多实际情况下(在著名的文档分类和垃圾邮件过滤中)都表现良好。 他们需要少量的训练数据来估计必要的参数。
  • 与更复杂的方法相比,朴素贝叶斯学习者和分类器可以非常快。 类条件特征分布的解耦意味着可以将每个分布独立地估计为一维分布。 反过来,这有助于减轻因维数的诅咒而产生的问题。