才写完上一篇,就和朋友讨论到了集成学习的厉害,随即就扯到了CART,本来一直不明白CART回归树明明输出的一块一块的区域,为什么还叫回归。。被朋友一图点醒,果然还是要边学理论边实践,才会有更好的理解。
CART算法同样由特征选择、树的生成以及树的剪枝组成。
总的来说就两步:一、基于训练集生成决策树,生成的决策树要尽量大;二、用验证集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
【CART生成】
决策树类型 | 生成准则 |
---|---|
回归树 | 平方误差最小化(即最小二乘法) |
分类树 | 基尼指数最小化 |
回归树的生成
假设
X
X
和分别为输入变量和输出变量,并且
Y
Y
是连续变量,给定训练数据集,我们生成回归树,生成算法的思想就是将输入空间(即特征空间)划分为
M
M
个单元,每一个单元有一个固定的输出值
cm
c
m
。
下面我们来一步一步的分析这个算法的过程,它的主要思路就是,我们对一个空间遍历所有划分点,求出令两个空间真实输出值与最优输出值平方误差之和最小的那个划分点。然后对划分出的两个空间继续划分,用同样的方式找到最优划分点,重复直至终止条件
生成回归树(最小二乘回归树算法):
输入:训练数据集
D
D
输出:回归树
①先将输入变量排序;
②选择第 j j 个变量和它的取值 s s 作为切分变量和切分点,并定义两个区域:和 R2(j,s)={x|xj>s} R 2 ( j , s ) = { x | x j > s }
③利用平方误差最小准则求这两个区域上的最优输出值 c1 c 1 和 c2 c 2 。对于一个区域 Rm R m 来说,它的最优输出值 c^m c ^ m 就是 Rm R m 上的所有实例 xi x i 对应的输出 yi y i 的均值;
这里针对的是这个切分上两个区域的最优值,最后我们要比较所有切分得
这
里
针
对
的
是
这
个
切
分
上
两
个
区
域
的
最
优
值
,
最
后
我
们
要
比
较
所
有
切
分
得
到的最优值来确定切分点
到
的
最
优
值
来
确
定
切
分
点
为什么最优输出值c^m就是Rm上的所有实例xi对应的输出yi的均值?用公式证明:
为
什
么
最
优
输
出
值
c
^
m
就
是
R
m
上
的
所
有
实
例
x
i
对
应
的
输
出
y
i
的
均
值
?
用
公
式
证
明
:
mincm∑xi∈Rm(yi−cm)2即为: min c m ∑ x i ∈ R m ( y i − c m ) 2 即 为 :
∂∑xi∈Rm(yi−cm)2∂cm=∑xi∈Rm(2cm−2yi)=0 ∂ ∑ x i ∈ R m ( y i − c m ) 2 ∂ c m = ∑ x i ∈ R m ( 2 c m − 2 y i ) = 0
∑xi∈Rmcm=∑xi∈Rmyi
∑
x
i
∈
R
m
c
m
=
∑
x
i
∈
R
m
y
i
假设有Nm个变量在区域Rm中,则上式写为:
假
设
有
N
m
个
变
量
在
区
域
R
m
中
,
则
上
式
写
为
:
Nm×cm=∑xi∈Rmyi
N
m
×
c
m
=
∑
x
i
∈
R
m
y
i
cm=1Nm∑xi∈Rmyi=y¯i
c
m
=
1
N
m
∑
x
i
∈
R
m
y
i
=
y
¯
i
④遍历变量 j j ,求解,即找到最优切分变量 j j 和切分点;
⑤根据找到的最优切分变量和切分点(j,s)划分区域 R1 R 1 和 R2 R 2 ,并得到这两个区域对应的输出值 c^1 c ^ 1 和 c^2 c ^ 2 ;
R1(j,s)={x|xj≤s}
R
1
(
j
,
s
)
=
{
x
|
x
j
≤
s
}
和
R2(j,s)={x|xj>s}
R
2
(
j
,
s
)
=
{
x
|
x
j
>
s
}
c^m=1Nm∑xi∈Rm(j,s)yi
c
^
m
=
1
N
m
∑
x
i
∈
R
m
(
j
,
s
)
y
i
,
x∈Rm
x
∈
R
m
,
m=1,2
m
=
1
,
2
⑥继续对这两个子区域调用步骤②~⑤,直至满足停止条件;
⑦将输入空间划分为 M M 个区域,生成决策树:
f(x)=∑m=1Mc^mI(x∈Rm) f ( x ) = ∑ m = 1 M c ^ m I ( x ∈ R m )
左图蓝线是一棵回归树的拟合,很明显,横平竖直,一条横线就代表了一个区域的输出值。右图是用了集成学习后的多棵回归树。
分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
回顾一下基尼指数,
基尼指数
输入:训练数据集
D
D
、特征
输出:特征A对训练数据集D的基尼指数
Gini(D,A)
G
i
n
i
(
D
,
A
)
1.若样本点属于第一个类的概率是p,则概率分布的基尼指数为
1.
若
样
本
点
属
于
第
一
个
类
的
概
率
是
p
,
则
概
率
分
布
的
基
尼
指
数
为
Gini(p)=2p(1−p)
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
此处是二分类情况,CART算法中会将特征的多个取值变为one−vs−rest的形式(借用LR和SVM做多分类的一种方法来比喻)变成二分类,来计算某特征所有取值的Gini指数
此
处
是
二
分
类
情
况
,
C
A
R
T
算
法
中
会
将
特
征
的
多
个
取
值
变
为
o
n
e
−
v
s
−
r
e
s
t
的
形
式
(
借
用
L
R
和
S
V
M
做
多
分
类
的
一
种
方
法
来
比
喻
)
变
成
二
分
类
,
来
计
算
某
特
征
所
有
取
值
的
G
i
n
i
指
数
2.特征A对数据集D的基尼指数Gini(D,A)
2.
特
征
A
对
数
据
集
D
的
基
尼
指
数
G
i
n
i
(
D
,
A
)
Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)
G
i
n
i
(
D
,
A
)
=
|
D
1
|
|
D
|
G
i
n
i
(
D
1
)
+
|
D
2
|
|
D
|
G
i
n
i
(
D
2
)
生成分类树(基尼指数):
输入:训练数据集
D
D
,停止计算的条件;
输出:CART决策树
根据训练数据集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树:
①设节点的训练数据集为,计算所有特征和其所有可能切分点对该数据集的基尼指数;
假设该节点训练数据集 D D 上有n个特征,对每一个特征而言,又有不同的取值 aj∈a1,a2,...am a j ∈ a 1 , a 2 , . . . a m (即切分点), m m 根据不同特征的可取值数目而定。我们要计算每一个特征的每一种取值的基尼指数。(根据样本点对的测试为“是”或“否”,将数据集分割为两个部分,然后代入公式求解基尼指数)
②在所有可能的特征 Ai A i 和其所有可能的切分点 aj a j 中选择基尼指数最小的特征,及其对应的切分点作为最优特征与最优切分点。根据最优特征与最优切分点,从现节点生成两个子节点,将训练数据集根据特征分配到两个子节点中;
③对这两个子节点递归调用①,②,直至满足停止条件;
④生成CART决策树
一般算法停止条件为节点中样本个数小于预定阈值,或样本集的基尼指数小于预定
一
般
算
法
停
止
条
件
为
节
点
中
样
本
个
数
小
于
预
定
阈
值
,
或
样
本
集
的
基
尼
指
数
小
于
预
定
阈值(样本基本属于同一类),或没有更多特征了。
阈
值
(
样
本
基
本
属
于
同
一
类
)
,
或
没
有
更
多
特
征
了
。
观察两个算法发现,CART生成算法生成的树都是二叉树
【CART剪枝】
CART剪枝和前面的剪枝算法比起来稍微有些难懂,主要在于有很多模糊的地方,尤其是《统计学习方法》中对
g(t)=C(t)−C(Tt)|Tt|−1
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
|
T
t
|
−
1
的描述是表示剪枝后整体损失函数减少的程度,让我不能理解为什么要在
T0
T
0
中剪去
g(t)
g
(
t
)
最小的
Tt
T
t
。后来总算理清楚了。
下面让我来理一理这个算法到底是一个什么样的思路。
一、首先什么情况下我们会选择剪枝。
和上一篇剪枝算法一样,我们都需要用到决策树的损失函数这一概念。
Cα(T)=C(T)+α|T|
C
α
(
T
)
=
C
(
T
)
+
α
|
T
|
我们用
Cα(T)
C
α
(
T
)
表示子树
T
T
的整体损失函数,表示训练数据的预测误差(有多种计算手段,如基尼指数,信息熵,这里用基尼指数应该会更好,因为CART决策树就是根据基尼指数一层一层往下生成的),
|T|
|
T
|
指的是子树
T
T
的叶节点个数,可以说是表现了子树的复杂度,而参数
α
α
则是用来权衡训练数据的拟合程度和模型复杂程度。我们希望剪枝后的损失函数要小于剪枝前的损失函数,这样剪枝才有意义嘛。因此当剪枝后的损失函数要小于剪枝前的损失函数,我们会选择剪枝。
虽然这些在前篇已经阐述了一遍,但这个对理解剪枝算法尤为重要。
二、参数在CART剪枝算法中的重要意义
在前面的剪枝算法中,我们可以发现,算法的输入中是有
α
α
的,也就是说是一个给定的值。
我们可以看一下,
α
α
值的变化会造成什么样的影响。当偏大,我们希望损失函数越小越好,因此最优子树
|Tα|
|
T
α
|
会偏小,极端情况是
α→∞
α
→
∞
时,根节点组成的单节点树是最优的;当
α
α
偏小,同理,最优子树|T_α|会偏大,极端情况下是时,整体树就是最优的。
具体到CART算法中,我们对每一个内部节点
t
t
计算它作为单节点树的损失函数,和它作为根节点子树(子树
Tt
T
t
)的损失函数
Cα(Tt)
C
α
(
T
t
)
。
Cα(t)=C(t)+α
C
α
(
t
)
=
C
(
t
)
+
α
因为单节点树可以看做只是一个叶子节点,所以|t|为1
因
为
单
节
点
树
可
以
看
做
只
是
一
个
叶
子
节
点
,
所
以
|
t
|
为
1
Cα(Tt)=C(Tt)+α|Tt|
C
α
(
T
t
)
=
C
(
T
t
)
+
α
|
T
t
|
下面就是关键所在了,我们是否需要剪枝,要看这个内部节点作为单节点树的损失函数和它作为根节点子树的损失函数的大小关系。
1.若是作为单节点树的损失函数要更小一些,那我当然是把这个内部节点变为叶子节点更好咯,所以要进行剪枝;
2.若是作为根节点子树的损失函数要更小一些,那么保留它继续做一个根节点子树的形态更好,也就是不剪枝。
3.若是两个的损失函数相等,那么根据模型越简单越好的原则,我们希望节点少一点咯,而单节点树明显节点更少,因此选择剪枝。
换成数学语言来说:
当
Cα(t)>Cα(Tt)
C
α
(
t
)
>
C
α
(
T
t
)
时,不剪枝;
当
Cα(t)≤Cα(Tt)
C
α
(
t
)
≤
C
α
(
T
t
)
时,剪枝。
可得:C(t)+α≤C(Tt)+α|Tt|
可
得
:
C
(
t
)
+
α
≤
C
(
T
t
)
+
α
|
T
t
|
α≥C(t)−C(Tt)|Tt|−1
α
≥
C
(
t
)
−
C
(
T
t
)
|
T
t
|
−
1
也就是说,当
α≥C(t)−C(Tt)|Tt|−1
α
≥
C
(
t
)
−
C
(
T
t
)
|
T
t
|
−
1
时我们可以对
Tt
T
t
进行剪枝。
三、CART剪枝算法思想
我们将整体树记作 T0 T 0 ,对 T0 T 0 中每一内部节点 t t 计算,这里《统计学习方法》给出了一个解释,即 g(t) g ( t ) 表示了剪枝后整体损失函数减少的程度。这句话是没有问题的,主要在于为什么要将 α α 设置为最小的。原因如下:
假设有 5 5 个内部节点,我们分别求了它们的 g(t) g ( t ) ,并得到这样的大小关系 g(t1)<g(t2)<g(t3)<g(t4)<g(t5) g ( t 1 ) < g ( t 2 ) < g ( t 3 ) < g ( t 4 ) < g ( t 5 ) ,那么当我把 α1 α 1 设置为 g(t1) g ( t 1 ) 时,只有内部节点 t1 t 1 符合剪枝要求,而其他的内部节点并不用剪枝,因此由 t1 t 1 剪枝后得到的子树 T1 T 1 就是 [α1,α2) [ α 1 , α 2 ) 的最优子树了。( α2 α 2 取开区间的原因就是若是闭区间,对于 α2 α 2 来说节点 t1 t 1 和 t2 t 2 都可以做剪枝啦,我就不知道谁是最优子树啦)
我们通过第一次剪枝得到了子树 T1 T 1 ,我们继续对这个子树进行以上步骤,求出每一个内部节点的 g(t) g ( t ) ,找到最小的赋值给 α2 α 2 ,在划分出子树 T2 T 2 ,就这样递归下去,直到 Tk T k 是一棵由根节点及两个叶子节点构成的树为止。
最后,我们利用独立的验证数据集,对子树序列 T0,T1,...Tn T 0 , T 1 , . . . T n 中各棵子树测试其平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。而且每个子树 T0,T1,...Tn T 0 , T 1 , . . . T n 都对应着一个参数 α0,α1,...αn α 0 , α 1 , . . . α n ,因此当最优子树 Tk T k 确定时,对应的 αk α k 也确定了,即得到最优决策树 Tα T α 。
CART剪枝算法
输入:CART算法生成的决策树
T0
T
0
;
输出:最优决策树
Tα
T
α
①设 k=0,T=T0 k = 0 , T = T 0 ;
②设 α=+∞ α = + ∞ ;
③自下而上地对各内部节点 t t 计算以及
g(t)=C(t)−C(Tt)|Tt|−1
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
|
T
t
|
−
1
α=min(α,g(t))
α
=
m
i
n
(
α
,
g
(
t
)
)
④对 g(t)=α g ( t ) = α 的内部节点 t t 进行剪枝,并对叶节点以多数表决法决定其类,得到树 T T ;
⑤设 k=k+1,αk=α,Tk=T k = k + 1 , α k = α , T k = T ;
⑥如果 Tk T k 不是由根节点及两个叶节点构成的树,则返回步骤②;否则令 Tk=Tn T k = T n ;
注意这里是返回第二步②,不是返回第三步也不是第四步,若是回到第三步,则α会一直
注
意
这
里
是
返
回
第
二
步
②
,
不
是
返
回
第
三
步
也
不
是
第
四
步
,
若
是
回
到
第
三
步
,
则
α
会
一
直
是第一个最小的g(t),即α1
是
第
一
个
最
小
的
g
(
t
)
,
即
α
1
我买的这本李航老师的《统计学习方法》上是未勘误的版本,老师给出了勘误表,大家可以看一下
http://blog.sina.com.cn/s/blog_7ad48fee01017dpi.html
⑦采用交叉验证法在子树序列
T0,T1,...Tn
T
0
,
T
1
,
.
.
.
T
n
中选取最优子树
Tα
T
α
。
【感想】
对于算法,一定要静下心来慢慢推一遍,少一块拼图,可能就会影响后面的理解。就像CART算法一样,中间有很多疑惑的地方,如果不去弄清楚,则逻辑就会变得不通。至此,机器学习算法中的算法已经复习了五个,后面可以开始集成学习的复习了。此后会多加实践内容,光看理论总是有些空,而且我代码能力也太弱鸡了,必须训练T T