机器学习(五)常用分类模型(K最近邻、朴素贝叶斯、决策树)和分类评价指标
综述
在上一篇博文中,我介绍了一个非常经典的分类模型——逻辑回归,在这篇博文中,我将着重讨论以下两个问题:
- 除了逻辑回归之外,还有哪些分类模型呢?
- 我如何评价我的建立的分类预测模型好不好呢?
接下来,就让我介绍三个分类模型,分别是:
- K最近邻模型
- 朴素贝叶斯模型
- 决策树模型
常用分类模型
K最近邻模型
K最近邻模型(K Nearest Neighbour,KNN)是一种十分简单的分类模型。它是懒惰学习的代表模型。它的主要思路如下:
假设我们收集到了一系列样本,它们各自有自己已知的类别,为了方便可视化,我们假设它是一个二维数据,颜色代表它的类别,把它们用散点图的方式表示出来:
这时,假如我们有另外一组未知分类的样本,我们如何去预测它的类别呢?KNN模型的思路非常简单:寻找在空间上离它最近的几个点,看这几个点中哪一个类别的数据多,我们就认为它更接近于这个类别,就判断它属于这个类别。这里我们以寻找最近的三个点为例:
我们看出图中绿点周围有2个红点1个蓝点,因此我们认为它和红色点属于同一类别。总结来说,KNN模型就是寻找待测点周围的已知点,然后根据已知点的类别,以一种类似投票的方式选出合适的类别。这也是“K最近邻”这个名称的由来。同时,我们也可以理解为什么说KNN模型是“懒惰学习”的代表了,因为它跟前面几个模型不一样,它实际上并没有对某个模型进行训练,只是单纯地把数据存储了起来。
但是随之而来的问题就是,我们如何确定要找几个点?这就是KNN模型中的超参数,一般情况下,我们需要依靠经验和网格搜索法,确定这个超参数。
另外,当数据量较大时,其实寻找最近的几个点的过程其实还是比较缓慢的,这时我们就需要采用一些特殊的数据结构来进行快速地搜索。对于KNN我们一般会采用一种叫做KD树的数据结构来查找最近邻点。
KNN模型的优缺点:
优点:
- 模型简单易解释
- 训练速度快
缺点:
- 对于复杂数据,简单模型容易产生欠拟合的问题
- 占用存储空间大, 空间复杂度高
朴素贝叶斯模型
朴素贝叶斯(Naive Bayes)模型也是一个非常简单常用的分类模型,它主要是应用了数理统计中非常重要的贝叶斯公式:
P
(
B
i
∣
A
)
=
P
(
B
i
)
P
(
A
∣
B
i
)
∑
P
(
B
j
)
P
(
A
∣
B
j
)
P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum P(B _j)P(A|B_j)}
P(Bi∣A)=∑P(Bj)P(A∣Bj)P(Bi)P(A∣Bi) 举一个简单的例子说明朴素贝叶斯的流程,假设我们收集了一些邮件,其中有一部分是垃圾邮件,一部分是正常邮件。我们采集了一些特征,简单起见,我们只取两个特征:是否是虚拟账号发出,是否有图片。我们用如下的变量来进行表示:
- C = 1 C=1 C=1表示垃圾邮件, C = 0 C=0 C=0表示正常邮件。
- F 1 = 1 F_1=1 F1=1表示是虚拟账号发出, F 1 = 0 F_1=0 F1=0表示不是虚拟账号发出。
- F 2 = 1 F_2=1 F2=1表示有图片, F 2 = 0 F_2=0 F2=0表示没有图片。
假设我们有一个 F 1 = 1 , F 2 = 0 F_1=1,F_2=0 F1=1,F2=0的邮件,我们如何预测它是否为垃圾邮件呢?首先我们要根据我们已经搜集到的数据,在垃圾邮件和正常邮件中计算出各个变量各个取值的概率,假设垃圾邮件在我们搜集到的邮件中占50%,举例如下:
C = 0 C=0 C=0 | C = 1 C=1 C=1 | |
---|---|---|
F 1 = 0 F_1=0 F1=0 | 0.8 | 0.3 |
F 1 = 1 F_1=1 F1=1 | 0.2 | 0.7 |
F 2 = 0 F_2=0 F2=0 | 0.6 | 0.2 |
F 2 = 1 F_2=1 F2=1 | 0.4 | 0.8 |
实际上,我们就得到一系列的条件概率,我们可以把上面的预测问题转化为计算
P
(
C
∣
F
1
=
1
,
F
2
=
0
)
P(C|F_1=1,F_2=0)
P(C∣F1=1,F2=0) 根据上面的贝叶斯公式,可以得到:
P
(
C
=
0
∣
F
1
=
1
,
F
2
=
0
)
=
P
(
C
=
0
)
P
(
F
1
=
1
,
F
2
=
0
∣
C
=
0
)
P
(
C
=
0
)
P
(
F
1
=
1
,
F
2
=
0
∣
C
=
0
)
+
P
(
C
=
1
)
P
(
F
1
=
1
,
F
2
=
0
∣
C
=
1
)
P(C=0|F_1=1,F_2=0) =\frac{P(C=0)P(F_1=1,F_2=0|C=0)}{P(C=0)P(F_1=1,F_2=0|C=0)+P(C=1)P(F_1=1,F_2=0|C=1)}
P(C=0∣F1=1,F2=0)=P(C=0)P(F1=1,F2=0∣C=0)+P(C=1)P(F1=1,F2=0∣C=1)P(C=0)P(F1=1,F2=0∣C=0)这时,我们假设
F
1
,
F
2
F_1,F_2
F1,F2之间的取值是相互独立的,于是就有:
P
(
F
1
=
1
,
F
2
=
0
∣
C
=
0
)
=
P
(
F
1
=
1
∣
C
=
0
)
P
(
F
2
=
0
∣
C
=
0
)
P(F_1=1,F_2=0|C=0)=P(F_1=1|C=0)P(F_2=0|C=0)
P(F1=1,F2=0∣C=0)=P(F1=1∣C=0)P(F2=0∣C=0) 这就变成了我们能用上面的数据计算的形式。通过算出它属于每一种类别的概率,我们就可以取概率最高的作为它的分类。
假设各特征的取值是独立的是朴素贝叶斯的最根本的假设,也是朴素这个名称的由来。值得注意的是,上面这种朴素贝叶斯方法应当被称作伯努利朴素贝叶斯模型,它的要求是所有的特征都必须是离散的。真正的朴素贝叶斯包括了伯努利朴素贝叶斯、多项式朴素贝叶斯模型和高斯朴素贝叶斯模型,在这里不再深入讨论。
朴素贝叶斯模型常常用于文本分类,比如上面的例子里提到的将电子邮件分类为垃圾邮件和正常邮件,将报纸上的文章分为不同的主题等等。笔者曾在编写简单人脸识别器时使用了高斯朴素贝叶斯模型,效果也不错(虽然最后换用了支持向量机)。
朴素贝叶斯模型的优缺点总结如下:
优点:
- 模型简单,训练速度快。
- 有数学理论的支持,易解释。
缺点:
- 容易出现欠拟合。
- 在变量之间取值较为独立时,模型效果才较好。
决策树
决策树(Decision Tree)是树模型的基础,与现在真正广泛应用的集成模型非常相关。此外,它也是一种白盒模型,决策树模型非常容易进行可视化,即使完全不懂模型的人看到了决策树的可视化图也可以完全地理解这个决策过程。
决策树实际上就是模仿人的决策过程。举个例子,假设同学甲正在考虑今天是否要去公园玩。他首先会看看今天是否会下雨,如果下雨就不去,如果不下雨,再考虑今天是否有未完成的工作,如果没有未完成的工作,就去,有未完成的工作,他再考虑是否有朋友约他去玩,有就去没有就不去。画出他的决策过程如下:
决策树就是模仿这种决策过程,具体的流程如下:
- 首先选定一个评判标准,来衡量数据种类的混乱度,样本中包含的不同数据种类的个体越多,混乱度越大。
- 然后选定一个分割标准,将数据分割成两部分,而且分割后,两堆数据的混乱度之和最小。
- 重复第二步直到不能再分。
接下来我们来逐一讨论,首先,如何定义数据的混乱度呢?在物理学中,我们用“熵”来作为混乱度的描述,而在机器学习中,一般采用基尼系数和交叉熵作为混乱度的描述,交叉熵我们前面已经介绍过了,这里给出基尼系数的定义:
G
i
n
i
=
1
−
∑
p
i
2
(
p
i
为
类
别
i
在
样
本
中
出
现
的
概
率
)
Gini=1-\sum p_i^2(p_i为类别i在样本中出现的概率)
Gini=1−∑pi2(pi为类别i在样本中出现的概率) 有了混乱度的定义,我们就可以通过贪心算法寻找最优的分割点,确定分割指标。
其实在理论上可以看出,这个模型和前面讲的三个分类模型(包括逻辑回归)不同的是,只要不出现两个特征完全相同但分类不同的个体,这样不断地分下去,就一定能把这些数据的类别100%分对,换句话说就是在训练集上达到100%的准确率,这就存在了一个问题——过拟合,决策树很有可能变成一个在训练集上表现良好但预测效果很差的模型。
这时,我们就要对决策树进行剪枝,比如设定决策树的最大深度,或者设定决策树的结点在样本数小于某个值后就不再分了,这样可以有效地减轻决策树的过拟合。还有另一种防范过拟合的方法,就是将决策树“升级”成随机森林,这将在集成模型那一部分进行介绍。
决策树的优缺点:
优点:
- 容易可视化,清晰明了。
- 在训练集上表现良好。
缺点:
- 比起前面两个模型,它的训练速度较慢。
- 容易发生过拟合。
常用分类指标
准确率、精确率和召回率
接下来我们来讨论如何评价一个分类模型是否优秀。针对二元分类问题,我们可以把真实值、预测值的情况分为以下几种:
真实值:1 | 真实值:0 | |
---|---|---|
预测值:1 | 真阳性(TP) | 伪阳性(FP) |
预测值:0 | 伪阴性(FN) | 真阴性(TN) |
不难看出,我们实际上预测正确的是TP和TN两部分,于是给出第一个评价指标准确率:
A
c
c
u
r
a
c
y
=
T
P
+
T
N
T
P
+
T
N
+
F
N
+
F
P
Accuracy=\frac{TP+TN}{TP+TN+FN+FP}
Accuracy=TP+TN+FN+FPTP+TN再给出另外两种评价指标:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision=\frac{TP}{TP+FP}
Precision=TP+FPTP
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall=\frac{TP}{TP+FN}
Recall=TP+FNTP
分别称为精确率和召回率。这两个指标有什么含义呢?在数理统计中,我们知道有第一类错误和第二类错误两类错误,而这里的
F
P
FP
FP就表示了第一类错误,
F
N
FN
FN就表示了第二类错误,也就是说,实际上,精确率是衡量第一类错误的指标,召回率是衡量第二类错误的指标。但这之中又存在了一个问题,我们在数理统计中知道,犯第一类错误的概率和犯第二类错误的概率往往是成负相关的,那我们就需要一个综合的指标来衡量模型的效果,于是引入了F1 Score:
F
1
=
2
P
r
e
c
i
s
i
o
n
⋅
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F_1=\frac{2Precision\cdot Recall}{Precision+Recall}
F1=Precision+Recall2Precision⋅Recall 也就是说F1 Score实际上是精确率和召回率的调和平均数。更一般地,有:
F
β
=
(
1
+
β
2
)
P
r
e
c
i
s
i
o
n
⋅
R
e
c
a
l
l
β
2
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F_{\beta}=(1+\beta^2)\frac{Precision\cdot Recall}{\beta^2Precision+Recall}
Fβ=(1+β2)β2Precision+RecallPrecision⋅Recall 我们一般就是采用上面这些指标衡量模型的优劣。
ROC曲线和AUC
对于像逻辑回归这样的分类模型,我们实际上是求出它是类别1的概率,然后选定一个阈值 α \alpha α,根据概率和 α \alpha α的大小关系,来确定它属于哪一种分类。由此我们来定义一个坐标系:
- y y y轴是真阳性率 T P R = T P / ( T P + F N ) TPR=TP/(TP+FN) TPR=TP/(TP+FN)
- x x x轴是伪阳性率 F P R = F P / ( F P + T N ) FPR=FP/(FP+TN) FPR=FP/(FP+TN)
让阈值从0取到1,计算每一个阈值下的伪阳性率和真阳性率,把这些点标在坐标系中,我们近似可以得到一个图像:
这条曲线就被称为ROC曲线,我们对这条曲线在(0,1)内作积分,得到ROC曲线下的面积,定义为AUC(Area Under Curve)。
AUC是一个综合反映不同阈值下模型评估结果的指标,它还是一个在数据集非均衡时不会失真的指标,被广泛应用于评价模型的好坏。
利用以上介绍的几种指标都能够在一定程度上反映分类模型的好坏,具体采用哪种分类指标要根据实际情况来进行确定。
小结
在这篇博文中,主要介绍了三种简单的分类模型:KNN,朴素贝叶斯和决策树,其中KNN是一种非常简单的模型,朴素贝叶斯常用于NLP领域,决策树是树模型的基础。然后介绍了一些评价指标,其中我认为最实用的应属F1 Score和AUC。在下一篇博文中,将会介绍一种非常神奇、被称为“万能分类器”的分类模型——支持向量机。