朴素贝叶斯法的学习与分类

先验概率

  • 反映了我们在实际观察之前对某种状态的预期。绝大多数情况下,是根据过去的观测统计得到的数据计算可能性。且所有可能性概率之和为1。

    例如,投掷硬币1000次,进行多个回合后的测试可发现,有1/2的概率丢到正面,1/2的概率成为反面。因此,可以说得到正面得到反面的先验概率是 1/2 的。

  • 正常情况下,可以基于先验做出决策。

    例如,统计北京的天气情况可以发现,一年中近乎80%的时间天气是晴朗无雨的,那么在判断是否进行某种运动时,则可以根据此概率确定。

  • 直接使用先验概率的局限很大

    它在不同的时间段内总是做出同样的预测,这是极其不适用的;例如,预测同一年龄段的老年人是否有高血压时,不能单靠先验概率进行直接判断,而是需要考虑到个人的家庭因素、作息等情况。

    其次,它无法利用现有的信息进行决策。

    最后,如果先验概率是均匀的,那么规则效果不佳。例如,在投掷硬币时,正反面的概率均为1/2,对下一次的投掷结果进行预测,就没有任何的优势,基本是靠猜测。

  • 解决办法:引入特征。可以引入多个观测变量,形成一个特征空间,即进行观测值采样的空间。借助这些观测变量features,进一步推论结果。使得这一结果考虑了多个因素而更具准确率。

条件独立性

P(X=xY=ck)=P(X(1)=x(1),,X(n)=x(n)Y=ck)=j=1nP(X(j)=x(j)Y=ck)\begin{aligned} P(X&=x | Y=c_{k} )=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) \\ &=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned}

后验概率

  • 给定观测向量X,某个特定类别的概率P(yx)P(y|x)
  • 选择拥有最大后验概率(MAP)的类别作为预测结果==>y=argmaxP(yix)y^* = argmaxP(y_i | x)
  • 犯错概率P(errx)=min[P(y1x),P(y2x)]P(err|x) = min[P(y_1|x),P(y_2|x)],错误分类在很多情况下导致的后果是很严重的,不同的错误带来的损失是不同的。λij\lambda_{ij}表示正确的分类为 j ,但是预测结果是 i 时的损失。

条件风险

  • 期望损失: $$R(y_i | x) = \sum_{j=1}^n \lambda_{ij}P(y_j | x) $$

    也就是说,当某样本结果真实值为j,但却被预测为i,×j损失值 \times 被预测为j的概率

  • 0 - 1条件风险: R(yix)=1P(yix)R(y_i | x) = 1 - P(y_i | x) ,即 (1 - 分类正确时的概率)。

  • 贝叶斯最优分类:选择条件风险/0-1条件风险最小的结果。

    当选择一个P(ykx)P(y_k | x)最大的结果,表示当k为最后预测结果时,R(ykx)R(y_k | x)此时最小,故风险也是最小的。那么K就是最优分类。

贝叶斯定理

朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。

P(YX)=P(X,Y)P(X)=P(Y)P(XY)YP(Y)P(XY)P(Y | X)=\frac{P(X, Y)}{P(X)}=\frac{P(Y) P(X | Y)}{\sum_{Y} P(Y) P(X | Y)}

将输入xx分到后验概率最大的类yy

y=argmaxckP(Y=ck)j=1nP(Xj=x(j)Y=ck)y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=x^{(j)} | Y=c_{k}\right)

后验概率最大等价于0-1损失函数时的期望风险最小化。

sklearn实现

朴素贝叶斯类库概述

scikit-learn中,一共有3个朴素贝叶斯的分类算法类,分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同:

  1. 如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
  2. 如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。
  3. 如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split

## 加载数据集
dataset = load_iris()
x, y = dataset.data, dataset.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)

## 高斯贝叶斯
clf = GaussianNB().fit(x_train, y_train)
y_predict = clf.predict(x_test)

## 计算准确率
acc = sum(y_test == y_predict) / x_test.shape[0]
clf.score(x_test, y_test)