【机器学习与实战】分类与聚类算法:朴素贝叶斯

68 阅读4分钟

【机器学习与实战】分类与聚类算法:朴素贝叶斯

一、概率定义

概率定义为一件事情发生的可能性,事件 x 发生的概率通常用 P(x) 表示,P(x) 取值在 [0, 1]

  • 扔出一个不均匀的硬币 100 次,结果正面朝上 40 次,反面朝上 60 次,那么可以说抛一次硬币,正面朝上的可能性是 40%
  • 扔出一个不均匀的骰子 100 次,结果是 {1点:13, 2点:21, 3点:15, 4点:17, 5点:17, 6点:17},那么可以说抛一次骰子,2点的可能性是 21%
二、案例:判断女神对你的喜欢情况

在讲这两个联合概率、条件概率之前,我们通过一个例子,来计算一些结果:

样本数职业体型女神是否喜欢
1程序员超重不喜欢
2产品匀称喜欢
3程序员匀称喜欢
4程序员超重喜欢
5美工匀称不喜欢
6美工超重不喜欢
7产品匀称喜欢

问题如下

  1. 在上面这个样本集中,女神喜欢的概率?
  2. 在上面这个样本集中,职业是程序员并且体型匀称的概率?
  3. 在上面这个样本集中,职业是程序员并且女神喜欢的概率?
  4. 在上面这个样本集中,在女神喜欢的条件下,职业是程序员的概率?
  5. 在上面这个样本集中,在女神喜欢的条件下,职业是程序员、体重超重的概率?

计算结果为

P(喜欢) = 4/7 P(程序员, 匀称) = 1/7(联合概率) P(程序员, 喜欢) = 2/7(联合概率) P(程序员|喜欢) = 2/4 = 1/2(条件概率) P(程序员, 超重|喜欢) = 1/4

三、联合概率、条件概率与相互独立
  • 联合概率:表示两个(或更多)随机变量同时满足某些条件的概率。也就是,两个(或更多)事件同时发生的概率。
    • 对于两个随机变量 XXYY,它们的联合概率记为 P(X,Y)P(X,Y)P(XY)P(X∩Y),表示事件 XX 和事件 YY 同时发生的概率
  • 条件概率:表示一个事件在另一个事件已发生的情况下发生的概率。也就是,在事件 B 已经发生的情况下,事件 A 发生的概率。
    • 记作:P(A|B)
    • P(AB)=P(A,B)P(B)P(A \mid B)=\frac{P(A, B)}{P(B)}
    • P(A,B)=P(AB)×P(B)=P(BA)×P(A)P(A, B) = P(A \mid B) \times {P(B)} = P(B \mid A) \times {P(A)}
  • 相互独立:如果 P(A, B) = P(A)P(B),则称事件 A 与事件 B 相互独立

假设我们有一个公平的骰子和一个公平的硬币,现在我们抛一下骰子和硬币,可以知道骰子的上面为 “3” 出现的概率是 P(X=3)=1/6P(X=3)=1/6,硬币正面朝上的概率是 P(Y=Heads)=1/2P(Y=Heads)=1/2。那么骰子掷出3和硬币为正面同时发生的概率,那么这就是骰子掷出3和硬币为正面两个事件的联合概率:

P(X=3,Y=Heads)=P(X=3)×P(Y=Heads)=1/6×1/2=1/12P(X=3,Y=Heads)=P(X=3) \times P(Y=Heads)=1/6×1/2=1/12

这里,我们假设掷骰子、投硬币互不影响,这样掷骰子和投硬币就是独立的事件,因此它们的联合概率是它们各自的概率的乘积。

四、贝叶斯公式
4.1 公式介绍

贝叶斯公式是基于条件概率和联合概率定义的一个重要的数学公式,它的基本思想是:利用已知的结果,反推出原因的可能性。它为我们提供了一个计算后验概率的方法。后验概率是在获得新的证据或数据后,重新评估某个假设或事件发生的概率。

P(AB)=P(BA)P(A)P(B)P(A \mid B) = \frac{P(B \mid A) \cdot P(A)}{P(B)}

其中,B是已知的结果,A是可能的原因,P(A)是原因发生的概率,也叫做先验概率,P(B|A)是在原因发生的条件下,结果发生的条件概率,P(B)是结果发生的总概率。P(A|B)是在结果已知的条件下,原因发生的条件概率,也叫做后验概率。

举个例子:

假设你有一个朋友小明,他有时候会迟到。你想知道他迟到的原因。你知道他迟到可能有三种原因:睡过头、堵车、赖床

你还知道他睡过头、堵车、赖床的概率分别是0.2、0.3、0.5(这些就是先验概率)。

你还知道他在睡过头、堵车、赖床的情况下,迟到的概率分别是0.8、0.6、0.4(这些就是条件概率)。

那么,如果你知道他今天迟到了(这就是已知的结果),你可以用贝叶斯公式来求出他迟到的原因是睡过头、堵车、赖床的概率分别是多少(这些就是后验概率)。

我们用B表示他迟到这个结果,用Ai表示第i个原因(i=1,2,3),那么根据贝叶斯,可以计算出:

P(A2B)=P(BA2)×P(A)P(B)=0.60.30.80.2+0.60.3+0.40.5=0.333P(A_2 \mid B)=\frac{P(B \mid A_2) \times P(A)}{P(B)} = \frac{0.6 *0.3}{0.8*0.2+0.6*0.3+0.4*0.5} = 0.333

P(A3B)=P(BA3)×P(A)P(B)=0.40.50.80.2+0.60.3+0.40.5=0.370P(A_3 \mid B)=\frac{P(B \mid A_3) \times P(A)}{P(B)} = \frac{0.4 *0.5}{0.8*0.2+0.6*0.3+0.4*0.5} = 0.370

从上面的计算结果可以看出,他迟到的最可能的原因是赖床(后验概率最大),其次是堵车,最后是睡过头。

4.2 案例

思考题:在小明是产品经理并且体重超重的情况下,如何计算小明被女神喜欢的概率?

即 P(喜欢|产品, 超重) = ?

此时我们需要用到朴素贝叶斯进行求解:

P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重)
  • **P(产品, 超重|喜欢)和P(产品, 超重)的结果均为0,导致无法计算结果。**这是因为我们的样本量太少了,不具有代表性。
  • 本来现实生活中,肯定是存在职业是产品经理并且体重超重的人的,P(产品, 超重)不可能为0;
  • 而且事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的事件,但是,根据我们有限的7个样本计算“P(产品, 超重) = P(产品)P(超重)”不成立。

而朴素贝叶斯可以帮助我们解决这个问题。

  • 朴素贝叶斯,就是假定了特征与特征之间相互独立的贝叶斯公式。也就是说,朴素贝叶斯,之所以朴素,就在于假定了特征与特征相互独立。

所以,思考题如果按照朴素贝叶斯的思路来解决,就可以是

P(产品, 超重) = P(产品) * P(超重) = 2/7 * 3/7 = 6/49
p(产品, 超重|喜欢) = P(产品|喜欢) * P(超重|喜欢) = 1/2 * 1/4 = 1/8
P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重) = 1/8 * 4/7 / 6/49 = 7/12
五、代码实现
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
heart = pd.read_csv('../regress/heart.csv')
cp = pd.get_dummies(data=heart['cp'], prefix='cp')
thal = pd.get_dummies(data=heart['thal'], prefix='thal')
slope = pd.get_dummies(data=heart['slope'], prefix='slope')
frame = [heart, cp, thal, slope]
heart = pd.concat(frame, axis=1)
heart = heart.drop(columns=['cp', 'thal', 'slope'])
x = heart.drop(columns=['target'])
y = heart.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
model = MultinomialNB()
model.fit(x_train, y_train)
print(dt.score(x_test, y_test))