机器学习理论之:(2)朴素贝叶斯详细解读、公式推导和实例演练

贝叶斯公式回顾

P%28H%7Cx%29%20%3D%20%5Cfrac%7BP%28x%7CH%29P%28H%29%7D%7BP%28x%29%7D

  • 这里H可以认为是分类任务中的某一类,所以P%28H%7Cx%29可以表示在x条件下样本被判断为C类的概率,也称为后验概率。

贝叶斯公式示例

  • 当你周一去一家商店,你发现所有的灯都是 off 的,你会做什么推断?
  • 先验概率P%28H%29%3DP%28open%29%3D0.95即,通过统计数据,这家店开着的概率是 95%
  • 条件概率:
  • P%28off%7Copen%29%3D0.01, 当店铺开张的时候,灯灭的概率为 0.01
  • P%28off%7Cclosed%29%3D0.85当店铺关闭的时候,灯灭的概率为 0.85
  • 求后验概率P%28open%7Coff%29

先验概率和后验概率可以理解为:

  • P%28H%29P%28H%7Cx%29相比,一个H是预先知道的,所以是先验的,另一个是H需要在x的条件下计算,所以是后验

P%28open%7Coff%29%20%3D%20%5Cfrac%7BP%28off%7Copen%29P%28open%29%7D%7BP%28off%29%7D

P%28off%29%3DP%28off%2Copen%29%20%2B%20P%28off%2Cclosed%29%20%3D%20P%28off%7Copen%29P%28open%29%2BP%28off%7Cclosed%29P%28closed%29

P%28open%7Coff%29%20%3D%20%5Cfrac%7BP%28off%7Copen%29P%28open%29%7D%7BP%28off%7Copen%29P%28open%29%2BP%28off%7Cclosed%29P%28closed%29%7D

P%28open%7Coff%29%20%3D%20%5Cfrac%7B0.01%20%2A%200.95%7D%7B0.01%20%2A%200.95%20%2B%200.85%20%2A%20%281-0.95%29%7D%3D0.183

  • P%28x%7CH%29已知或可以估计时,贝叶斯公式允许我们计算P%28H%7Cx%29

朴素贝叶斯分类器

  • 我们已经知道:

P%28C%2CX%29%3DP%28C%7CX%29P%28X%29%3DP%28X%7CC%29P%28C%29

分类任务

  • 我们现在的任务是:将样本T(instance)进行分类,c_j%20%5Cin%20C,我们需要依次求出这个样本T对于每一类c_j
    的概率,然后选择最大的一个作为最终的预测类别。
    %5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28c_j%7CT%29
  • %5Chat%7Bc%7D代表最终分类的具体类别
  • argmax_%7Bc_j%5Cin%20C%7D表示从几个候选概率中选择最大值作为最终结果
  • P%28c_j%7CT%29表示给定条件Tc_j的分类概率

%5CbecauseP%28c_j%7CT%29%3D%5Cfrac%7BP%28T%7Cc_j%29P%28c_j%29%7D%7BP%28T%29%7D
%5Ctherefore%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7D%5Cfrac%7BP%28T%7Cc_j%29P%28c_j%29%7D%7BP%28T%29%7D

扔掉分母

%5Cbecause对于所有类别c_j%5Cin%20CP%28T%29的值都是一样的,所以我们可以在计算的时候把公式中的P%28T%29删掉,%5Chat%7Bc%7D在通过argmax选择最大概率值的过程中,仍然会选择正确的最大概率值。价值

%5Ctherefore%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28T%7Cc_j%29%7BP%28c_j%29%7D

  • 所以接下来的任务就是为每个类别c_j计算P%28T%7Cc_%7Bj%7D%29,然后选择最大的概率值,即样本T所属类别的概率。

T 作文

  • 那么让我们进一步探索,什么是T?我们说T是一个样本(或实例),那么这本书是由什么组成的呢?让我们来复习
import pandas as pd
columns = ['姓名','年龄','身高','是否婚恋','月薪','学历']
data = [['张三',18,181,1,18000,'本科'],
       ['李四',30,172,0,13000,'本科'],
       ['王五',14,198,1,8888,'本科'],
       ['赵六',18,176,0,3000,'本科']]

pd.DataFrame(columns=columns,data=data)
姓名年龄身高是否婚恋月薪学历
0张三18181118000本科
1李四30172013000本科
2王五1419818888本科
3赵六1817603000本科
  • 对于这个例子来说,每一行数据都是一个 instance,而组成每一个 instance 的,就是 attributes(属性),也就是说当我们选择第一行这个样本T,那么x_1%2C..x_n,就分别代表%5C%7Bx_1%2Cx_2%2C...x_n%5C%7D%20%3D%20%5C%7B%E5%BC%A0%E4%B8%89%EF%BC%8C18%EF%BC%8C181%EF%BC%8C1%2C%20...%5C%7D
  • 让我们回过头来看看我们上面的公式:
    %5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28T%7Cc_j%29%7BP%28c_j%29%7D
  • T%3D%5C%7Bx_1%2Cx_2%2C...x_n%5C%7D
    %5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28x_1%2Cx_2%2C...x_n%7Cc_j%29%7BP%28c_j%29%7D
  • 那么,怎么问P%28x_1%2Cx_2%2C...x_n%7Cc_j%29

为什么朴素贝叶斯是朴素的

  • 这就是为什么朴素贝叶斯被称为朴素的重要部分! ! ! !
  • 如果x_1%2Cx_2%2C...x_n不相互独立,那么概率的链式法则应该是这样的:

P%28x_1%2Cx_2%2C...x_n%7Cc_j%29%3DP%28x_1%7Cc_j%29P%28x_2%7Cx_1%2Cc_j%29...P%28x_n%7Cx1%2Cx2...%2Cx_n%2Cc_j%29

  • 在这种情况下,我们很难计算出这么大的一系列公式的计算
  • 但是朴素贝叶斯是“朴素的”,因为它有一个很强的假设,即x_1%2Cx_2%2C...x_n它们在c_j的条件下是相互独立的;

%5CthereforeP%28x_1%2Cx_2%2C...x_n%7Cc_j%29%20%5Capprox%20P%28x_1%7Cc_j%29P%28x_2%7Cc_j%29...P%28x_n%7Cc_j%29
P%28x_1%2Cx_2%2C...x_n%7Cc_j%29%20%5Capprox%20%5Cprod_i%7BP%28x_i%7Cc_j%29%7D

  • 如果使用朴素贝叶斯的粗略化简方法,分母的计算就会变得容易很多!
  • 如果你不明白这一点,请参阅条件独立部分:

条件独立:
假设x_1%2Cx_2c_j条件下是相互独立的,那么我们可以得到以下结论:

P%28x_1%2Cx_2%7Cc_j%29%3DP%28x_1%7Cc_j%29P%28x_2%7Cc_j%29

完全独立:假设现在x_1%2Cx_2是独立的随机变量,那么我们可以得到以下结论:

P%28x_1%2Cx_2%29%3DP%28x_1%29P%28x_2%29

  • 所以贝叶斯公式会在各个属性之间不完全独立的情况下产生不太好的结果,但是当面对各个 attribute 独立的数据,表现就会很好。
  • 通过上面的化简,我们可以进一步得到我们的类别计算公式:

%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28c_j%29%5Cprod_i%7BP%28x_i%7Cc_j%29%7D

整理一下:

  • 由于上面的推导过程有点微妙,这里是从零开始得到%5Chat%7Bc%7D的过程:

%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28c_j%7CT%29

%5CbecauseP%28c_j%7CT%29%3D%5Cfrac%7BP%28T%7Cc_j%29P%28c_j%29%7D%7BP%28T%29%7D

%5Ctherefore%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7D%5Cfrac%7BP%28T%7Cc_j%29P%28c_j%29%7D%7BP%28T%29%7D

%5CbecauseP%28T%29is equal for all categories

%5Ctherefore%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28T%7Cc_j%29%7BP%28c_j%29%7D

%5Cbecause%20T%3D%5C%7Bx_1%2Cx_2%2C...x_n%5C%7D

%5Ctherefore%20%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28x_1%2Cx_2%2C...x_n%7Cc_j%29%7BP%28c_j%29%7D

%5Cbecauseassumex_1%2C...x_nconditional independence

%5CthereforeP%28x_1%2Cx_2%2C...x_n%7Cc_j%29%20%5Capprox%20P%28x_1%7Cc_j%29P%28x_2%7Cc_j%29...P%28x_n%7Cc_j%29

P%28x_1%2Cx_2%2C...x_n%7Cc_j%29%20%5Capprox%20%5Cprod_i%7BP%28x_i%7Cc_j%29%7D

%5Ctherefore%20%5Chat%7Bc%7D%3Dargmax_%7Bc_j%5Cin%20C%7DP%28c_j%29%5Cprod_i%7BP%28x_i%7Cc_j%29%7D

如何得到先验概率P%28c_j%29

  • 因为分类任务是监督学习的一种,所以对于每条数据都是有 label 的,我们可以通过统计 label 中c_j出现的频次来得到P%28c_j%29

当我们得到一个数据集时,我们需要知道的概率是多少?

  • P%28c_j%29P%28x_i%7Cc_j%29为所有x_i%2C%20c_j

具体例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0Ty9TUX-1647111760800)(attachment:image.png)]

案例分析与介绍

  • 对于这个例子,我们先看类别c_j%20%5Cin%20C%3D%5C%7BFlu%2C%20Cold%5C%7D这是一个二分类问题
  • x_i%20%5Cin%20TT%20%3D%20%5C%7Bx_1%2Cx_2%2C...%2Cx_n%5C%7D%20%3D%20%5C%7BHeadache%2C%20Score%2C%20Temperature%2C%20Cough%5C%7D
  • 如果现在有一个人没有头痛,有轻微的肌肉疼痛,体温正常,没有咳嗽;他的样本T可以表示为:

T%20%3D%20%5C%7BHeadache%3Dno%2CSore%3Dmild%2CTemp%3Dnormal%2CCough%3Dno%5C%7D

  • 因此,此时我们可以计算出这个样本为Flu的概率,可以表示为:

P%28Diagnosis%3DFlu%20%7C%20Headache%3Dno%2CSore%3Dmild%2CTemp%3Dnormal%2CCough%3Dno%29

查找所有条件概率

  • 求所有条件概率 P%28x_i%7Cc_j%29P%28c_j%29
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uyZWg9y-1647111760801)(attachment:image.png)]

得到分类概率

我们在上面得到了所有必需的条件概率和先验概率:

  • 那么假设现在有一患者以轻度头痛(mild headache),严重酸痛(severe soreness),体温正常(normal temperature),无咳嗽(no cough)就诊。他们更容易得感冒(cold)还是流感(flu)?
  • 我们通过以后的概率来计算 Flu 和 Cold 分别的概率情况:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UIQM0fVo-1647111760802)(attachment:image.png)]

让我们看另一个例子:

  • 病人来诊时,有严重头痛(severe headache),轻度酸痛(mild soreness),高烧(high temperature),无咳嗽(no cough)。他们更容易得感冒还是流感?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xc9YcfKE-1647111760802)(attachment:image.png)]

概率平滑

%5Cepsilon代替 0

  • 从上面的例子中很容易发现一个问题:
  • 贝叶斯公式在计算的过程中,如果任何一个P%28x_i%7Cc_j%29%3D0那么最终的值就是 0;
  • 但是这些看起来都等于 0 的值真的是等价的么?
  • 为了解决这种 0 存在的问题,我们采用一个极小的、大于 0 的值:%5Cepsilon来代替 0
  • %5Cepsilon应该非常小,应该比任何一个不等于 0 的 P(x_i|c_j) 都小,因为只有这样,将 0 替换成%5Cepsilon才会在不改变结果的情况下解决 0 的问题
  • 在实际操作中,我们将比较两个公式中谁包含更多的%5Cepsilon%5Cepsilon越多,实际概率值越小。
  • 所以上面的第二个例子可以写成:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2fpF5A2-1647111760802)(attachment:image.png)]

拉普拉斯/加法平滑

  • 看不见的事件的计数为1
  • 其他事件也会增加1:一次看到的事件会变成2,两次看到的事件会变成3,等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrI94qDq-1647111760803)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwzOrckg-1647111760803)(attachment:image.png)]

  • 本例中,XHeadache事件时,X有3个值,所以d%3D3%5Calpha%3D1所以计算方法如上图
  • 最常用的拉普拉斯平滑方法是加一平滑(α=1,所有计数加1)
  • 当实例较少时,概率会发生巨大变化,但当实例较多时,概率变化较小
  • 众所周知,加一平滑会高估罕见事件的可能性
  • 但是 ε 或更低的 alpha 值会导致低估罕见事件的概率
  • 在实践中很难选择正确的α

缺失值

如果一个 instance 缺失了某些 attribute 怎么办?

  • 测试中的缺失值可以简单地忽略——从非缺失值中计算出每个类的可能性
  • 训练中的缺失值也可以忽略——不要将它们包括在属性类计数中,概率将基于非缺失值

朴素贝叶斯示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czQ3wL4Y-1647111760804)(attachment:image.png)]

  • 简单的图形数据集:
  • 形状是高还是宽
  • 它是椭圆形的还是矩形的?
  • 红色、黄色、蓝色或绿色
  • 训练集和测试集如下:
  • A 类和 B 类两种标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75Tg4SHC-1647111760804)(attachment:image.png)]

总结

为什么朴素贝叶斯有效

  • 我们不需要对每个类别的P%28c%7CT%29进行完美的估计,我们只需要大致知道
  • 忽略某些属性相关的事实使所有类别的概率更高,但通常不会改变它们的排名(更高的概率对每个人来说都更高,但相对不影响最大类别的选择)
  • 朴素贝叶斯在评估P%28x_i%7Cc_j%29时对小错误仍然具有鲁棒性,虽然这些小错误可以改变每个类的概率,但一般不会改变那些类的概率排序

朴素贝叶斯的优点

  • 简单易搭建,算法非常快
  • 计算可以很好地适应高维数据集(属性可以达到1000个)
  • 可解释的——通常很容易理解为什么模型会做出它所做的决定

朴素贝叶斯的缺点

  • 大量P%28x_i%7Cc_j%29缺失时不准确
  • 条件独立假设对于复杂系统是有问题的

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
上一篇 2022年3月15日 下午2:28
下一篇 2022年3月15日 下午2:54

相关推荐