集成学习系列:
Decision Tree
上一篇讲解了 Adaptive Boosting A d a p t i v e B o o s t i n g 算法,这个算法有两个特点:第一个是在第 t t 轮中通过调整每一个样本点的权重值以使得在轮得到不同于的 gt g t 的 gt+1 g t + 1 ;第二点是通过 gt g t 的表现计算一个值作为权重将其线性的融合到 G G 中。这样的算法被证明当不怎么强的时候,通过这样的方式也可以得到很强的效果。
1 - Decision Tree Hypothesis
1.1 - 总结aggregation
到现在为止, 这一篇和上一篇都属于 aggregation model aggregation model 的范畴。 aggregation model aggregation model 简单的来说就是将 g g 融合成。其做法有两个主要的面向:一种称之为 blending b l e n d i n g ,这种是指我们已经得到了一堆的 g g ,这个时候我们有三种主要的方式来对这些已经在手上的进行融合:
- Uniform U n i f o r m 方式:如果所有的 g g 的重要性都是一样的, 我们可以使用的方式,通过投票或者平均来进行融合,或者说给每一个 g g 的权重都设置为1
- - uniform u n i f o r m 方式:如果 g g 的重要性是不同的, 那么可以使用- uniform u n i f o r m 的形式来对 g g 进行融合。这时可以将所有的当成是一个特征转换,将进行了特征转换之后的数据丢到一个 linear model l i n e a r m o d e l 里面去求解参数作为各自的重要性就可以了
-
- Conditional C o n d i t i o n a l 方式:如果要在不同的情形下使用不同的 g g ,同样的我们的做法是将所有的当成是特征转换,在 two level learning t w o l e v e l l e a r n i n g 的第二层的学习的时候,不再使用 linear model l i n e a r m o d e l ,而是使用一个非线性的模型,这样就可以做到 conditional c o n d i t i o n a l 的 blending b l e n d i n g 。
另一种面向是我们并不知道有哪些 g g ,我们想要一边学习一遍将他们进行融合。目前讲了两个主要的方式: Bagging B a g g i n g 和 AdaBoost A d a B o o s t 。
- 如果想要做 uniform u n i f o r m 的 aggregation a g g r e g a t i o n 的话,就是用 Bagging B a g g i n g ,在 Bagging B a g g i n g 中,我们首先针对资料 D D 做 bootstrap b o o t s t r a p 来得到一些不同的资料 D~t D ~ t ,再在这些资料的副本上得到不同的 g g ,最后将它们的融合起来。
- 如果是要做 linear l i n e a r 的 aggregation a g g r e g a t i o n 的话,可以使用 Adaboost A d a b o o s t ,在 AdaBoost A d a B o o s t 中通过调整样本的权重,得到不同的 g g ,然后的将它们融合起来。
- decision tree d e c i s i o n t r e e 解决的问题是要在不同的条件下使用不同的 g g , 并且和 conditional c o n d i t i o n a l 事先不知道,需要通过学习获取的情形。
以上的内容可以总结为如下的表格:
1.2 - 一个决策树的示例
如下图就是一棵决策树,用于决策下班之后要不要学习在线课程。 例如,我要先看下下班的时间早不早,如果下班早的话,再看看有没有约,如果没有约的话就学习在线视频,如果有约的话就不学习了。等等。所以一个判断的过程就是从决策树的 root r o o t 出发来依次的判断各个决策点的条件,沿着符合条件的路径一直走到叶子节点就是决策树最终给出的决策。
Decision Tree D e c i s i o n T r e e 使用 G G 来表示,接下来看看怎么将表示为 g g 和的组合:
- gt(x) g t ( x ) 称为 base hypothesis b a s e h y p o t h e s i s ,在这里表示的是叶子节点上的决策,这里使用的是常数,和在 bagging b a g g i n g 和 adaboost a d a b o o s t 中一样 gt g t 是组成 G G 的部分。
- 是 condition c o n d i t i o n ,即判断特征是否满足条件,或者是不是在某些路径 path p a t h 上。
或者我们从数据结构角度出发,可以通过如下的递归的方式来描述决策树:
其中, G(x) G ( x ) 称为是 full tree f u l l t r e e , b(x) b ( x ) 称为是分支条件, Gc(x) G c ( x ) 是条件 b(x)=c b ( x ) = c 时的那一棵子树。操作 |[ ]| | [ ] | 的定义如下:
以上只是给出了对决策树模型的一些定义和数学上的描述,不是很重要,我们需要知道的是 Decision Tree D e c i s i o n T r e e 是一个非常实用的算法有很多的优点,因为该算法描述了整个做决策的过程,所有有很好的可解释性,正因为如此使得该算法在商业和医药上有很多的应用。另一个方面,该算法的很容易实现。除此之外该算法的效率也非常的高。该算法的缺点是,相对于机器学习中的其他的模型来说,该算法的理论保证很少,人们更多是使用一些设计上的技巧而不是理论上的支撑来使得算法的表现很好。
2 - Decision Tree Algorithm
2.1 - 决策树算法介绍
上一小节我们介绍了
Decision Tree
D
e
c
i
s
i
o
n
T
r
e
e
的基本概念和表示的方法,其中说到决策树可以使用递归的方式来表示,如下:
通过这样的一个对决策树的递归的表示我们也可以大概的写出决策树的构造步骤。
构造
Decision Tree
D
e
c
i
s
i
o
n
T
r
e
e
input:D={(xn,yn)}Nn=1
i
n
p
u
t
:
D
=
{
(
x
n
,
y
n
)
}
n
=
1
N
if
i
f
终止条件满足
返回
base hypothesis gt(x)
b
a
s
e
h
y
p
o
t
h
e
s
i
s
g
t
(
x
)
else
e
l
s
e
1. 从资料中找出最好的用于划分资料的特征
2. 根据以上找到的特征将资料划分为若干块
Dc
D
c
,具体分为几块(
c
c
的大小)视该特征的不同的取值的个数,或者算法具体使用的技巧而定。
3. 使用每一个
Dc
D
c
构造一个子树
4. 将所有的子树合并起来形成最后的
Decision Tree
D
e
c
i
s
i
o
n
T
r
e
e
, 即
G(x)
G
(
x
)
通过上面的描述要想从 data d a t a 中学到一个决策树,有四个问题需要决定:
- 如何决定进行划分数据的特征
- 分支的个数
- 终止的条件
- 满足终止条件的情况下怎么决定返回的 base hypothesis b a s e h y p o t h e s i s
2.2 - Classification and Regression Tree(CART)
CART C A R T 算法是决策树算法的一种简单实现,下面我们依次谈论 GART G A R T 这个算法针对上面我们关心的四个问题是怎么处理的。
CART C A R T 算法每次将数据划分为两份,也就是说使用该算法最后构建的决策树是一棵二叉树。 CART C A R T 算法最后回传的 gt g t ,也就是 base hypothsis b a s e h y p o t h s i s 是常数,也就是叶子结点上的值是常数。如果是 classification c l a s s i f i c a t i o n ,那么叶子节点上的值就是类别;如果是 regression r e g r e s s i o n ,那么叶子节点上的值就是回归的实数值。那么怎么得到叶子节点上的这个值呢?这个返回的常数我们希望它在它所能看到的那一部分小的数据上(数据不断被划分,所以不管是维度还是个数都在不断的减少)的表现是很好的,也就是 Ein E i n 是很小的, 为了做到这一点,对于分类问题来说,我们使用 majority m a j o r i t y 的方式决定这个常数的取值:类别最多的作为该决策叶子节点的类别;对于回归问题,最好的常数就是这一部分数据的 y y 的平均值。
算法每一次会将 data d a t a 划分为两个子树,则另一个关心的问题是:如何划分为两个子树,即如何选择特征来对数据进行划分。 CART C A R T 的做法是利用 decision stump d e c i s i o n s t u m p 算法对数据进行划分,划分后计算子数据的纯度 purifying p u r i f y i n g 。试想如果划分得到的子数据集上的样本的 label l a b e l 都是相同的,或者说是很接近的,那么在使用一个常数作为决策树的输出的时候,得到的 Ein E i n 就会很小。所以我们就是要在所有可能的 Decision Stump D e c i s i o n S t u m p 做出的划分中,找使得 impurify(D1)+impurify(D2) i m p u r i f y ( D 1 ) + i m p u r i f y ( D 2 ) 最小的划分, impurity(D) i m p u r i t y ( D ) 表示 D D 的不纯度的大小。考虑到 D1 D 1 和 D2 D 2 中数据量的差异,所以我们将上式改为 |D1|⋅impurify(D1)+|D2|⋅impurify(D2) | D 1 | ⋅ i m p u r i f y ( D 1 ) + | D 2 | ⋅ i m p u r i f y ( D 2 ) 。
2.3 - Impurity
怎么衡量不纯度 impurity i m p u r i t y ?
对于 regression r e g r e s s i o n 来说,首先计算划分后的数据的所有真实值的均值 y¯=average of {yn} y ¯ = a v e r a g e o f { y n } , 不纯度的计算公式如下:
impurity(D)=1N∑n=1N(yn−y¯)2(1) (1) i m p u r i t y ( D ) = 1 N ∑ n = 1 N ( y n − y ¯ ) 2对于 classification c l a s s i f i c a t i o n 来说,找到数据中出现次数最多的类别 y∗ y ∗ ,即 y∗=majority of {yn} y ∗ = m a j o r i t y o f { y n } , 剩下的其他的类别的个数的总和就可以描述该数据集的不纯度,其中 N N 为该数据子集的大小:
当有了不纯度的定义之后, 就可以在所有的 decision stump d e c i s i o n s t u m p 的切割中,找到做好的 feature f e a t u r e 来划分数据。
对于
classification
c
l
a
s
s
i
f
i
c
a
t
i
o
n
问题来说,另一个比较常用的衡量不纯度的指标是
Gini index
G
i
n
i
i
n
d
e
x
,定义如下:
例如对于 label l a b e l 集 L={1,7,9,7,1,7,7,7,9,1} L = { 1 , 7 , 9 , 7 , 1 , 7 , 7 , 7 , 9 , 1 } 来说, Gini(L)=1−((310)2+(510)2+(210)2) G i n i ( L ) = 1 − ( ( 3 10 ) 2 + ( 5 10 ) 2 + ( 2 10 ) 2 )
在 CART C A R T 算法做 classification c l a s s i f i c a t i o n 的时候,通常会使用 Gini G i n i 系数来选择划分数据集的特征;在做 regression r e g r e s s i o n 的时候, 通常使用公式 (1) ( 1 ) 的计算不纯度的方法来选择划分数据集的特征。
四个基本的问题中还剩一个问题,终止条件是什么。第一种情况是当所有的 y y 都相同的时候,这个时候无论是使用的 Gini G i n i 系数还是使用 regression r e g r e s s i o n 的中的公式 (1) ( 1 ) 来计算 impurity i m p u r i t y 得到的都是 0 0 ,所以这个时候就可以终止继续构造子树,返回一个常数;第二种情况是当所有的x都相同的时候;第三种情况是是当没有特征可用的时候;这三种情况的处理是一样的, 的话对所有的 label l a b e l 投票, regression r e g r e s s i o n 的话取均值。这种被迫停下来的树称为 fully grown tree f u l l y g r o w n t r e e 。
CART
C
A
R
T
决策树是一棵完全长成的树,叶子节点上返回的常数,对数据进行划分的依据是不纯度,每次将数据划分为两个不想交的子集。
3 - Decision Tree Heuristics in CART
3.1 - CART算法的流程
if cannot branch anymore
i
f
c
a
n
n
o
t
b
r
a
n
c
h
a
n
y
m
o
r
e
return gt(x)=Ein optimal constant
r
e
t
u
r
n
g
t
(
x
)
=
E
i
n
o
p
t
i
m
a
l
c
o
n
s
t
a
n
t
else
e
l
s
e
1.learn branching criteria
1.
l
e
a
r
n
b
r
a
n
c
h
i
n
g
c
r
i
t
e
r
i
a
2.plit D to 2 parts Dc={(xn,yn):b(xn)=c} 2. p l i t D t o 2 p a r t s D c = { ( x n , y n ) : b ( x n ) = c }
3.build sub tree Gc⟵DecisionTree(Dc) 3. b u i l d s u b t r e e G c ⟵ D e c i s i o n T r e e ( D c )
4.return G(x)=∑2c=1|[b(x)=c]|Gc(x) 4. r e t u r n G ( x ) = ∑ c = 1 2 | [ b ( x ) = c ] | G c ( x )
简单总结一下 CART C A R T 算法的主要特点:每次分两支;通过计算纯度选择对数据进行划分的特征;返回常数值。 CART C A R T 算法不仅仅可以做 binary classification b i n a r y c l a s s i f i c a t i o n 还可以做 regression r e g r e s s i o n , 并且只需要做一点的改变就可以很容易的处理 multi classification m u l t i c l a s s i f i c a t i o n ,只需要在返回常数和计算不纯度的时候考虑多类别的问题就可以了。
3.2 - 加规则化因子
如果所有
data
d
a
t
a
的特征都不一样的时候,
CART
CART
算法会得到一棵
Ein
E
i
n
为0的树(应该是这样的吧)。对于这种完全长成的树,存在较大的
overfitting
o
v
e
r
f
i
t
t
i
n
g
的风险。所以看起来我们可能需要一些
regularization
r
e
g
u
l
a
r
i
z
a
t
i
o
n
来控制下模型的复杂度。该算法可能会
overfitting
o
v
e
r
f
i
t
t
i
n
g
是因为划分的太过于彻底,那么是不是可以通过当划分到一定的程度的时候就不再划分,提前终止构造决策树来降低模型的复杂度呢?这个时候会得到的决策树的叶子的数量会变少,所以看来叶子的数量是一个很好的衡量决策树的复杂度的方法。
定义
Ω(G)
Ω
(
G
)
表示某个决策树
G
G
的叶子的数量,那么带有的决策树的模型如下:
现在我们的目标就是要在所有的决策树中找 Ein(G)+λΩ(G) E i n ( G ) + λ Ω ( G ) 最小的, 也就是说可能 Ein(G) E i n ( G ) 会稍微大一点, 但是复杂度小一点的决策树。这样的树称为 pruned decision tree pruned decision tree 。
实际操作中, 我们首先通过 CART C A R T 算法得到一个完全长成的树 G(0) G ( 0 ) ,其中的上角标 0 0 表示摘除片叶子。然后试着摘除该树中的每一片叶子, 计算得到一个在摘除一片叶子的情况下 Ein E i n 最小的树 G(1) G ( 1 ) ;然后在从这个摘掉一片叶子的树出发摘掉第二片叶子,同样找到最好的 G(2) G ( 2 ) , ⋯ ⋯ 。这样就可以生成一些不同的决策树,将这些我们认为“够好”的决策树作为备选,选择一个 Ein(G)+λΩ(G) E i n ( G ) + λ Ω ( G ) 最小的决策树。
3.3 - Decision Tree的一些其他的特点
在实际的应用中,可能 data d a t a 中的信息不是数字类型( numerical features numerical features )的,而是类别类型( categorical features categorical features )的,例如说描述天气的情况,可能特征的取值是:晴,阴,雨,而不是数字。之前的模型对于这样的数据,像 linear model linear model 等等好像不是很方便处理。但是 decision tree decision tree 可以很容易的处理这样的数据。其他的地方基本没有什么影响, 只是原来 CART CART 算法使用 decision stump decision stump 对数据做切分, 现在我们换成使用 decision subset decision subset 对数据做切分。例如对于天气的情况 { { 晴,阴,雨 } } , 所有的 decision subset decision subset 的结果就是 { { { { 晴, ( ( 阴,雨 } } , { { 阴, ( ( 晴,雨 } } , { { 雨, ( ( 阴,晴} } } 。不仅仅 CART C A R T 算法, 其他的大部分的 decision tree decision tree 算法都可以很轻易的处理 categorical features categorical features 。
另外一个优点是, decision tree decision tree 算法可以通过加入一些技巧来弥补数据缺失的问题。大致的做法是: 构造的过程中除了选择最好的特征 x∗ x ∗ 对当前的数据进行划分之外,还可以再选择一个和 x∗ x ∗ 能得到相似的划分效果的特征 x′ x ′ ,通常这个两个特征之间会有一个相关关系。 这样在日后使用决策树的时候,如果有一笔数据上没有特征 x∗ x ∗ ,那么可以使用特征 x′ x ′ 来进行替代。
4 - CART算法的表现
4.1 - 实例分析
针对如下的这个二元分类问题,我们来对于以下 CART CART 算法和 AdaBoost AdaBoost 算法的效果和不同之处在哪里。
以下是 CART C A R T 算法和 AdaBoost A d a B o o s t 算的结果对比, 因为在 CART C A R T 和 AdaBoost A d a B o o s t 中的 base learner b a s e l e a r n e r 都使用的 decision stump d e c i s i o n s t u m p ,所以对于二维的数据来说它们都只能做水平或者是垂直的分界线。但是从图中可以很明显看出两者之间的不同:对于 AdaBoost A d a B o o s t 来说,每一个 decision stump d e c i s i o n s t u m p 的分界线都是横跨整个平面的, 但是 CART C A R T 却不是。因为 CART C A R T 算法每一个递归里面对的数据集都是缩小了的。而 AdaBoost A d a B o o s t 始终是在整个数据上划分。
看到这个图以及在下一个数据集上的分割线,发现自己有一个疑惑。在决策树的另一种实现算法 ID3 I D 3 中,每次使用一种特征 x∗ x ∗ 进行数据的划分之后,在新的数据子集上不仅仅数据的量减少了,数据的维度也减少了。或者说每一次划分都要消耗一个特征,因为 x∗ x ∗ 已经用于划分数据了,所以不再考虑了。但是如果本节所讲的 CART C A R T 也是采用这种方式的话,怎么会在每一个点只有两个特征 x,y x , y 的情况下可以做出如此多的分隔线呢?(不知道问题表述清楚了没有,希望有大神可以指教。),我想 CART C A R T 算法应该是不消耗特征的。
贴几个复杂的资料上的结果,加深对 CART C A R T 和 AdaBoost A d a B o o s t 算法的直观的认识。原始的资料如下:
在 decision stump d e c i s i o n s t u m p 切了 10 10 次之后。
在 decision stump d e c i s i o n s t u m p 切了 20 20 次之后。
在 decision stump d e c i s i o n s t u m p 切了 30 30 次之后。
在 decision stump d e c i s i o n s t u m p 切了 90 90 次之后。
4.2 - CART在实际应用中的优点
- 结果的可解释性
- 可以轻易的处理多类别的分类
- 可以应对 categorical features c a t e g o r i c a l f e a t u r e s
- 可以解决特征缺失的问题
- 能非常高效的得到一个非线性的模型
- 训练和测试的效率都比较高
5 - 一般决策树
5.1 - 决策树模型
决策树学习本质上是从训练数据集中归纳出一组分类规则。我们需要一个与训练数据集矛盾较小的决策树,同时具有很好的泛化能力。从另一个角度来看,决策树学习是由训练数据集估计条件概率模型,我们希望选择的条件概率模型应该不仅对训练数据有很好的拟合,而且应该对未知的数据有很好的预测。决策树学习用损失函数表示这一目标,决策树学习的损失函数通常是正则化的极大似然函数,决策树学习的策略是以损失函数为目标函数的最小化。
决策树的学习算法包含特征选择,决策树的生成,决策树的剪枝,由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成对应模型的决策选择,决策树的剪枝对应模型的全局选择。
5.2 - 特征选择
通常特征选择的准则是信息增益或者信息增益率。
5.2.1 - 什么是信息增益
X X 是一个取有限个值的离散随机变量,其概率分布为
随机变量 X X 的熵定义为:
条件熵 H(Y|X) H ( Y | X ) 表示在已知随机变量X的条件下,随机变量Y的不确定性,定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
信息增益表示得知特征 X X 的信息而使得类的信息的不确定性减少的程度。计算公式为:
5.2.2 - 信息增益算法
- 设训练数据集为 D D ,表示其样本容量;
- 设有 K K 个类, k=1,2,3,⋯,K k = 1 , 2 , 3 , ⋯ , K , |Ck| | C k | 为类 Ck C k 的样本个数
- 设特征 A A 有个不同的取值 {a1,⋯,an} { a 1 , ⋯ , a n } ,
根据 A A 的取值可以将划分为 n n 个子集, |Di| | D i | 为 Di D i 的样本个数;子集 Di D i 中属于类 Ck C k 的样本集合为 Dik D i k , |Dik| | D i k | 为 Dik D i k 的样本的个数。
信息增益算法:该算法的输入为训练数据 D D 和特征,输出为 A A 对训练数据集的信息增益 g(D,A) g ( D , A ) 。
- 计算数据
D
D
的经验熵:
- 计算特征
A
A
对数据的经验条件熵:
H(D|A)=∑i=1n|Di||D|H(Di)=−∑i=1n|Di||D|∑k=1K|Dik||Di|log|Dik||Di| H ( D | A ) = ∑ i = 1 n | D i | | D | H ( D i ) = − ∑ i = 1 n | D i | | D | ∑ k = 1 K | D i k | | D i | l o g | D i k | | D i | - 信息增益:
g(D,A)=H(D)−H(D|X) g ( D , A ) = H ( D ) − H ( D | X )
ID3 ID3 算法在树的生成过程中使用信息增益进行特征的选择, C4.5 C4.5 在生成决策树时使用信息增益率进行特征的选择。
5.3 - 决策树的剪枝
如果对决策树的生成过程不加限制的话,决策树很容易过拟合,过拟合的原因在于学习的时候过多的考虑了如何提高对训练数据的正确分类,从而构造出了过于复杂的决策树。将已经生成的决策树进行简化的过程称为剪枝。具体的,剪枝是指从已经生成的树上裁掉一些子树或者是叶节点,并将其父节点作为新的叶节点。
决策树的剪枝往往通过极小化决策树整体的代价函数来实现。
设树 T T 的叶节点的个数为, t t 是树的叶节点,该叶节点上有 Nt N t 个样本,其中 k k 类样本点有个, k=1,2,⋯,K k = 1 , 2 , ⋯ , K , Ht(T) H t ( T ) 为叶节点上的经验熵。则决策树的代价函数可以定义为:
其中:
详细的代价函数的表达式为:
通过代价函数可以看到,决策树的生成只考虑了通过提高信息增益来对训练数据进行更好的拟合。而决策树的剪枝通过优化代价函数还考虑了减小模型的复杂度。代价函数的极小化等价于正则化的极大似然估计。
剪枝算法:输入为生成算法产生的整个树 T T ,参数;输出为剪枝之后的子树 T T 。
- 计算每一个叶节点的经验熵
- 递归的从树的叶节点向上回缩。设一组叶节点回缩到其父节点之前和之后的整体树分别为
TB
T
B
和
TA
T
A
,其对应的代价函数值分别为
Cα(TB)
C
α
(
T
B
)
和
Cα(TA)
C
α
(
T
A
)
,如果
Cα(TA)≤Cα(TB) C α ( T A ) ≤ C α ( T B )
则进行剪枝,将父节点变为新的叶节点。 - 返回上一步,直到不能继续为止,得到代价函数最小的子树 Tα T α
6 - 总结
这篇讲解了 Decision Tree D e c i s i o n T r e e ,从它的假设讲起,它的假设表示的就是在不同的条件下, 在不同的路径上有不同的 g g 。决策树的构造过程是一个递归的过程,其中最重要的一步是如何划分数据,这就涉及到不纯度的计算。在这样的算法中有很多技巧可以使用,例如,怎么通过剪枝来做 regularization r e g u l a r i z a t i o n ,怎么处理 categorical c a t e g o r i c a l 的特征,怎么应付有缺失的输入。这样的算法可以很高效的给我们一个可解释性强的非线性边界。通过这一篇和上一篇,我们已经讲解完了 aggregation a g g r e g a t i o n 的基本模型,下一篇开始讲的是:当我们已经有了这些 aggregation a g g r e g a t i o n 的时候,如何再将这些 aggregation a g g r e g a t i o n 融合起来, 即 aggregation of aggregation a g g r e g a t i o n o f a g g r e g a t i o n 。
- 递归的从树的叶节点向上回缩。设一组叶节点回缩到其父节点之前和之后的整体树分别为
TB
T
B
和
TA
T
A
,其对应的代价函数值分别为
Cα(TB)
C
α
(
T
B
)
和
Cα(TA)
C
α
(
T
A
)
,如果