决策树,随机森林,k邻近模型
在本章,小弟将与大家分享一些在机器学习里很常用的模型,机器学习这个领域是计算机科学和数据科学的杂糅,过去它有时候经常被称为数据挖掘(Data mining)或者人工智能。但我们又不能很轻易的说机器学习就是统计模型,举个例子,在自然语言处理中有个注意力机制,说白了,就是平常我们说话时候,不是每个字都很重要,而是有各别几个字才是重点,预测区分哪些字关键哪些字不关键,从而可以找到相关内容,例如百度搜索:“家人觉得计算机不错,想叫我学计算机有没有人知道计算机相关的论坛或者博客,谢谢!”,我们便可以得到CSDN网站或者相关内容,这样的形式在统计模型中不会有的。再举个例子生成照片,小弟说的简单一些,得到数据照片后,将照片内容的数据像素分布投影到另一个分布上面(啥是分布,说白了就是鼻子,嘴巴,眼睛的位置,利用数学的分布表示出来,在投影到另一个新的分布上,相当于鼻子嘴巴眼睛的位置有所变动),从而得到新的照片,再和真的照片进行比对优化其实就是调参更新参数,看生成的照片像不像那回事,别生成的照片鼻子在嘴巴下面,像这样进行优化和模型,在统计模型里也是不常见的。例如生成在现实中本不存在的人或风景照片或者将我们的照片变成油画素描等等。所以小弟认为,机器学习本质就是一种预测,无论是生成照片还是通过判断关键字从而查找内容,它们都是预测后,在做些关于预测目的的事情得到我们的结果。那么在机器学习里有这么耳熟能详的几个模型:
1.决策树
2.随机森林
3.支持向量机(SVMs)
4.神经网络
5.深度神经网络(深度学习)
6.簇
7.混合模型
8.自码器(VAE,variational autoencoders)
这些机器学习的模型其实它的老祖宗还是传统的统计模型,只是表达的形式,或者优化的方法有很大差别,例如利用神经元和各种层的形式表达数学和统计预测,利用注意力机制或者比对照片来优化更新参数,说白了只不过是孩子长大了,跟老祖宗长的不太像了,孩子会玩的东西丰富了,但根还是统计和预测。
小弟再带大家回顾下第8章的交叉验证(Cross Validation), 交叉验证这个方法经常用在深度学习里去控制模型的复杂度,说白了,就是看模型里那个变量重要那个变量不重要,控制复杂度就这意思。
小弟用一个伪代码来重新阐述下交叉验证
#交叉验证
for (r=尝试不同的变量组合):
for i in (1,m):m次循环取数据,m尽量大点,m越大估计越稳定,但运行太久了,自己定m的值
将取到的数据化分为K等份,y(1),y(2),...,y(K)
for k in (1:K):
估计模型M(r)的参数利用数据y(j),(j!=k)
利用估计参数后的模型M(r)来预测数据y(k)
计算预测误差,即MSPE
取了m次数据,再计算m个MSPE的均值,即计算EMSPE,交叉验证里喜欢叫它为CV error
比较不同变量组合的EMSPE,用最小EMSPE的变量组合。
一. 决策树(Decision Tree)
决策树是非线性机器学习模型,它属于可监督式学习,我们也可以大致的把它写成:
y
ˉ
(
x
1
,
x
2
,
.
.
.
,
x
p
)
=
f
(
x
1
,
x
2
,
.
.
.
,
x
p
)
\bar y(x_1,x_2,...,x_p)=f(x_1,x_2,...,x_p)
yˉ(x1,x2,...,xp)=f(x1,x2,...,xp)
在第7章和第6章中对于线性回归和二元逻辑回归,我们也可以写成这种泛化形式,只是区别在于,对于线性回归和二元逻辑回归
f
(
⋅
)
f(·)
f(⋅)为线性的,但对于决策树
f
(
⋅
)
f(·)
f(⋅)为非线性的。
小弟举两个例子,带大家先浅显得了解决策树长什么样子。
例子1(决策树处理分类数据,即分类):
上图方块节点即为树叶,树叶即为我们的预测,圆形节点即为划分条件,即为我们的变量,如果变量为性别,那么根据是男是女将数据划分开.方块节点写成X/Y的形式,假如我们的预测变量为是否高血压,那么则有X个人没有得,Y个人有高血压。那么患高血压的概率为
Y
X
+
Y
\frac{Y}{X+Y}
X+YY,那么我们便可以得到
7
53
+
7
\frac{7}{53+7}
53+77≈12%,那么属于女性的数据,在通过年龄变量划分,小于50岁的,和大于等于50岁的数据,再通过概率来预测是否得高血压。
例子2(决策树处理数字数据,即回归):
上图绿色为为我们的真实回归曲线,黄色即为我们决策树的回归曲线。在黄色线中,有几个横线意味着有几个树叶即我们对于y的预测,所以这个决策树有5个叶子节点。有几个竖线即为我们的划分条件,为我们的变量,我们将它化为决策树的图像即下图:
将数据的变量以x=-0.4划分两部分,小于-041的这一部分数据,然后计算它们的y值的均值得Y=1.9,作为我们得预测即叶子。
根据上述两个例子,大家会发现决策树可以处理回归和分类。但切记决策树不一定是二叉树,也不是什么平衡二叉树,什么满二叉树,它就是一个决策分析的模型。在性别中我们也可分为三类,男,女,中性,那样我们的树会多出一个分支。至于长什么样子,完全取决于我们的数据。当然了,我们可以基于这个树,再结合我们的数据结构将其优化,假如这个树是二叉树,但时间复杂度为O(n),我们可以优化为O(logn).
言归正传,如果我们有L个叶子,即意味着对于一个y值有L个预测。根据变量的条件,一步步筛选直到其中的一个预测即叶子。那么通过变量划分出的数据区域则也有L个即 R 1 , R 2 , . . . , R L R_1,R_2,...,R_L R1,R2,...,RL,划分出的数据区域之间的交集为空集也就是没重复的数据也可以说没有重复的个体。每个数据区域都有一个模型来诠释该区域的数据,从而得到对应的y值预测,即为我们的叶子。
对于回归来说,模型通常是正态分布,也就是我们的预测即期望 E [ y ] = μ E[y]=\mu E[y]=μ,也就是计算均值,正如第二个例子。
如果是分类,那么就是伯努利分布,正如第一个例子,计算成功率罢了。
那么对于决策树来说,它的模型复杂度即为多少个叶子,L。叶子越多,决策树模型越复杂,更容易诠释我们的数据,但小心过饱和。
那么重点来了,我们如何产生决策树?
产生决策树
首先产生决策树分为两大部分,第一大部分利用负log似然(其实就是损失函数)来决定如何划分数据,第二大部分利用信息准则(AIC 或者BIC,等)或者交叉验证法来决定有多少个叶子,或者说划分多少个数据区域才是合适的。大家必须明白这个逻辑,否则会认为第一部分和第二部分是一样的,认为重复了没有意义。第二部分在说,是否我们需要增加节点。第一部分在说,用哪个变量来当该节点来划分数据更好。明白这逻辑后,我们来看看如何产生决策树的。
还记得第6章所讲到正向逻辑么,产生决策树一般大逻辑框架就利用这个正向逻辑。
第一步:产生一个叶子(作为我们的父节点,也就是没有任何变量,直接预测我们的y变量),计算下信息准则的值
第二步:利用负log似然来决定哪个变量来划分,尝试每个变量替代叶子,再计算下信息准则。
第三步:如果没有任何划分可以使信息准则的值变的更小,那就结束
第四步:选择最小信息准则值的树
第五步:跳到第二步
我知道小弟表达能力不好,大家肯定没懂。
我们来几张图就明白了,我们依然根据上述高血压的例子。
一开始,我们的节点即为我们的预测,然后计算它的信息准则值为175.13。77/108意味着,我们直接看有多少人得高血压108个人,有哪些人不得高血压77个人,那么根据数据得高血压概率为
108
108
+
77
\frac{108}{108+77}
108+77108
根据负log似然,我们发现性别(Sex)这个变量比其他变量划分数据效果更好,那么我们利用性别来充当这个叶子,再计算下它的信息准则值
比之前的175.13,更小一些,那么我们用这棵树。
根据负log似然,我们发现年龄(Age)这个变量比其他变量划分数据效果更好,那么我们利用年龄来充当叶子,再计算下它的信息准则值
比之前的173.70,更小一些,那么我们用这棵树。
根据负log似然,我们发现年龄(Age)这个变量比其他变量划分数据效果更好,那么我们利用年龄来充当叶子,再计算下它的信息准则值
比之前的172.10,更大一些,那么我们不要用这棵树。依旧用原先的树,之后反复同样操作。
从上述构造决策树来看,它其实是一个贪心算法,每次都选取最小值的信息准则,虽然不一定是最优解,但也会预测的不错,毕竟省时间,否则各种情况搭配(也就是各种树的样子)都试一次,时间消耗太大。举个例子,在计算机编程问题里有个问题叫背包问题,也就是你的背包容量有限,要用你的背包能拿下最大价值的物品。如果你单纯的按照哪个物品贵就装哪个物品,很明显是不行的,如果你按照每个物品的平均容量价值去装,也是不行的。要有个搭配,需要用到动态分布的知识。小弟这里就不展开讨论了。但小弟想说的就是贪心算法并不一定是最优解。
那么我们现在来看下如何利用负log似然来决定哪个变量来划分
选择变量:
当变量为分类数据时:这里我们简化为二元分类(0和1),如果是多元分类,可根据第6章所讲的处理分类变量内容,化为多个二元分类的变量。
在某个叶子中,我们得到了一区域的数据
y
=
(
y
1
,
y
2
,
.
.
.
,
y
n
)
y=(y_1,y_2,...,y_n)
y=(y1,y2,...,yn)
那么:
n
1
=
∑
i
=
1
n
y
i
n_1=\sum_{i=1}^{n}y_i
n1=i=1∑nyi
n
0
=
n
−
n
1
n_0=n-n_1
n0=n−n1
我们便得到了,数量为
n
1
n_1
n1的1,和数量为
n
0
n_0
n0的0
利用伯努利分布,即:
p
(
y
∣
θ
)
=
θ
n
1
(
1
−
θ
)
n
0
p(y|\theta)=\theta^{n_1}(1-\theta)^{n_0}
p(y∣θ)=θn1(1−θ)n0
我们用下第三章似然估计伯努利的结论,得最大似然估计
θ
ˉ
=
n
1
n
\bar \theta=\frac{n_1}{n}
θˉ=nn1.
那么我负log似然的值为:
−
l
o
g
p
(
y
∣
θ
ˉ
)
=
−
n
1
l
o
g
(
n
1
n
)
−
n
0
l
o
g
(
n
0
n
)
-log p(y|\bar \theta)=-n_1 log(\frac{n_1}{n})-n_0log(\frac{n_0}{n})
−logp(y∣θˉ)=−n1log(nn1)−n0log(nn0)
现在我们有一列数据
y | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
x1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
x2 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
我们知道 θ ˉ = 5 10 \bar \theta=\frac{5}{10} θˉ=105,即y里1的概率
假如不划分:
−
l
o
g
p
(
y
∣
θ
ˉ
)
=
−
5
l
o
g
(
5
/
10
)
−
5
l
o
g
(
5
/
10
)
≈
6.9315
-logp(y|\bar \theta)=-5log(5/10)-5log(5/10)≈6.9315
−logp(y∣θˉ)=−5log(5/10)−5log(5/10)≈6.9315
若以x1变量划分:
当x1=0时,y里有几个1,
θ
ˉ
=
3
/
5
\bar\theta=3/5
θˉ=3/5,当x1=1时,y里有几个1,
θ
ˉ
=
2
/
5
\bar\theta=2/5
θˉ=2/5:
−
l
o
g
p
(
y
∣
θ
ˉ
,
x
1
=
0
)
=
−
3
l
o
g
(
3
/
5
)
−
2
l
o
g
(
2
/
5
)
≈
3.3651
-log p(y|\bar \theta,x1=0)=-3log(3/5)-2log(2/5)≈3.3651
−logp(y∣θˉ,x1=0)=−3log(3/5)−2log(2/5)≈3.3651
−
l
o
g
p
(
y
∣
θ
ˉ
,
x
1
=
1
)
=
−
2
l
o
g
(
2
/
5
)
−
3
l
o
g
(
3
/
5
)
≈
3.3651
-log p(y|\bar \theta,x1=1)=-2log(2/5)-3log(3/5)≈3.3651
−logp(y∣θˉ,x1=1)=−2log(2/5)−3log(3/5)≈3.3651
那么和为
3.3651
+
3.3651
=
6.7302
3.3651+3.3651=6.7302
3.3651+3.3651=6.7302
比不划分的负log似然更小。
若以x2变量划分
同理得:
−
l
o
g
p
(
y
∣
θ
ˉ
,
x
2
=
0
)
=
−
1
l
o
g
(
1
/
5
)
−
4
l
o
g
(
4
/
5
)
≈
2.5020
-log p(y|\bar \theta,x2=0)=-1log(1/5)-4log(4/5)≈2.5020
−logp(y∣θˉ,x2=0)=−1log(1/5)−4log(4/5)≈2.5020
−
l
o
g
p
(
y
∣
θ
ˉ
,
x
2
=
1
)
=
−
4
l
o
g
(
4
/
5
)
−
1
l
o
g
(
1
/
5
)
≈
2.5020
-log p(y|\bar \theta,x2=1)=-4log(4/5)-1log(1/5)≈2.5020
−logp(y∣θˉ,x2=1)=−4log(4/5)−1log(1/5)≈2.5020
那么和为
2.5020
+
2.5020
=
5.04
2.5020+2.5020=5.04
2.5020+2.5020=5.04
比x1划分得负log似然还要小,那么我们要用x2这个变量进行划分。
划分数据:
经过选择某个变量后,如果是二元变量,还好划分,按照1,0划分。但如果变量为数据性时:
我们需要要找到一个值c,那么我们提取y值当
x
j
<
c
x_j<c
xj<c和
x
j
>
=
c
x_j>=c
xj>=c,利用正态分布估计
μ
,
σ
\mu,\sigma
μ,σ,计算负log似然找到具有最小值的负log似然的c即可,大同小异。
到此,我们解决了如果y为二元分类,x为分类数据或者数字数据的情况下如何构造决策树。当y为数字数据时,即为回归时,我们利用正态分布,同样选取某个变量,利用负log似然,只不过用的是正态分布,不是伯努利分布。如果该变量是二元分类,我们就直接按1,0分类(例如男女),如果是数字数据,我们依旧需要找到一个值c,利用正态分布的负log似然找到具有最小值的c即可。
K-fold 交叉验证和决策树
我们上述是利用信息准则来确定决策树有多少个叶子,现在我们利用K-fold交叉验证。
小弟还是用伪代码来解释
#K-fold CV for decsion tree
def K_foldCV(L=最多有几个叶子){
if(L==0):
return 9999999
for (i=1:m):#重复取数据m次,m的次数越大越好,越大越稳定,但跑的慢,你自己定m的值
将取到的数据化分为K等份,y(1),y(2),...,y(K)
for(k=1:K):
用y(j),j!=k的数据来产生L个叶子的决策树,如何产生决策树如上述内容所说,但不用信息准则而已。
在利用生成后的决策树来预测数据y(k)
计算预测误差MSPE
EMSPE=取了m次数据,再计算m个MSPE的均值,即计算EMSPE.
return(min(EMSPE,K_foldCV(L-1)))#逐步减去叶子L=L-1,最后挑选最小EMSPE的树。
}
最后得到我们具有较小EMSPE的树,也得到了适当的叶子,即适当的模型复杂度。
说来也很搞笑,其实这一整套理论,我们用不着手算,只要找到相关编程语言的函数,一敲,啪就出来了,但大家也需要多多少少了解下。
决策树的优点:
1.高度可解释性,就是容易叫人看的明白。
2.可处理非线性关系
3.可处理变量之间的相互影响。
4.可处理连续,分类的预测变量
5.每个叶子都是一个模型有自己的均值和方差
事实上,决策树的分类比逻辑回归分类更好一些,如下图:
上图左侧为决策树,右侧为逻辑回归。
决策树的缺点:
1.有时候很难找到好的树。
2.对于数据的细微变化,很敏感
3.决策树虽然灵活,但不稳定,啥意思,就是有时候会有多个决策树都有较好的诠释数据的能力,我们很难判断哪个更好。
4.决策树其实效率也不高,有时候用线性模型就能解释的东西,决策树需要很多的叶子和参数。
对于决策树前三点的缺点,我们可以解决,利用随机森林(Random forest)
二. 随机森林(random forest)
我们还是看一下最早说过的预测高血压例子,假如我们有了这三个决策树,即下图
根据信息准则给我们的值,我们很容易愿意去选择最左侧的树。但事实上,它们的值也没差多少,预测的效果也差不多一样。我们便很纠结用哪个,对没错,有的同学会说都用呗,嗯,这就是我们的随机森林。
随机森林就是有多个树,它有时候也被称为集成学习(ensemble learning)。
至于每个树的生成,就没有决策树那么严格了,但分划数据与选择变量依旧利用损失方程(负log似然)。只不过,叶子的多少你可以人为控制,或者随机。
那么一个森林的预测,我们首先得到每个树的预测,然后结合这些预测,对于回归来说,那就所有树的预测的均值,对于分类来说,那就所有树的预测分类的概率。
单个树会有较低的偏差,但有较高的方差(不稳定)。多个树的结合会保持较低的偏差,同时也会降低方差。较为重要的变量,会被不同的树多次使用。
随机森林的优点:
1.很稳定
2.加强了预测准确度
3.容易处理多个变量
4.灵活
随机森林的缺点:
1.很难理解,也就是无法解释
2.模型监督学习起来很复杂,有很多的变量和参数。
三. K-近邻(KNN)
这个方法,不需要构造模型。
假如我们有了数据
x
i
,
1
,
x
i
,
2
,
.
.
.
,
x
i
,
p
x_{i,1},x_{i,2},...,x_{i,p}
xi,1,xi,2,...,xi,p和
y
i
y_i
yi.我们要用新的数据
x
1
′
,
x
2
′
,
.
.
.
,
x
p
′
x_1',x_2',...,x_p'
x1′,x2′,...,xp′来预测
y
′
y'
y′.
那么我们需要找K个个体(也就是K行数据),和我们的新的数据
x
1
′
,
x
2
′
,
.
.
.
,
x
p
′
x_1',x_2',...,x_p'
x1′,x2′,...,xp′较为相似的个体。然后利用这K个个体的y值来预测我们新数据的
y
′
y'
y′值.
其实K-近邻这个方法,是基于如果多个变量数据很相似的话那么它们的预测变量的数据也必然相似的想法。小弟明白这个想法不太能经得起推敲,但事实上,这个想法被用在很多地方。例如恢复数据,如果有数据丢失,会利用相似的个体来恢复这个丢失的数据。
我们最常用的还是利用欧几里得距离来定义是否不同个体间的相似度。当然有很多定义相似度的方法,例如范数算距离,字向量利用cosine看相似度等等。但在数据分析模型中我们涉及的还是比较简单的。即如下欧几里得距离:
d
(
x
,
x
′
)
=
[
∑
j
=
1
p
(
x
j
−
x
j
′
)
2
]
1
2
d(x,x')=[\sum_{j=1}^{p}(x_j-x'_j)^2]^{\frac{1}{2}}
d(x,x′)=[j=1∑p(xj−xj′)2]21
对于分类变量,我们也可以用该算法来定义相似度。
那么KNN的逻辑如下:
1.按从小到大排列
d
i
d_i
di
2.对应的
y
1
,
y
2
,
.
.
.
,
y
n
y_1,y_2,...,y_n
y1,y2,...,yn也从小到大排列。
3.选取前K个
y
i
y_i
yi
4.预测
y
ˉ
′
=
f
(
y
1
,
y
2
,
.
.
.
,
y
n
)
\bar y'=f(y_1,y_2,...,y_n)
yˉ′=f(y1,y2,...,yn)
如果是预测变量为分类:
f
(
⋅
)
f(·)
f(⋅)为选取出现最高频率的分类作为我们的
y
ˉ
′
\bar y'
yˉ′
如果是预测变量为回归:
f
(
⋅
)
f(·)
f(⋅)即为:
y
ˉ
′
=
1
K
∑
i
=
1
K
y
i
\bar y'=\frac{1}{K}\sum_{i=1}^{K}y_i
yˉ′=K1i=1∑Kyi
当然有时后还会加上权值,即:
y
ˉ
′
=
1
K
∑
i
=
1
K
g
(
y
i
)
\bar y'=\frac{1}{K}\sum_{i=1}^{K}g(y_i)
yˉ′=K1i=1∑Kg(yi)
这里的
g
(
⋅
)
g(·)
g(⋅)也被称为核函数(kernel function)
所以KNN会涉及这么三个参数:
1.选择K,多少个相似的个体
2.距离方程,选择哪个距离方程
3.核函数的权值,权值设为多少
那么我们会用到CV,还是同理,最后选择具有较小的EMSPE的相关参数即可。
最后我们来看一下KNN的图像
横坐标为变量2,纵坐标为变量1,K=3,我们来预测下图中问号处是黑色还是浅蓝色。很明显离它最近的三个点均为黑色,那么该问号为黑色点。
KNN的优点:
1.对于高维数据很有效率
2.很容易处理分类和连续变量
KNN缺点:
1.需要很多的参数,例如多少个K,多个邻近,怎样定义相似,核函数的参数
2.不容易解释。
三. 结语
有公式推导错误的或理论有谬误的,请大家指出,我好及时更正,感谢。