机器学习之决策树(Decision Tree)

写本文的目的:

  1. 博主本人正在入门机器学习,期间对于每个算法都看了几遍书,写下这篇文章希望可以用自己理解的方式来记录,加深对算法的理解。
  2. 记下自己的理解,方便日后进行复习。

 决策树(Decision Tree)是一种基本的分类与回归方法。决策树模型呈树形结构,其主要优点是模型具有可读性,分类速度快。如下图,决策树模型,其中最上的圆为根节点,其余的圆为内部节点,方形为叶节点。叶节点对应于决策结果,其余节点则对应于一个属性测试。

           

 

决策树的学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪(剪枝)。

经典的决策树有ID3、C4.5和CART三种,本文先从ID3开始介绍,再介绍C4.5,最后介绍CART算法以及模型树。

一、决策树学习基本算法

输入: 训练集D={(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}
      属性集 A = {a_1, a_2,...,a_d}

过程:
函数TreeGenerate(D,A)
    生成节点node;
    if D 中样本全属于同一类别 C then
        将 node 标记为C类叶节点; return 
    end if
    if A = 空集 OR D 中样本在 A 上取值相同 then
        将 node 标记为叶子节点,其类别标记为 D 中样本数最多的类; return 
    end if
    从 A 中选择最优的划分属性a_*;
    for a_* 的每一个值 a^v do
        为 node 生成一个分支; 令 Dv 表示 D 中在 a_* 上取值为 a^v 的样本集;
        if Dv 为空 then
            将分支节点标记为叶节点,其类别标记为其父节点 D 中样本最多的类; return
        else
            以 TreeGenerate(Dv, A\{a_*})为分支结点
        end if
    end for

输出:以 node 为根结点的一颗决策树

从上面的算法可知,决策树的生成一个递归的过程。在决策树基本算法中,有三种情形会导致递归返回:

  1. 当前节点包含的样本全部属于同一类别,不需要进行分类,第一处return
  2. 当前属性为空或是所有的样本在所有属性上的取值相同,无法进行划分,第二处return
  3. 当前结点包含的样本集合为空,不能划分,第三处return

在第2种情形下,把当前结点标记为叶结点,并将其类别设定为该结点所含有样本最多的类别;在第3种情形,将类别设定为其父节点所含有样本最多的类别

注:算法中的 { 从 A 中选择最优的划分属性a_*;  for a_* 的每一个值 a^v do }表示先从所有属性(特征)中选出最优划分的属性,再为属性的每一个值建立一个分支。

不同的决策树算法在于选择最优划分属性时的参考不同。

二、ID3决策树学习算法

ID3决策树学习算法以信息增益为准则来选择划分属性。以获得最大信息增益的属性作为最优的划分属性。

信息熵(information entropy)是度量样本集合纯度最常用的一种指标,假定当前集合样本D中第k类样本所占的比例为p_k,{\ }k=1,2,...,|y|,则D的信息熵为:

                                                      Ent(D)=-\sum _{k=1}^{|y|}p_k\ log_2\ p_k

Ent(D)的值越小,则D的纯度越高,也就是说信息熵越小,不确定性越小,而越大则不确定性越大。

假定离散属性a有V个可能的取值\left { \right }\left \{ a^1,a^2,...,a^V\right \},若使用a来对样本集合D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为a^v的样本,记为D^v。则可根据上式算的其信息熵为Ent(D^v),又每个分支所包含的样本数不同,给每个分支赋予权重|D^v|/|D|。于是可以算得属性a对样本集D进行划分所得到的“信息增益”(information gain):

                                                     Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)

信息增益表示由于特征a而使得对数据集D的分类的不确定性减少的程度。

所以根据信息增益准则的特征选择方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征作为划分特征。


【信息增益算法】

输入:训练数据集D,属性a

输出:属性a对训练数据集D的信息增益Gain(D,a).

(1) 计算数据集D的信息熵Ent(D):

                                                   Ent(D)=-\sum _{k=1}^{|y|}p_k\ log_2\ p_k

(2) 计算属性a对数据集D的条件信息熵:

                                                   \sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}\sum_{k=1}^{|y|}\frac {|D_k^v|}{|D_v|}log_2\frac {|D_k^v|}{|D_v|}

(3) 计算信息增益

                                                   Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)


 通过上面的信息增益算法可以算得每个属性的信息增益大小,从中选出最大的作为划分属性。

实际上,以信息增益作准则来选择划分训练数据集的属性的方法,存在偏向于选择取值较多的特征的问题,即信息增益准则对取值数目较多的属性有所偏好,为减少这种偏好,则出现了下面的C4.5算法。

三、C4.5决策树

C4.5决策树学习算法以信息增益率(信息增益比)为准则来选择划分属性。

信息增益率的定义为:

                                                  Gain\_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}

其中

                                                 IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}

称为属性a的“固有值”(instrinsic value).属性a的取值个数越多,即V越大,则IV(a)越大。

需要注意的是,增益率准则对可能取值少得属性有所偏好,所以C4.5不直接选择增益率最大的属性为划分属性,而是采用一种启发的方式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的属性作为划分属性。

四、CART(Classification and regression tree, 分类与回归树)

CART决策树的生成就是递归地构建二叉决策树的过程。对分类树用基尼指数(Gini index)最小化准则,进行特征选择;对回归树使用平方误差最小准则,进行特征选择。

1、分类树

CART决策树做为分类树时,其通过基尼指数最小准则来选择最优划分属性,同时决定该特征的最优二分值切分点。

数据集D的纯度可用基尼值来度量:

                                 Gini(D)=\sum_{k=1}^{|y|}\sum_{k^{'}\neq k}p_kp_{k^{'}}=1-\sum_{k=1}^{|y|}p_k^2=1-\sum_{k=1}^{|y|}\left ( \frac{|D_k|}{|D|} \right )

其中,|y|为类别数,p_k为第k类的概率,|D_k|为第k类的个数,|D|为总数。

直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,所以Gini(D)越小,则数据集D的纯度越高。

属性a的基尼指数定义为

                               Gini\_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)

基尼值Gini(D)表示集合D的不确定性,基尼指数Gini_index(D,a)表示经属性a=a^v(最优二分值切分点,|D^v|表示属性a取值为a_v时的样本个数)分割后集合D的不确定性,基尼指数值越大,样本集合的不确定性越大,也就是纯度越低。

所以,对于候选属性集A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性

2、回归树

CART决策树做为回归树时,其通过平方误差最小准则来选择最优划分属性

假定XY分别为输入变量和输出变量,且Y为连续变量,给定数据集

                                                  D=\left \{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\right \}

一个回归树对应着输入空间的一个划分以及在划分单元上的输出值。假设已将输入空间划分为M个单元

                                                  R_1,R_2,...,R_M

并且每个单元R_m上有一个固定输出值c_m,那么回归树模型可以表示为:

                                                 f(x)=\sum_{m=1}^{M}c_mI(x\epsilon R_m)

(注:关于上面的模型,是否可以认为,对于输入实例x,模型的结果等于x所在划分空间R_m上固定输出值c_m?实例x在回归上可以属于几个划分空间?也就是说x可以属于多个划分空间还是只能是一个划分空间?回归树的所有叶节点的父节点都是同一个特征吗?还是说不同的叶节点,其父节点用来划分的属性/特征可以不同?)

当输入空间的划分确定时,可以用平方误差

                                                \sum _{x_i\epsilon R_m}(y_i-f(x_i))^2

来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。容易知道,单元R_m上的c_m的最优值\hat{c}_mR_m上所有实例x_i对应的输出y_i的均值,即

                                               \hat{c}_m=ave(y_i|x_i\epsilon R_m)

那么关键的问题来了,如何对输入空间进行划分呢?常采用启发式的方法,选择第j个变量(属性/特征)x^j和它的取值s,作为切分变量(splitting variable)和切分点(splitting point),并定义两个区域:

                                             R_1(j,s)=\left \{ x|x^j\leq s\right \} 和 R_2(j,s)=\left \{ x|x^j> s\right \}

然后寻找最优切分变量j和最优切分点s,其满足:

                                             \underset{j,s}{min}\left [ \underset{c_1}{min}\sum_{x_i\epsilon R_1(j,s)}(y_i-c_1)^2+\underset{c_2}{min}\sum_{x_i\epsilon R_2(j,s)}(y_i-c_2)^2\right ]

所以对于固定输入变量j可以找到最优切分点S:

                                            \hat{c}_1=ave(y_i|x_i\epsilon R_1(j,s))  和  \hat{c}_2=ave(y_i|x_i\epsilon R_2(j,s))

遍历所有的输入变量,找到最优的切分变量 j ,构成一个对(j,s)。依此将输入空间划分成两个区域。接着,对每个区域采用相同的方法进行划分,直到满足停止条件为止。这样的一棵回归树通常称为最小二乘回归树(least squares regression tree).


最小二乘回归树生成算法 

输入:训练数据集D

输出:回归树f(x)

在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉树:

(1)选择最优切分变量 j 和 切分点 s ,求解:

                                       \underset{j,s}{min}\left [ \underset{c_1}{min}\sum_{x_i\epsilon R_1(j,s)}(y_i-c_1)^2+\underset{c_2}{min}\sum_{x_i\epsilon R_2(j,s)}(y_i-c_2)^2\right ]

遍历变量j,对固定的切分变量 j 扫描切分点,选择使得上式得到最小的值的对(j,s)。即遍历所有的特征,对遍历到的当前特征,遍历其所有可以的切分点(当前特征/属性的所有取值),算出当前特征取当前值时上式取得的值,保留取得最小值的切分变量/特征 j 和切分点的值s构成的切分对(j,s)

(2)用选定的切分对(j,s)划分区域并决定相应的输出值:

                                      R_1(j,s)=\left \{ x|x^j\leq s\right \} , R_2(j,s)=\left \{ x|x^j> s\right \}

                                      \hat{c}_m=\frac{1}{N_m}\sum_{x_i\epsilon R_m(j,s)}y_i{\ \ , \ \ }x\epsilon R_m,m=1,2

(3)继续对两个子区域调用步骤(1),(2),知道满足停止条件为止。

(4)将输入空间划分为M个区域R_1,R_2,...,R_M,生成决策树:

                                      f(x)=\sum_{m=1}^{M}\hat{c}_mI(x\epsilon R_m)


五、模型树

上一小节我们知道CART做回归树时,每个叶子节点输出一个固定的数值,而模型树与其最大的不同点是:模型树把叶子节点设定为分段线性函数,即对于CART回归树的每个划分区间,构建一个线性函数来对该区间的输出值进行拟合。

假定XY分别为输入变量和输出变量,且Y为连续变量,给定数据集

                                                  D=\left \{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\right \}

一个模型树对应着输入空间的一个划分以及在划分单元上的线性回归值。假设已将输入空间划分为M个单元

                                                  R_1,R_2,...,R_M

并且每个单元R_m上有一个线性函数w_m^Tx+b,那么模型数模型可以表示为:

                                                 f(x)=\sum_{m=1}^{M}(w_m^Tx+b)I(x\epsilon R_m)

当输入空间的划分确定时,可以用平方误差

                                                \sum _{x_i\epsilon R_m}(y_i-f(x_i))^2

来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。误差计算:对于给定的数据集,先用线性模型进行拟合,然后在计算预测值与真实值的差值,最后对这些差值的平方求和,即可得到所需的误差。

我们可以这样进行输入空间的划分:选择第j个变量(属性/特征)x^j和它的取值s,作为切分变量(splitting variable)和切分点(splitting point),并定义两个区域:

                                             R_1(j,s)=\left \{ x|x^j\leq s\right \} 和 R_2(j,s)=\left \{ x|x^j> s\right \}

然后寻找最优切分变量j和最优切分点s,其满足:

                                             \underset{j,s}{min}\left [ \underset{w_1,b_1}{min}\sum_{x_i\epsilon R_1(j,s)}(y_i-(w_1^Tx_i+b_1))^2+\underset{w_2,b_1}{min}\sum_{x_i\epsilon R_2(j,s)}(y_i-(w_2^Tx_i+b_2))^2\right ]

所以对于固定输入变量j可以找到最优切分点s,令\hat{w}=(w;b),则:

                                            \hat{w}_1=(X_1^TX_1)^{-1}X_1^TY_1{\ \ ;\ \ }\hat{w}_2=(X_2^TX_2)^{-2}X_2^TyY_2


模型树生成算法

该算法与CART回归树算法差不多,把固定的输出值改成线性回归模型,和计算误差的方式不同即可。 


       

六、多变量决策树

在使用决策树进行分类时,有一个特点:决策树所形成的分类边界总是轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段形成。如下图:

     

阶梯状的分类边界就是决策树(单变量)学习到模型,但是明显红色的分类边界比其好。而红色线段表示的分类边界正是由"多变量"决策树得到的模型,也就是说多变量决策树可以实现“斜划分”甚至更加复杂划分的决策树。

所谓“多变量决策树”就是在决策树中,非叶子节点不再只是对某个属性,而是对属性的线性组合进行测试,也就是说每个非叶子节点是一个形如:

                                                                  \sum_{i=1}^{d}w_ia_i=t

的线性分类器,其中w_i是属性a_i的权重,和t可以在该节点所含的样本集和属性集上学得。

于是,与传统的单变量决策树不同,在多变量决策树的学习过程中,不是为每个非叶子节点寻找一个最优划分属性,而是试图建立一个合适的线性分类器,如下,左图为“单变量”决策树,右图为“多变量”决策树。

        

七、决策树剪枝

因为决策树是一直划分直到满足条件为止,所以学习出来的决策树容易造成过拟合。剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。决策树剪枝的策略主要有“预剪枝”(prepruning)和“后剪枝”(postpruning)两种。

预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点。

后剪枝则是先生成一棵完成的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶节点能使决策树的泛化性能提升,则将该子树替换成叶结点。

七、总结

决策树学习的目的是构建一个与训练数据拟合很好,并且复杂度小的决策树,因为从可能的决策树中直接选择最有决策树是NP难问题,所以采用启发式方法学习次优的决策树。

决策树学习算法包括3个部分:特征选择、树的生成和树的剪枝。常用的算法有ID3、C4.5、CART。

特征选择的目的在于选取对训练数据能够分类的特征,选择的关键在于其准则,根据不同的准则有不同的算法,常用算法的特征选择准则分别为:

(1) ID3算法

ID3算法采用信息增益最大准则进行最优特征的选取。

信息熵:

                                     Ent(D)=-\sum _{k=1}^{|y|}p_k\ log_2\ p_k

信息增益:

                                    Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)

(2) C4.5

C4.5算法采用信息增益率最大准则的启发式,即先选出信息增益超过平均信息增益的特征集,再从中选择信息增益率最大的特征作为最优划分属性。

信息增益率:

                                   Gain\_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}

固有值:

                                  IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}

(3) CART

CART是二叉树。

CART在作为分类时,采用基尼指数(Gini_index)最小准则进行最优划分属性的选择。

          基尼值:

                               Gini(D)=\sum_{k=1}^{|y|}\sum_{k^{'}\neq k}p_kp_{k^{'}}=1-\sum_{k=1}^{|y|}p_k^2=1-\sum_{k=1}^{|y|}\left ( \frac{|D_k|}{|D|} \right )

          基尼指数:

                              Gini\_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)

CART在作为回归时,采用最小平方误差准则来选择最优划分属性。

八、参考

1、《机器学习》 周志华 ---- 西瓜书

2、《统计学习方法》李航

3、《机器学习实战》李锐  译

猜你喜欢

转载自blog.csdn.net/perfect1t/article/details/83448801