文章目录
基本概念
决策树是一类常见的机器学习算法,是一种简单但是广泛使用的分类器。顾名思义,决策树基于树结构进行决策。一般的,一颗决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应一个判定测试序列。
决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树。
决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
决策数有两大优点:
1)决策树模型可以读性好,具有描述性,有助于人工分析;
2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。
决策树的损失函数
通常情况下是正则化的极大似然函数
决策树学习策略
以损失函数为目标的最小化。
决策树的学习过程
一棵决策树的生成过程主要分为以下3个部分:
特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。(只考虑局部最优)
**剪枝:**决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。(考虑全局最优)
特征选择方法(信息论)
熵
熵度量了事物的不确定性,越不确定的事物,它的熵就越大
其中X表示随机变量,随机变量的取值为(x1,x2,…,xn),p(xi))表示事件xi发生的概率,且有∑p(xi)=1.信息熵的单位为bit。
首先定义时间xi的信息量为其发生概率对数的负数,记为I(xi),有:
I(xi)=−log(p(xi))
由该定义可得,H(x)为随机变量X的平均信息量(即期望,期望等于试验中每次可能的结果乘以其结果概率的综合)
联合熵
熟悉了一个变量X的熵,很容易推广到多个个变量的联合熵,这里给出两个变量X和Y的联合熵表达式:
H
(
X
,
Y
)
=
−
∑
i
=
1
m
p
(
x
i
,
y
i
)
l
o
g
p
(
x
i
,
y
i
)
H(X,Y)=-\sum^m_{i=1}p(x_{i},y_{i})logp(x_{i},y_{i})
H(X,Y)=−i=1∑mp(xi,yi)logp(xi,yi)
条件熵
由联合熵,容易推广得到条件熵的表达式H(X∣Y) H(X|Y)H(X∣Y)
于条件概率,它度量了我们的X在知道Y以后剩下的不确定性。表达式如下
H ( X ∣ Y ) = − ∑ i = 1 n p ( x i , y i ) l o g p ( x i ∣ y i ) = ∑ j = 1 n p ( y j ) H ( X ∣ y i ) H(X|Y)=-\sum^n_{i=1}p(x_{i},y_{i})logp(x_{i}|y_{i})=\sum^n_{j=1}p(y_j)H(X|y_i) H(X∣Y)=−i=1∑np(xi,yi)logp(xi∣yi)=j=1∑np(yj)H(X∣yi)
信息增益(互信息)
I(X,Y),它度量了X 在知道Y 以后不确定性减少程度,这个度量我们在信息论中称为互信息(信息增益),表达式如下:
I
(
X
,
Y
)
=
H
(
X
)
−
H
(
X
∣
Y
)
I(X,Y)= H(X)-H(X|Y)
I(X,Y)=H(X)−H(X∣Y)
根据信息增益准则的特征选择方法:对训练数据集D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
信息增益算法
输入:训练数据集D(X)和特征A(Y);
输出:特征A对训练数据集D的信息增益
- 计算数据集D的经验熵H(D)
H ( D ) = − ∑ k = 1 k ∣ C k ∣ ∣ D ∣ l o g 2 C k D H(D)= -\sum^k_{k=1}\frac{|C_k|} { |D|} log_2\frac{C_k}{D} H(D)=−k=1∑k∣D∣∣Ck∣log2DCk - 计算特征A对数据集D的经验条件熵H(D|A)
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 2 D i k D i H(D|A)= \sum^n_{i=1}\frac{|D_i|} { |D|}H(D_i) =\sum^n_{i=1}\frac{|D_i|} { |D|}\sum^k_{k=1}\frac{|D_{ik}|} { |D_i|}log_2\frac{D_{ik}}{D_i} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=i=1∑n∣D∣∣Di∣k=1∑k∣Di∣∣Dik∣log2DiDik - 计算信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)= H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
信息增益比
特征A对训练数据集D的信息增益比
g
R
(
D
,
A
)
g_{R}(D,A)
gR(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值得熵
H
A
(
D
)
H_A(D)
HA(D)之比即
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
g_R(D,A)=\frac{g(D,A) }{H_A(D)}
gR(D,A)=HA(D)g(D,A)
基尼系数
ID3还是C4.5,都是基于信息论的熵模型的,CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
分类问题,假设有K个类,样本点属于第k个类概率为pk,则概率分布的基尼指数定义为
对于二类分离,样本点属于第一个类的概率p,基尼指数
对于给定样本集合D,基尼指数
Ck是D中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值a被分割为D1和D2两部分。
(即在某一特征多个取值中,取其一个将其分为”是”其他为”不是”)
在特征A下,集合D的基尼指数定义为
决策树的生成
ID3算法
-
算法原理
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地 构建决策树.具体方法是:从根结点(root node)开始,对结点计算所有可能的 特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取 值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的 信息增益均很小或没有特征可以选择为止.最后得到一个决策树.ID3相当于用 极大似然法进行概率模型的选择. -
算法的过程为:
1初始化信息增益的阈值ϵ
2判断样本是否为同一类输出Di,如果是则返回单节点树T。标记类别为Di
3 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
4计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征Ag
5)如果Ag的信息增益小于阈值ϵ,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
6否则,按特征Ag的不同取值Agi将对应的样本输出D分成不同的类别Di。每个类别产生一个子节点。对应特征值为Agi。返回增加了节点的数T。
7对于所有的子节点,令D=Di,A=A−{Ag}递归调用2-6步,得到子树Ti并返回。
缺点
ID3算法虽然提出了新思路,但是还是有很多值得改进的地方。
**a)**ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。
b)ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?
c) ID3算法对于缺失值的情况没有做考虑
d) 没有考虑过拟合的问题
C4.5算法
对ID.3算法的改进
a)不能处理连续特征, C4.5的思路是将连续的特征离散化。
b)对于信息增益作为标准容易偏向于取值较多的特征的问题。我们引入一个信息增益比的变量I(X,Y),它是信息增益和特征熵的比值.
c)缺失值处理的问题,主要需要解决的是两个问题,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理。
- 对于第一个子问题,对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例。
- 将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配
d)于第4个问题,C4.5引入了正则化系数进行初步的剪枝
C4.5缺点
- 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。
- C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。
- C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
- C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。
决策树的剪枝
剪枝目的:决策树的剪枝是为了简化决策树模型,避免过拟合。
剪枝类型:预剪枝、后剪枝
- 预剪枝:在构造决策树的同时进行剪枝。所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。但是这种方法实际中的效果并不好。
- 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。
剪枝的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。如果确实小,则这一组节点可以合并一个节点,其中包含了所有可能的结果。后剪枝是目前最普遍的做法。后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class ,(majority class 在很多英文文献中也多次出现)。
预剪枝依据: - 作为叶结点或作为根结点需要含的最少样本个数
- 决策树的层数
- 结点的经验熵小于某个阈值才停止。
CART
分类树算法特征选择
CART分类树算法使用基尼系数
CART分类树算法对于连续特征和离散特征处理的改进
对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。
具体的思路如下,比如m个样本的连续特征A有m个,从小到大排列为a1,a2,…,am,则CART算法取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点Ti表示为:Ti=ai+ai+12。对于这m-1个点,分别计算以该点作为二元分类点时的基尼系数。选择基尼系数最小的点作为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为at,则小于at的值为类别1,大于at的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与ID3或者C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
CART分类树建立算法的具体流程
算法输入是训练集D,基尼系数的阈值,样本个数阈值。
输出是决策树T。
我们的算法从根节点开始,用训练集递归的建立CART树。
1) 对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
2) 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
3) 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数,对于离散值和连续值的处理方法和基尼系数的计算见第二节。缺失值的处理方法和上篇的C4.5算法里描述的相同。
4) 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.
5) 对左右的子节点递归的调用1-4步,生成决策树。
CART回归树建立算法
CART回归树和CART分类树的建立算法大部分是类似的,所以这里我们只讨论CART回归树和CART分类树的建立算法不同的地方。
首先,我们要明白,什么是回归树,什么是分类树。两者的区别在于样本输出,如果样本输出是离散值,那么这是一颗分类树。如果果样本输出是连续值,那么那么这是一颗回归树。
除了概念的不同,CART回归树和CART分类树的建立和预测的区别主要有下面两点:
1)连续值的处理方法不同
2)决策树建立后做预测的方式不同。
对于连续值的处理,我们知道CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。这比较适合分类模型,但是对于回归模型,我们使用了常见的和方差的度量方式,CART回归树的度量目标是,对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。表达式为:
m
i
n
⎵
A
,
s
[
m
i
n
⎵
c
1
∑
x
i
∈
D
1
(
A
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
⎵
c
2
∑
x
i
∈
D
2
(
A
,
s
)
(
y
i
−
c
2
)
2
]
\underbrace{min}_{A,s}[\underbrace{min}_{c1}\sum_{{x_i}\in{D_1(A,s)}}(y_i-c_1)^2+\underbrace{min}_{c2}\sum_{{x_i}\in{D_2(A,s)}}(y_i-c_2)^2]
A,s
min[c1
minxi∈D1(A,s)∑(yi−c1)2+c2
minxi∈D2(A,s)∑(yi−c2)2]
其中,c1为D1数据集的样本输出均值,c2为D2数据集的样本输出均值。
对于决策树建立后做预测的方式,上面讲到了CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。
除了上面提到了以外,CART回归树和CART分类树的建立算法和预测没有什么区别。
CART树算法的剪枝
CART回归树和CART分类树的剪枝策略除了在度量损失的时候一个使用均方差,一个使用基尼系数,算法基本完全一样,这里我们一起来讲。
由于决策时算法很容易对训练集过拟合,而导致泛化能力差,为了解决这个问题,我们需要对CART树进行剪枝,即类似于线性回归的正则化,来增加决策树的泛化能力。但是,有很多的剪枝方法,我们应该这么选择呢?CART采用的办法是后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。
也就是说,CART树的剪枝算法可以概括为两步,第一步是从原始决策树生成各种剪枝效果的决策树,第二部是用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。
首先我们看看剪枝的损失函数度量,在剪枝的过程中,对于任意的一刻子树T,其损失函数为:
其中,α为正则化参数,这和线性回归的正则化一样。C(Tt)为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差度量。|Tt|是子树T的叶子节点的数量。
当α=0时,即没有正则化,原始的生成的CART树即为最优子树。当α=∞时,即正则化强度达到最大,此时由原始的生成的CART树的根节点组成的单节点树为最优子树。当然,这是两种极端情况。一般来说,α越大,则剪枝剪的越厉害,生成的最优子树相比原生决策树就越偏小。对于固定的α,一定存在使损失函数Cα(T)最小的唯一子树。
看过剪枝的损失函数度量后,我们再来看看剪枝的思路,对于位于节点t的任意一颗子树Tt,如果没有剪枝,它的损失是
如果将其剪掉,仅仅保留根节点,则损失是
当α=0或者α很小时,Cα(Tt)<Cα(T) , 当α增大到一定的程度时
当α继续增大时不等式反向,也就是说,如果满足下式:
Tt 和T有相同的损失函数,但是T节点更少,因此可以对子树Tt进行剪枝,也就是将它的子节点全部剪掉,变为一个叶子节点T。
最后我们看看CART树的交叉验证策略。上面我们讲到,可以计算出每个子树是否剪枝的阈值α,如果我们把所有的节点是否剪枝的值α都计算出来,然后分别针对不同的α所对应的剪枝后的最优子树做交叉验证。这样就可以选择一个最好的α,有了这个α,我们就可以用对应的最优子树作为最终结果。
好了,有了上面的思路,我们现在来看看CART树的剪枝算法。
输入是CART树建立算法得到的原始决策树T。
输出是最优决策子树Tα。
算法过程如下:
1)初始化αmin=∞, 最优子树集合ω={T}。
2)从叶子节点开始自下而上计算各内部节点t的训练误差损失函数Cα(Tt)(回归树为均方差,分类树为基尼系数), 叶子节点数|Tt|,以及正则化阈值 α = m i n { C ( T ) − C ( T t ) ∣ T t ∣ − 1 , a m i n } ≤ α k \alpha=min\{\frac{C(T)-C(T_t)}{|T_t|-1},a_{min}\}\le \alpha_k α=min{∣Tt∣−1C(T)−C(Tt),amin}≤αk 更新αmin=α
3) 得到所有节点的α值的集合M。
4)从M中选择最大的值αk,自上而下的访问子树t的内部节点,如果
C
(
T
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\frac{C(T)-C(T_t)}{|T_t|-1}
∣Tt∣−1C(T)−C(Tt)时,进行剪枝。并决定叶节点t的值。如果是分类树,则是概率最高的类别,如果是回归树,则是所有样本输出的均值。这样得到αk对应的最优子树Tk
5)最优子树集合ω=ω∪Tk, M=M−{αk}。
6) 如果M不为空,则回到步骤4。否则就已经得到了所有的可选最优子树集合ω.
7) 采用交叉验证在ω选择最优子树Tα