You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 12 | 朴素贝叶斯让AI告诉你航班延误险该不该买
你好,我是海丰。
今天我们接着来讲一个基础的分类算法朴素贝叶斯NBMNaive Bayesian Model也可以简称 NB 算法。
你可能想说,贝叶斯我听过,什么叫朴素贝叶斯呢?其实,朴素贝叶斯就是我们在贝叶斯原理的基础上,预先假定了特征与特征之间的相互独立。那特征之间的相互独立是什么意思呢?简单来说,一个人的性别是女性和她是中国国籍这两项特征就是相互独立的,因为她的国籍不会影响到她的性别。那特征之间不相互独立也很好理解了,像是一个人的身高会影响他衣服的尺码,所以身高和衣服的尺码就不是相互独立的。
那特征与特征之间相互独立的好处是什么呢?朴素贝叶斯算法怎么解决分类问题呢?我们又该怎么使用它呢?今天,我们就通过一个预测购买航班延误险的例子,来给你详细讲一讲。
## 如何理解 朴素贝叶斯 算法?
有的同学可能对贝叶斯算法还不是非常熟悉,或者忘得差不多了,所以在讲朴素贝叶斯算法之前,我们先来说说贝叶斯算法以及相关的基础概念。
### 1\. 贝叶斯的原理
贝叶斯是由一名英国数学家提出来的,贝叶斯就是这个数学家的名字。那它是干什么的呢?
比如说,我们拿到一个长得很大的西瓜,拍一拍它会有咚咚咚的声音,而且这个西瓜的价格还特别贵,那我们就觉得它应该挺甜。虽然这个西瓜不一定是甜的,但是这些经验可以帮助我们在一定概率下找到甜西瓜。
这就是贝叶斯的原理:**当不知道这个事物实际情况的时候,我们可以根据一些相关的条件来判断这个事物的本质**。与贝叶斯相关的基础概念有 3 个,分别是**条件概率、先验概率、后验概率**。
**条件概率**就是事件 B 在另一个事件 A 已经发生条件下的概率,记作 P(B|A)。在统计学中,也称之为似然函数。比如说,北京下雨后,发生道路堵车的概率。
**先验概率**是事件 A 或 事件 B 是根据经验来判断发生的概率,记作 P(A)、P(B)。比如说,今天我面试了某厂的员工,根据过去的经验这个公司来的员工都很优秀,所以我判断这个人大概率也很优秀。
**后验概率**是我们已经看到某个事情发生了,再判断这个事情发生原因的概率,即**在事件已经发生后,推测原因**。比如 P(A|B) 是已知 B 发生后 A 的条件概率,也叫做 A 的后验概率。比如说,我们知道一个西瓜很甜,这个西瓜很甜的原因可能是土壤好,光照充分等等。这个时候,一个西瓜很甜是因为它的土壤非常好的概率,就是后验概率。
实际上,**贝叶斯的原理就是根据先验概率和条件概率估算得到后验概率。**
### 2\. 朴素贝叶斯的原理
朴素贝叶斯就是在贝叶斯的原理上,加了一个前提假设:所有的条件对结果都是独立发生作用的。这该怎么理解呢?
我们先来看朴素贝叶斯的公式:
$$
\\mathrm{P}(A \\mid B)=\\frac{P(B \\mid A) P(A)}{P(B)}
$$
你可能会说,看到公式我就头大。别着急,我们这就来快速理解一下这个公式。我们假设,公式里的 A 代表堵车B 代表北京下雨P 代表概率,所以我们可以得到这几个概率:
* P(A):堵车的概率,也就是事件 A 发生的概率;
* P(B):下雨的概率,也就是事件 B 发生的概率;
* P(B|A):在堵车的情况下,北京下雨的概率,也就是在 A 的情况下,发生 B 的概率;
* P(A|B):在北京下雨的情况下,堵车的概率,也就是在 B 的情况下,发生 A 的概率。
那朴素贝叶斯公式就可以理解成是在北京下雨的情况下,求堵车的概率。根据过往的统计结果,我们可以得到 P(A)=60%P(B)=30%P(B|A)=40%根据公式P(A|B)=P(B|A) P(A)/P(B) = 40% \* 60% / 30% = 80%。也就是说,在北京下雨的情况下,有 80% 的可能性会堵车。
因此,**在实际的应用中,朴素贝叶斯更适用于文本分类、情感分析、垃圾邮件分类这类场景,毕竟这些数据的相互独立性更高。另外,朴素贝叶斯还会和协同过滤一起,使用到推荐系统中**。当然,在实际工作中,贝叶斯的应用会更加复杂。接下来,我就以售卖机票的场景下,是否增加延误险的需求为例,来给你讲讲它的应用。
## 朴素贝叶斯的应用案例
之前,国内的 OTA 行业Online Travel Agency在线旅行行业基本都接入了延误险。业内的做法是在售卖机票的时候直接搭售延误险但这样的产品设计对于用户体验来说是有损害的用户往往在不知情的情况下购买了本不需要的产品。
这个时候,我们就可以通过预测航班是否可能延误,给用户提一个航班延误概率的提示,让用户自己做主是否有购买延误险。从平台角度来说,这既丰富了平台的产品,又提高了总体 GMV从用户角度来说这既不需要面对不存在的延误险和机票的捆绑销售又有了更多的选择和参考。
那我们该怎么去判断航班是否可能延误呢?我们可以用朴素贝叶斯快速构建一个模型进行预测。具体的做法是这样的:我们已经知道,决定航班是否延误最主要的因素就是起飞地和降落地的天气情况。假设这些原因之间完全没有影响,那么我们可以去收集过去的飞行数据,计算出每一个条件,比如天气和飞机延误之间的关系。
假设,我们的用户正在浏览北京飞往深圳的航线,他坐飞机的时间段内,起飞地北京的天气是雪天,降落地深圳是雨天。
![](https://static001.geekbang.org/resource/image/1f/64/1fa56937887d610813dff502008fab64.jpeg?wh=1920*622)
上面这些条件,我们给它们都分配一个代号。其中,北京的天气是雪天是 A1深圳的天气是雨天是 A2飞机延误的概率是 B1不延误的概率是 B2。这样一来我们就可以统计飞机延误和不延误情况下北京是雪天和深圳是雨天的概率了。那么上面那些概率就可以变换为
* 飞机延误的情况下,北京天气是雪天 = P(A1|B1) = 20%
* 飞机延误的情况下,深圳天气是雨天 = P(A2|B1) = 40%
* 飞机不延误的情况下,北京天气是雪天 = P(A1|B2) = 10%
* 飞机不延误的情况下,深圳天气是雨天 = P(A2|B2) = 10%
根据历史数据,我们可以得到总体延误的概率为 P(B1) = 30%,不延误的概率是 P(B2)= 70%。这个时候,根据我们之前讲的贝叶斯公式,就可以得到北京雪天同时深圳雨天的时候,飞机延误和不延误的概率了,具体公式如下所示。
* 飞机发生延误的概率是P(B1|A1A2) = P(A1A2|B1) \* P(B1) / P(A1A2)
* 飞机不发生延误的概率是P(B2|A1A2) = P(A1A2|B2) \* P(B2) / P(A1A2)
虽然这两个公式中的分母 P(A1A2) 我们不知道是多少,但我们直接比较分子就可以知道延误概率和不延误概率哪个更大。把具体的数值套入到公式中,我们就能得到发生延误的概率是 24%,不发生延误的概率是 7%,计算公式如下:
* P(A1|B1) \* P(A2|B1)\*P(B1)/P(A1)\*P(A2) = 20% \* 40% \* 30% = 24%
* P(A1|B2) \* P(A2|B2)\*P(B2)/P(A1)\*P(A2) = 10% \* 10% \* 70% = 7%
这样一来,当用户在浏览这个航线的时候,我们就可以提示用户,“该航线大概率会延误,请您按需购买延误险”。
## 朴素贝叶斯的优缺点
朴素贝叶斯的优点主要有两个,首先是算法的逻辑简单,因为它的核心就是贝叶斯公式,所以它实现的过程是不需要训练的,算法计算的时候对资源也占用比较小。
因此,当公司没有算法工程师的情况下,如果你想做一些相对简单并且条件比较独立的事件预测时,你完全可以对研发工程师提出这样的要求:由你来提供相应的条件,研发工程师通过公式来帮你预测结果。
**这个时候你不只是一个需求提出方还是一个解决方案架构师能够推动一个需求从0到1 的落地,同时还不需要公司提供额外的资源,这就是你价值的体现。**
但是由于朴素贝叶斯有一个假设前提,就是各个条件之间相互独立,互不影响。这让它的使用非常有局限性,只有在条件比较少,并且相互独立的时候,朴素贝叶斯的效果才会比较好。可是,现实世界中这种情况往往不存在,所以在面对条件个数比较多,或者条件之间有一些相关性的时候,朴素贝叶斯得到的效果就会差很多。
## 总结
今天,我带你一起学习了第三个分类算法,朴素贝叶斯。作为产品经理,我们首先要记住,这个算法的核心来自于贝叶斯公式,算法的前提假设是,算法中各个条件相互独立、互不影响。
同时,为了帮助你加深理解,我也把它的原理和基础概念总结在了下面的表格里。
![](https://static001.geekbang.org/resource/image/5y/9b/5yy7851e2d518fc67938e3d4e3e38a9b.jpeg?wh=1920*884)
接着,我们要重点掌握朴素贝叶斯的应用场景,我从两个方面帮你做了总结。
从算法适合的场景上来说,朴素贝叶斯比较适合用于垃圾邮件分类,用户情感预测这些和文本处理相关的场景,这些场景中,算法依赖的条件相互之间比较独立,所以适合用朴素贝叶斯算法来做。
从算法开发成本上来说,朴素贝叶斯适合项目周期比较紧张,算力资源不太充足的情况,因为朴素贝叶斯模型相对简单,构建过程不会太复杂,占用时间相对比较短,并且由于其相对简单的特点,对于算力的要求也不会太高。
## 课后讨论
假设,我们业务方 HR 团队希望你分析每一个员工的离职概率,你觉得用朴素贝叶斯合不合适?为什么?
欢迎在留言区写下你的思考和疑惑,也欢迎你把这节课分享给你的朋友,我们下节课见!