秦刚刚的机器学习成长之路之决策树总结

版权声明:版权所属秦刚刚,转载请标明出处。谢谢^_^ https://blog.csdn.net/yzcjwddbdgg/article/details/85251353

决策树之分类树和回归树

本文主要讲解最常用的3种决策树(ID、C4.5和CART),为了更加系统和全面的认识这3种常用的决策树算法,我将从以下4个部分进行讲解:
1.决策树学习算法步骤有哪些?
2.常用的决策树算法有哪几种?
3.决策树剪枝
4.Gini指数与熵的关系

1.决策树学习算法步骤有哪些?

决策树学习算法通常包括以下3个步骤:

  • 特征选择
    选取对训练数据具有分类能力的特征。
    换句话说,特征选择是决定用哪个特征来划分特征空间。
    特征选择的准则有信息增益(ID3)、信息增益比(C4.5)和基尼指数(CART中的分类树)。
  • 树的生成
    决策树包括分类树和回归树。生成分类树的方法有ID3,C4.5和CART分类树,分别使用信息增益,信息增益比和基尼指数;生成回归树的方法有CART回归树,使用了最小二乘法(寻找最优切分变量与切分点)。
  • 树的剪枝
    主要分为树的剪枝算法和CART剪枝算法

2.常用的决策树算法介绍

决策树算法 特征选择准则
ID3 信息增益
C4.5 信息增益比
CART(回归树) 最小二乘法
CART(分类树) 基尼指数

下面将对以上决策树算法进行详细讲解

  • 1)ID3算法
    ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法为:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。
    信息增益计算的公式为:
    g ( D , A ) = H ( D ) H ( D A ) g(D,A) = H(D)-H(D|A)
    H ( D ) = H(D)= 1 n C i D \sum_1^n\frac{|Ci|}{|D|} l o g 2 ( C i D ) log_2(\frac{|Ci|}{|D|}) ,k为类别数, C i |Ci| 表示属于类i的样本个数, D |D| 表示整个数据集的样本个数。
    H ( D A ) = H(D|A)= 1 n D i D \sum_1^n\frac{|Di|}{|D|} H ( D i ) = H(Di)= 1 n D i D -\sum_1^n\frac{|Di|}{|D|} 1 k D i k D i \sum_1^k\frac{|Dik|}{|Di|} l o g 2 ( D i k D i ) log_2(\frac{|Dik|}{|Di|}) ,其中,n表示D被特征A划分的个数, D i k Dik 表示 D i Di 中属于类k的样本个数。

    信息增益 g ( D , A ) g(D,A) 表示由于特征A而使得对数据集D的分类的不确定性减少的程度。显然,对于数据集D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。

==ID3算法==
输入:训练数据集D,特征A,阈值ε
输出:决策树T
(1)若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;
(2)若A=∅,则T为单结点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;
(3)否则,按照信息增益公式计算A中各特征对D的信息增益,选择信息增益最大的特征Ag;
(4)如果Ag的信息增益小于阈值ε,则置T为单结点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;
(5)否则,对Ag中每一可能值ai,依Ag=ai将D分隔为若干非空子集Di,将Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
(6)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归地调用步(1)~(5),得到子树Ti,返回Ti。
  • 2)C4.5算法
    C4.5算法在ID3算法的基础上进行了改进,具体表现为在生成树的过程中使用了信息增益比,改进了ID3使用信息增益容易产生过拟合的缺点。
    特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) 定义为其信息增益 g ( D , A ) g(D,A) 与训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) 之比,即:
    g ( D , A ) = g ( D , A ) H A ( D ) g(D,A)=\frac{g(D,A)}{H_A(D)}
    其中, H A ( D ) = H_A(D)= 1 n D i D \sum_1^n\frac{|Di|}{|D|} l o g 2 D i D log_2\frac{|Di|}{|D|} ,n是特征A取值的个数。
C4.5生成算法
输入:训练数据集D,特征集A,阈值ε
输出:决策树T
(1)若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;
(2)若A=∅,则T为单结点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;
(3)否则,按照信息增益比公式计算A中各特征对D的信息增益比,选择信息增益比最大的特征Ag;
(4)如果Ag的信息增益比小于阈值ε,则置T为单结点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;
(5)否则,对Ag中每一可能值ai,依Ag=ai将D分隔为若干非空子集Di,将Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
(6)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归地调用步(1)~(5),得到子树Ti,返回Ti。
  • 3)CART算法
    CART(Classification And Regression Tree ) 跟前面两种决策树算法一样,都是由特征选择、树的生成及剪枝组成,既可以做分类也可以做回归。
  • CART回归树
    假设 X X Y Y 分别为输入和输出变量,并且 Y Y 是连续变量,给的训练数据集
    D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) D={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}
    考虑如何生成回归树。
    一个回归树对应着输入空间的一个划分以及在划分的单元的输出值。假设已将输入空间划分为 M M 个单元 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M ,并且在每个单元 R m R_m 上有一个固定的输出值 c m c_m ,于是回归树模型可表示为
    f ( x ) = m = 1 M c m I ( x R m )                                          1 f(x)=\sum_{m=1}^Mc_mI(x\in R_m) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)
    当输入空间的划分确定时,可以用平方误差 x i R m ( y i f ( x i ) ) 2 \sum_{x_i\in R_m}(y_i-f(x_i))^2 来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。易知,单元 R m R_m 上的最优质 c m ^ \hat{c_m} R m R_m 上的所有输入实例 x i x_i 对应的输出 y i y_i 的均值,即
    c m ^ = a v e ( y i x i R m )                                              2 \hat{c_m}=ave(y_i|x_i\in R_m) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2)
    问题是怎么对输入空间进行划分呢?
    这里采用启发式的方法,选择地 j j 个变量 x ( j ) x^{(j)} 和它取的值 s s ,作为切分变量和切分点,并定义两个区域:
    R 1 ( j , s ) = { x x ( j ) s }             R 2 ( j , s ) = { x x ( j ) > s }   3 R_1(j,s)=\{{x|x^(j)\leq s}\} \ \ \ \ \ 和 \ \ \ \ \ R_2(j,s)=\{{x|x^(j)\gt s}\} \ (3)
    然后寻找最优切分变量 j j 和最优切分点 s s 。具体地,求解
    m i n j , s [ m i n c 1 x i R 1 ( j , s ) ( y i f ( x i ) ) 2 + m i n c 2 x i R 2 ( j , s ) ( y i f ( x i ) ) 2 ]   ( 4 ) min_{j,s}[min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-f(x_i))^2+min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-f(x_i))^2] \ (4)
    对固定输入变量 j j 可以找到最优切分点 s s
    c 1 ^ = a v e ( y i x i R 1 ( j , s ) )           c 2 ^ = a v e ( y i x i R 2 ( j , s ) )      ( 5 ) \hat{c_1}=ave(y_i|x_i\in R_1(j,s))\ \ \ \ 和\ \ \ \ \hat{c_2}=ave(y_i|x_i\in R_2(j,s)) \ \ \ \ (5)
    遍历所有输入变量,找到最优的切分变量 j j ,构成一个对 ( j , s ) (j,s) 。依次将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止。这样就生成一棵回归树。这样的回归树被称为最小二乘回归树
最小二乘回归树生成算法
输入:训练数据集D
输出:回归树f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉回归树:
(1)选择最优切分变量j与切分点s,求解求解式(4);
   遍历变量j,对固定的划分变量j扫描切分点s,选择使式(4)达到最小值的对(j,s)
(2)用选定的对(j,s)划分区域并决定相应的输出值:
求解式(3),于此同时得到式(5)的值。
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。
(4)将输入划分为M个区域R1,...,RM,生成决策树。用式(1)。
  • CART分类树
    与CART回归树选择最小二乘法来选择最优特征和最优切分点不同,CART分类树用基尼指数选择最优特征和最优二值切分点。基尼指数的定义如下:
    对于给定样本集合 D D ,假设有 K K 个类,样本点属于第 k k 类的概率为 p k p_k ,则其基尼指数为:
    G i n i ( D ) = k = 1 K p k ( 1 p k ) = 1 k 1 K ( C k D ) 2          ( 6 ) Gini(D)=\sum_{k=1}^K p_k(1-p_k)=1-\sum_{k-1}^K\left(\frac{|C_k|}{|D|}\right)^2 \ \ \ \ \ \ \ \ (6)
    对于二分类问题,若样本点属于第1类的概率为 p p ,则对于的基尼指数为:
    G i n i ( D ) = 1 2 p ( 1 p )                                               ( 7 ) Gini(D)=1-2p(1-p) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (7)
    如果样本集合D根据特征A是否取某一可能值 a a 被分割成 D 1 D_1 D 2 D_2 两部分,即
    D 1 = { ( x , y ) D A ( x ) = a } ,        D 2 = D D 1 D_1=\{(x,y)\in D|A(x)=a\},\ \ \ \ \ \ D_2=D-D_1
    在特征A的条件下,集合D的基尼指数定义为:
    G i n i ( D , A ) = D 1 D G i n i ( D 1 ) + D 2 D G i n i ( D 2 )           ( 8 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \ \ \ \ \ \ \ \ \ (8)
    基尼指数 G i n i ( D ) Gini(D) 表示集合 D D 的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) 表示经 A = a A=a 分隔后集合 D D 的不确定性。基尼指数越大,样本集合的不确定性也就越大,这一点与熵相似。
CART分类树生成算法
输入:训练数据集D,停止计算条件
输出:CART分类决策树
根据训练数据集,从根结点开始,递归地对每个结点进行一下操作,构建二叉决策树。
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割为D1和D2两部分,利用式(8)计算A=a时的基尼指数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的最优切分点。依最优特征与最优切分点,从现有结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件(算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征)。
(4)生成CART分类决策树。

3.决策树剪枝

决策树生成算法产生的决策树容易出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,而这一简化的过程被称为剪枝
顾名思义,剪枝即从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶子结点,从而简化分类树模型。
决策树剪枝是决策树学习算法的最后一个部分,主要分为针对ID3和C4.5的决策树剪枝针对CART的CART剪枝。需要注意的是,不论是哪一种剪枝算法,都是通过极小化决策树整体的损失函数或代价函数来实现剪枝的。

  • 针对ID3和C4.5的决策树剪枝
    在ID3和C4.5的决策树生成算法中,只考虑了通过提高信息增益(信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。
    极小化决策树整体的损失函数,损失函数如下:
    C ( α ) ( T ) = i = 1 T N t H t ( T )   +   α T                              ( 9 ) C_{(\alpha)}(T)=\sum_{i=1}^{|T|}N_tH_t(T)\ +\ \alpha|T| \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (9)
    其中, T |T| 表示树 T T 的叶结点个数, t t 是树 T T 的一个叶结点, H t ( T ) H_t(T) 表示叶结点 t t 上的经验熵,表示为:
    H t ( T ) = k N t k N t log N t k N t                                       ( 10 ) H_t(T)=-\sum_{k}\frac{N_{tk}}{N_t}\log\frac{N_{tk}}{N_t}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (10)
    将式(10)带入式(9),得到以下表达式:
    C ( α ) ( T ) = i = 1 T k N t k log N t k N t   +   α T                 ( 11 ) C_{(\alpha)}(T)=-\sum_{i=1}^{|T|}\sum_{k}{N_{tk}}\log\frac{N_{tk}}{N_t}\ +\ \alpha|T| \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (11)
    将式(11)等号右边的第一项用 C ( T ) C(T) 表示,得到:
    C α ( T ) = C ( T ) + α T                                                ( 12 ) C_{\alpha}(T)=C(T)+\alpha|T| \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (12)
    在式(12)中, C ( T ) C(T) 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, T |T| 表示模型的复杂度,参数 α \alpha 控制二者之间的影响。较大的 α \alpha 促使选择较简单的模型(树);较小的 α \alpha 促使选择较复杂的模型(树); α = 0 \alpha=0 意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
    剪枝,就是 α \alpha 确定时,选择损失函数最小的模型,即损失函数最小的子树。此时,子树越大( T |T| 越大),往往与训练数据的拟合程度较好,但是模型的复杂度就较高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了二者的平衡。
针对ID3和C4.5生成的决策树的剪枝算法
输入:生成算法(ID3、C4.5)产生的整个树T,参数α
输出:修剪后的子树Tα
(1)计算每个结点的经验熵。
(2)递归地从树的叶结点向上回缩。
设一组叶结点回缩到其父结点之前与之后的整体树分别为T_Before和T_After,其对应的损失函数值分别为Cα(T_Before)和Cα(T_After),如果:
			Cα(T_After)<= Cα(T_Before)
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树Tα。
  • 针对CART的决策树剪枝
    与针对ID3和C4.5的决策树剪枝算法不同,针对CART的决策树剪枝算法由两步组成:
(1)首先从生成算法产生的决策树T0底端开始不断剪枝,直到T0的根结点,形成一个子树序列{T0,T1,...,Tn};
(2)然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从而选择最优子树。

详细讲解可参考文章

https://blog.csdn.net/wjc1182511338/article/details/76793164

4.基尼指数(Gini index)与熵(entropy)的关系

首先,我们可以看一下二者的定义:
G i n i ( X ) = k = 1 K p k ( 1 p k ) Gini(X)=\sum_{k=1}^K{p_k}{(1-p_k)}
E n t r o p y ( X ) = k = 1 K p k ( ln p k ) Entropy(X)=-\sum_{k=1}^K{p_k}{(\ln p_k)}
已知,将 f ( x ) = ln x f(x)=-\ln x x 0 = 1 x_0=1 处进行一阶泰勒展开(忽略高阶无穷小),有:
f ( x ) = f ( x 0 ) + f ( x 0 ) ( x x 0 ) + o ( . ) = f ( 1 ) + f ( 1 ) ( x 1 ) + o ( . ) ( 1 x ) f(x)=f(x_0)+f(x_0)\prime (x-x_0)+o(.) \\ =f(1)+f(1)\prime(x-1)+o(.) \\ \approx (1-x)
因此, E n t r o p y ( X ) Entropy(X) 可近似转化为如下形式:
E n t r o p y ( X ) = k = 1 K p k ( ln p k ) = k = 1 K p k ( ln p k ) k = 1 K p k ( 1 p k ) = G i n i ( X ) Entropy(X)=-\sum_{k=1}^K{p_k}{(\ln p_k)}\\ =\sum_{k=1}^Kp_k(-\ln p_k) \\ \approx\sum_{k=1}^Kp_k(1-p_k) \\=Gini(X)
从而可以解释CART算法为什么要使用 G i n i Gini 指数的原因:
图1 二类分类中基尼指数、熵之半和分类误差率的关系

(1)如上,Gini指数可以作为熵模型的近似代替,上图表现得很直观;
(2)相比于熵,Gini指数由于没有指数部分而使得运算量少。

猜你喜欢

转载自blog.csdn.net/yzcjwddbdgg/article/details/85251353