“可能性较大”的二分类器
让我们尝试使用数据将一个点分为两个类别之一,选择我们认为可能性较大的类别。为此,我们不仅需要数据,还需要清楚地描述概率是如何参与的。
我们将从一个简单的人为设定开始,只是为了开发主要技术,然后转向一个更有趣的例子。
假设有一个大学班级,构成如下: - 60% 的学生是大二学生,其余 40% 是大三学生 - 50% 的大二学生已确定专业 - 80% 的大三学生已确定专业
现在假设我从班级中随机挑选一名学生。你能使用我们的“可能性较大”标准将该学生分类为大二或大三吗?
你可以做到,因为学生是随机挑选的,所以你知道该学生是大二学生的概率是 60%。这大于是大三学生的 40% 概率,因此你会将该学生分类为大二学生。
关于专业的信息是无关的,因为我们已经知道班级中大二和大三学生的比例。
我们有一个相当简单的分类器!但现在假设我告诉你关于被选中的学生的一些额外信息:
该学生已经确定了专业。
这个知识会改变你的分类吗?
import matplotlib
from datascience import *
path_data = '../../../assets/data/'
%matplotlib inline
import matplotlib.pyplot as plots
import numpy as np
plots.style.use('fivethirtyeight')
基于新信息更新预测
既然我们知道该学生已确定专业,那么考察年级与专业确定之间的关系就变得重要了。大二学生仍然比大三学生多。但在大三学生中,已确定专业的百分比远高于大二学生。我们的分类器必须同时考虑这两个观察结果。
为了可视化这一点,我们将使用一个表 students,其中包含 100 名学生,每人一行,其年级和专业比例与给定数据相同。
year = np.array(['Second']*60 + ['Third']*40)
major = np.array(['Undeclared']*30+['Declared']*30+['Undeclared']*8+['Declared']*32)
students = Table().with_columns(
'Year', year,
'Major', major
)
students.show(3)
<IPython.core.display.HTML object>为了检查比例是否正确,让我们使用 pivot 根据两个变量对每个学生进行交叉分类。
students.pivot('Major', 'Year')
Year | Declared | Undeclared
Second | 30 | 30
Third | 32 | 8总人数为 100 名学生,其中 60 名是大二学生,40 名是大三学生。在大二学生中,每个专业类别各占 50%。在 40 名大三学生中,20% 未确定专业,80% 已确定专业。因此,这 100 名学生的人群具有与问题中的班级相同的比例,我们可以假设我们的学生是从所有 100 名学生中随机挑选的。
我们必须选出学生最有可能在哪一行。当我们对学生一无所知时,他或她可能位于四个单元格中的任何一个,因此更可能位于第一行(大二学生),因为那里包含更多的学生。
但现在我们知道该学生已确定专业,因此可能结果的空间减小了:现在学生只能位于两个“已确定”单元格之一。
这些单元格中共有 62 名学生,其中 32 人是大三学生。这超过了一半,尽管不多。
因此,根据关于该学生专业的新信息,我们必须更新我们的预测,现在将学生分类为大三学生。
我们的分类正确的概率是多少?对于所有 32 名已确定专业的大三学生,我们是正确的;对于 30 名已确定专业的大二学生,我们是错误的。因此,我们正确的概率约为 0.516。
换句话说,我们正确的概率是已确定专业的学生中大三学生的比例。
32/(30+32)
0.5161290322580645树状图
我们刚刚计算的比例是基于一个 100 名学生的班级。但例如,只要单元格中所有比例都正确,这个班级完全可能有 200 名学生。那么我们的计算将会是 64/(60 + 64) = 0.516,与之前相同。
因此,计算仅取决于不同类别中的比例,而不取决于计数。这些比例可以在“树状图”中可视化,为了便于比较,直接显示在透视表下方。
students.pivot('Major', 'Year')
Year | Declared | Undeclared
Second | 30 | 30
Third | 32 | 8
与透视表一样,该图将学生划分为四个不同的组,称为“分支”。注意,“大三,已确定”分支包含学生的比例 0.4 x 0.8 = 0.32,对应于透视表中“大三,已确定”单元格的 32 名学生。“大二,已确定”分支包含学生的比例 0.6 x 0.5 = 0.3,对应于透视表中“大二,已确定”单元格的 30 名学生。
我们知道被选中的学生属于一个“已确定”分支;也就是说,该学生要么在最上面的分支,要么在第三个分支。这两个分支现在构成了我们缩减后的可能性空间,所有概率都必须相对于这个缩减空间的总概率来计算。
因此,在已知学生已确定专业的情况下,他们是大三学生的概率可以直接从树中计算出来。答案是“大三,已确定”分支相对于两个“已确定”分支总比例的比例。
也就是说,答案仍然是已确定专业的学生中大三学生的比例。
(0.4 * 0.8)/(0.6 * 0.5 + 0.4 * 0.8)
0.5161290322580645贝叶斯法则
我们刚刚使用的方法归功于牧师 Thomas Bayes(1701-1761)。他的方法解决了一个被称为“逆概率”的问题:在给定新数据的情况下,如何更新你之前发现的概率?尽管贝叶斯生活在三个世纪前,但他的方法现在在机器学习中被广泛使用。
我们将在学生总体的背景下陈述这个法则。首先,一些术语:
先验概率。 在我们知道被选中的学生的专业确定状态之前,该学生是大二学生的概率是 60%,是大三学生的概率是 40%。这是两个类别的先验概率。
似然。 这是在给定学生类别的情况下,专业状态的概率;因此它们可以从树状图中读出。例如,在给定学生是大二学生的情况下,已确定专业状态的似然是 0.5。
后验概率。 这是在我们考虑了关于专业确定状态的信息之后,两个年级类别的概率。我们计算了其中一个:
在已知学生已确定专业的情况下,该学生是大三学生的后验概率记为 $P(\text{Third Year} ~\Big\vert~ \text{Declared})$,计算如下。
$$ \begin{align} P(\text{Third Year} ~\Big\vert~ \text{Declared}) ~ &=~ \frac{ 0.4 \times 0.8}{0.6 \times 0.5 ~+~ 0.4 \times 0.8} \ \ &=~ \frac{\text{(prior probability of Third Year)} \times \text{(likelihood of Declared given Third Year)}} {\text{total probability of Declared}} \end{align} $$
另一个后验概率是
$$ \begin{align} P(\text{Second Year} ~\Big\vert~ \text{Declared}) ~ &=~ \frac{ 0.6 \times 0.5}{0.6 \times 0.5 ~+~ 0.4 \times 0.8} \ \ &=~ \frac{\text{(prior probability of Second Year)} \times \text{(likelihood of Declared given Second Year)}} {\text{total probability of Declared}} \end{align} $$
(0.6 * 0.5)/(0.6 * 0.5 + 0.4 * 0.8)
0.4838709677419354这约为 0.484,小于一半,与我们将其分类为大三一致。
注意,两个后验概率具有相同的分母:新信息(即学生已确定专业)的概率。
因此,贝叶斯方法有时被总结为一个关于比例关系的陈述:
$$ \text{posterior} ~ \propto ~ \text{prior} \times \text{likelihood} $$
公式对于高效描述计算非常好。但在像我们关于学生的例子这样的情境中,不从公式的角度思考会更简单。只需使用树状图即可。