决策树算法笔记

决策树是一种用于分类与回归的非参数学习的监督方法。
优点:模型具有可读性,分类速度快。
决策树学习包括三个步骤:特征选择决策树的生成决策树的修剪
决策树三个重要的算法:ID3C4.5CART

1. 决策树模型

分类决策树模型表示基于特征对实例进行分类的树形结构,可认为是if-then规则的集合,也可认为是定义在特征空间与类空间上的条件概率分布

用决策树分类,从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点。每个子结点对应该特征的一个取值。如此递归,直至达到叶结点。最后将实例分到叶结点的类中。

决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备,即每个实例都只被一条路径或一条规则所覆盖。

决策树条件概率分布:假设 X X 为表示特征的随机变量, Y Y 为表示类的随机变量,那么这个条件概率分布可以表示为 P ( Y X ) P(Y|X) X X 取决于给定划分下单元的集合, Y Y 取值于类的分类。

2. 特征选择

2.1 信息论基础

2.1.1 信息量

信息量是对信息的度量,信息的大小与随机事件发生的概率有关,越小概率发生的事情其信息量越大。因此,信息量随着随机事件的发生概率而递减,且不为负。
有两个独立事件 x x y y ,那么其信息之和:
h ( x , y ) = h ( x ) + h ( y ) h(x,y) = h(x) + h(y)
而由于 x x y y 独立,其同时发生的概率:
p ( x , y ) = p ( x ) p ( y ) p(x,y) = p(x) * p(y)
因为只有对数的真数相乘能够对应对数的相加形式,因此 h ( x ) h(x) p ( x ) p(x) 的对数有关,从而得到信息量的公式:
h ( x ) = l o g 2 p ( x ) h(x) = -log_{2}p(x)

  • 因为 0 p ( x ) 1 0\le p(x) \le 1 ,因此需要加上负号,保证 h ( x ) 0 h(x) \ge 0
  • 通常以2作为对数的底

2.1.2 信息熵

熵是表示随机变量不确定的度量,也即所有可能发生事件所带来的信息量的期望。
X X 是一个取有限个值的离散随机变量,其概率分布为
P ( X = x i ) = p i , i = 1 , 2 ,   , n P(X=x_{i}) = p_{i}, i =1,2,\cdots,n
则随机变量 X X 的熵定义为
H ( X ) = i = 1 n p i log p i H(X) = - \sum\limits_{i=1}^{n}p_{i}\log{p_{i}}

熵只依赖于 X X 的分布,而与 X X 的取值无关,因此可将X的熵记作 H ( p ) H(p) ,即
H ( p ) = i = 1 n p i log p i H(p) = -\sum\limits_{i=1}^{n}p_{i}\log{p_{i}}
熵越大,随机变量的不确定性越大,从上式可知
0 H ( p ) log n 0 \le H(p) \le \log{n}

2.1.3 条件熵

设有随机变量 ( X , Y ) (X,Y) ,其联合概率分布为

P ( X = x i , Y = y i ) = P i j , i = 1 , 2 ,   , n ; j = 1 , 2 ,   , m P(X=x_{i},Y=y_{i}) = P_{ij}, i =1,2,\cdots,n; j=1,2,\cdots,m

条件熵 H ( Y X ) H(Y |X ) 表示在已知随机变量 X X 的条件下随机变量 Y Y 的不确定性。随机变量 X X 给定条件下随机变量 Y Y 的条件熵 H ( Y X ) H(Y|X) ,定义为 X X 给定条件下 Y Y 的条件概率分布的熵对 X X 的数学期望

H ( Y X ) = i = 1 p i H ( Y X = x i ) H(Y|X) = \sum\limits_{i = 1}p_{i}H(Y|X = x_{i})

这里, p i = P ( X = x i ) p_{i} = P(X = x_{i}) , i = 1 , 2 ,   , n i = 1,2,\cdots, n

2.1.4 信息增益

特征 A A 对训练数据集 D D 的信息增量 g ( D , A ) g(D,A) ,定义为集合 D D 的经验熵 H ( D ) H(D) 与特征 A A 给定条件下 D D 的经验条件熵 H ( D A ) H(D|A) 之差,即
g ( D , A ) = H ( D ) H ( D A ) g(D,A) = H(D) - H(D|A)
经验熵 H ( D ) H(D) 表示对数据集 D D 进行分类的不确定性,而经验条件熵 H ( D A ) H(D|A) 表示在特征 A A 给定的条件下对数据集 D D 进行分类的不确定性。它们之差即信息增益,表示由于特征 A A 而使得对数据集 D D 的分类的不确定性减少的程度。

假定特征A有 n n 个取值,则
g ( D , A ) = H ( D ) i = 1 n D i D H ( D i ) g(D,A) = H(D) - \sum\limits_{i=1}^{n}\frac{|D^{i}|}{|D|}H(D_{i})

2.1.5 信息增益比

特征 A A 对训练数据集 D D 的信息增益比 g R ( D , A ) g_{R}(D,A) 定义为其信息增益 g ( D , A ) g(D,A) 与训练数据集 D D 关于特征 A A 的值的熵 H A ( D ) H_{A}(D) 之比,即
g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}(D,A) = \frac{g(D,A)}{H_{A}(D)}
其中, H A ( D ) = i = 1 n D i D l o g 2 D i D H_{A}(D) = -\sum\limits_{i=1}^{n}\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|} n n 是特征 A A 取值的个数。

2.2 特征选择准则

特征选择在于选取对训练数据具有分类能力的特征,这样可提高决策树学习的效率。如果一个特征进行分类的结果与随机分类无很大差别,则称这个特征是没有分类能力的。通常特征选择的准则是信息增益信息增益比

根据信息增益准则的特征选择方法是:对训练数据集 D D ,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

以信息增益准则划分,存在偏向选择取值较多的特征的问题,因此使用信息增益比可以校正这一问题,特征选择方法同信息增益准则。

3. 决策树的生成和剪枝

3.1 ID3算法

3.1.1 算法过程

输入:训练数据集 D D ,特征集 A A ,阈值 ϵ \epsilon
输出:决策树 T T
算法:

  1. D D 中所有实例属于同一类 C k C_{k} ,则 T T 为单结点树,并将类 C k C_{k} 作为该结点的类标记,返回 T T
  2. A = A = \varnothing ,则 T T 为单结点树,并将 D D 中实例数最大的类 C k C_{k} 作为该结点的类标记,返回 T T
  3. 否则,计算 A A 中各特征对 D D 的信息增益,选择信息增益最大的特征 A g A_{g}
  4. 如果 A g A_{g} 的信息增益小于阈值 ϵ \epsilon ,则置 T T 为单结点树,并将 D D 中实例数最大的类 C k C_{k} 作为该结点的类标记,返回 T T
  5. 否则,对 A g A_{g} 的每一可能值 a i a_{i} ,依 A g = a i A_{g} = a_{i} D D 分割为若干非空子集 D i D_{i} ,将 D i D_{i} 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T ,返回 T T
  6. 对第 i i 个子结点,以 D i D_{i} 为训练集,以 A { A g } A-\{A_{g}\} 为特征集,递归地调用步骤1-5,得到子树 T i T_{i} ,返回 T i T_{i}

3.1.2 算法不足

  • 不能处理连续型特征
  • 容易偏向取值较多的特征
  • 没有考虑缺失值
  • 容易过拟合

3.2 C4.5算法

针对ID3算法的不足做出的改进算法。

3.2.1 对ID3不足的改进

  • 将连续的特征离散化
    比如 m m 个样本的连续特征 A A 有m个,从小到大排列为 a 1 , a 2 ,   , a m a_{1},a_{2},\cdots,a_{m} ,则C4.5取相邻两样本值的平均数,一共取得 m 1 m-1 个划分点,其中第 i i T i T_{i} 划分点表示为: T i = a i + a i + 1 2 T_{i} = \frac{a_{i}+a_{i+1}}{2} 。对于这 m 1 m-1 个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为 a t a_{t} ,则小于 a t a_{t} 的值为类别 1 1 ,大于 a t a_{t} 的值为类别2,这样就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
  • 用信息增益比选择特征
  • 缺失值处理:
    (1)在属性值缺失的情况下进行划分属性选择:将每个样本赋予一个权重,然后对于某个有缺失值的特征A,将数据划分为两部分,一部分是无缺失A的数据D1,另一部分是有缺失A的数据D2。利用D1数据计算加权后的信息增益比,最后乘上一个系数,这个系数为无缺失A特征的样本加权后占加权总样本的比例。
    (2)给定划分属性,若样本在该属性上的值缺失,对样本进行划分:将缺失特征的样本同时划分入所有的子结点,但权重将分别调整为各个子结点样本的数量比例。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4。则a同时划分入A1,A2,A3,且样本a对应这3个结点的权重调节为 2 9 , 3 9 , 4 9 \frac{2}{9},\frac{3}{9}, \frac{4}{9}
  • 引入正则化系数进行初步剪枝

3.2.2 算法过程

与ID3相同,只是将特征选择准则替换为信息增益比。

3.2.3 算法不足

  • 生成的是多叉树
  • 只能用于分类
  • 使用熵模型,涉及大量对数运算,强度大很耗时

3.2.4 剪枝

剪枝的意义:减少生成的决策树的复杂度,避免出现过拟合,对决策树进行简化。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父节点作为新的叶结点,从而简化分类树模型。

设树 T T 的叶结点个数为 T |T| t t 是树 T T 的叶结点,该叶结点有 N t N_{t} 个样本点,其中 k k 类的样本点有 N k N_{k} 个, k = 1 , 2 ,   , K k=1,2,\cdots,K H t ( T ) H_{t}(T) 为叶结点 t t 上的经验熵, α 0 \alpha \geq 0 为参数,则决策树的损失函数为:
C α ( T ) = t = 1 T N t H t ( T ) + α T C_{\alpha}(T) = \sum\limits_{t=1}^{|T|}N_{t}H_{t}(T)+\alpha|T|
其中经验熵为
H t ( T ) = k N t k N t log N t k N t H_{t}(T) = -\sum_{k}\frac{N_{tk}}{N_{t}}\log{\frac{N_{tk}}{N_{t}}}
C ( T ) = t = 1 T N t H t ( T ) = t = 1 T k = 1 K N t k log N t k N t C(T) =\sum\limits_{t=1}^{|T|}N_{t}H_{t}(T) = -\sum\limits_{t=1}^{|T|}\sum\limits_{k=1}^{K}N_{tk}\log{\frac{N_{tk}}{N_{t}}}
这时有
C α ( T ) = C ( T ) + α T C_{\alpha}(T) = C(T) + \alpha|T|
其中, C ( T ) C(T) 表示模型对训练数据的预测误差,即模型与训练集的拟合程度, T |T| 表示模型复杂度,参数 α 0 \alpha \geq 0 控制两者之间的影响。

剪枝,就是当 α \alpha 确定时,选择损失函数最小的模型,即损失函数最小的树。子树越大,往往与训练数据拟合度高,但模型复杂度也高;反之,模型复杂度越低,拟合越差。

决策树的生成,只考虑了通过提高信息增益或信息增益比对训练数据进行更好的拟合。而决策树的剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。

剪枝算法:
输入:生成算法产生的整个树 T T ,参数 α \alpha
输出:修剪后的子树 T α T_{\alpha}
算法:

  1. 计算每个结点的经验熵
  2. 递归地从树的叶结点向上回缩
    设一组叶结点回缩到其父结点之前与之后的整体树分别为 T B T_{B} T A T_{A} ,其对应的损失函数值分别是 C α ( T B ) C_{\alpha}(T_{B}) C α ( T A ) C_{\alpha}(T_{A}) ,如果 C α ( T A ) C α ( T B ) C_{\alpha}(T_{A}) \le C_{\alpha}(T_{B}) 则进行剪枝,即将父结点变为新的叶结点;
  3. 返回步骤2,直至不能继续为止,得到损失函数最小的子树 T T

3.3 CART算法

3.3.1 分类树

3.3.1.1 基尼指数

分类问题中,假设有 K K 个类别,样本点属于第 k k 个类的概率为 p k p_{k} ,则基尼指数的表达式为:
G i n i ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2 Gini(p) = \sum\limits_{k=1}^{K}p_{k}(1-p_{k}) = 1 - \sum\limits_{k=1}^{K}p_{k}^2

二分类问题,如果样本点属于第1个类的概率是 p p ,则基尼指数表达式为:

G i n i ( p ) = 2 p ( 1 p ) Gini(p) = 2p(1-p)

对于给定的样本 D D ,假设有 K K 个类别,第 k k 个类别的数量为 C k C_{k} ,则样本 D D 的基尼指数为:

G i n i ( D ) = 1 k = 1 K ( C k D ) 2 Gini(D) = 1 - \sum\limits_{k=1}^{K}(\frac{|C_{k}|}{|D|})^2

对于样本 D D ,如果特征 A A n n 个取值,则在特征 A A 的条件下, D D 的基尼指数为:
G i n i ( D , A ) = i = 1 n D i D G i n i ( D i ) Gini(D,A) = \sum\limits_{i=1}^{n}\frac{|D_{i}|}{|D|}Gini(D_{i})
基尼指数 G i n i ( D ) Gini(D) 表示集合 D D 的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) 表示经 A = a A=a 分割后集合 D D 的不确定性。基尼指数值越大,样本集合的不确定性也就越大。

3.3.1.2 分类树算法与C4.5不同
  • CART在处理连续值时,思想与C4.5类似,唯一不同是CART使用基尼指数最小化准则作为特征选择指标。基尼指数代表模型的不纯度,基尼指数越小,不纯度越低,特征越好。
  • 采用不停的二分离散特征处理离散值,二叉树
    举例:根据某个特征 A A 建立节点,而它有 A 1 A1 , A 2 A2 , A 3 A3 三种类别。CART分类树会考虑把 A A 分成 { A 1 } \{A1\} { A 2 , A 3 } \{A2,A3\} { A 2 } { A 1 , A 3 } \{A2\}和\{A1,A3\} { A 3 } { A 1 , A 2 } \{A3\}和\{A1,A2\} 三种情况,找到基尼指数最小的组合,比如 { A 2 } \{A2\} { A 1 , A 3 } \{A1,A3\} ,然后建立二叉树节点,一个节点是 A 2 A2 对应的样本,另一个节点是 { A 1 , A 3 } \{A1,A3\} 对应的节点。同时,由于这次没有把特征 A A 的取值完全分开,后面还有机会在子节点继续选择到特征 A A 来划分 A 1 A1 A 3 A3 。而在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。
3.3.1.3 算法过程

输入:训练集 D D ,基尼系数的阈值,样本个数阈值
输出:决策树 T T
算法:

  1. 对于当前节点的数据集 D D ,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归;
  2. 计算样本集 D D 的基尼指数,如果基尼系数小于阈值,则返回决策子树,当前节点停止递归;
  3. 计算当前节点现有的各个特征的各个特征值对数据集 D D 的基尼指数;
  4. 在计算出来的各个特征的各个特征值对数据集 D D 的基尼系统中,选择基尼系数小的特征A和对应的特征值 a a 。根据这个最优特征和最优特征值,把数据集划分为两部分 D 1 D1 D 2 D2 ,同时建立当前节点的左右节点,左节点的数据集为 D 1 D1 ,右节点的数据集为 D 2 D2
  5. 对于左右的子节点递归调用步骤1-4,生成决策树。

3.3.2 回归树

CART回归树用平方误差最小化准则进行特征选择,度量目标是对于任意划分特征 A A ,对应划分点 s s 划分成数据集 D 1 D1 D 2 D2 ,求出使 D 1 D1 D 2 D2 各自集合的均方差最小,同时 D 1 D1 D 2 D2 的均方差之和最小对应的特征和特征值划分点。
min j , s [ min c 1 x i D 1 ( A , s ) ( y i c 1 ) 2 + min c 2 x i D 2 ( A , s ) ( y i c 2 ) 2 ] \min\limits_{j,s}[\min\limits_{c_{1}}\sum\limits_{x_{i}\in D_{1}(A,s)}(y_{i} - c_{1})^2+\min\limits_{c_{2}}\sum\limits_{x_{i}\in D_{2}(A,s)}(y_{i} - c_{2})^2]
其中, c 1 c_{1} D 1 D1 数据集的样本输出均值, c 2 c_{2} D 2 D2 数据集的样本输出均值。

3.3.2.1 与分类树不同
  • 样本输出的是连续值,而分类树样本输出的是离散值
  • 用评测误差最小化准则进行特征选择
  • 采用最终叶子的均值或中位数来预测输出结果,而分类树则是采用叶子节点中概率最大的类别作为当前节点的预测类别。
3.3.2.2 算法过程

输入:训练数据集 D D
输出:回归树 f ( x ) f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量 j j 与切分点 s s ,求解
KaTeX parse error: Expected group after '_' at position 5: \min_̲\limits{j,s}[\m…
遍历变量 j j ,对固定的切分变量 j j 扫描切分点 s s ,选择使上式达到最小值的对 ( j , s ) (j,s)
(2)用选定的对 ( j , s ) (j,s) 划分区域并决定相应的输出值:
R 1 ( j , s ) = { x x ( j ) s } , R 2 ( j , s ) = { x x ( j ) > s } R_{1}(j,s) = \{x | x^{(j)} \le s\}, R_{2}(j,s) = \{x | x^{(j)} \gt s\}
c m ^ = 1 N m x i R m ( j , s ) y i , x R m , m = 1 , 2 \hat{c_{m}} =\frac{1}{N_{m}}\sum\limits_{x_{i}\in R_{m}(j,s)}y_{i}, x \in R_{m},m=1,2
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件
(4)将输入空间划分为 M M 个区域 R 1 , R 2 ,   , R M R_{1},R_{2},\cdots,R_{M} ,生成决策树:
f ( x ) = m = 1 M c ^ m I ( x R m ) f(x) = \sum\limits_{m=1}^{M}\hat{c}_{m}I(x\in R_{m})

3.3.3 剪枝

用通俗的方式理解主要思路:对于原始的CART树A0,先剪去一颗子树,生成子树A1,再从A1剪去一颗字数生成A2,直到最后剪到只剩一个根结点的子树An,于是得到了A0到An一共n+1颗子树。然后再用n+1颗子树预测独立的验证数据集,看哪个误差小选哪个。

如何剪枝,要剪哪个结点:对整体树 T 0 T_{0} 中每个内部结点t,计算
g ( t ) = C ( t ) C ( T t ) T t 1 g(t) = \frac{C(t)-C(T_{t})}{|T_{t}|-1}
它表示剪枝后整体损失函数减少的程度,也可认为是剪枝的阈值(该式由 C α ( t ) = C ( t ) + α C_{\alpha}(t) = C({t}) + \alpha C α ( T t ) = C ( T t ) + α T t C_{\alpha}(T_{t}) = C({T_{t}}) + \alpha|T_{t}| 两者联立得)。当 α = g ( t ) \alpha=g(t) 时,剪与不剪是一样的,如果此时 α \alpha 增加,则不剪整体损失大于剪,该剪,反之则不该剪。因此,在 T 0 T_{0} 中剪去 g ( t ) g(t) 最小的 T t T_{t} ,将得到的子树作为 T 1 T_{1} ,同时将最小的 g ( t ) g(t) 设为 α 1 \alpha_{1} T 1 T_{1} 为区间 [ α 1 , α 2 ) [\alpha_{1},\alpha_{2}) 的最优子树。如此剪枝下去,直至得到根结点。在这一过程中,不断增加 α \alpha 的值,产生新的区间。

具体的算法过程如下:
输入:CART算法生成的决策树 T 0 T_{0}
输出:最优决策树 T α T_{\alpha}

  1. k = 0 k =0 T = T 0 T = T_{0}

  2. α = + \alpha = + \infty

  3. 自下而上地对各内部结点 t t 计算 C ( T t ) C(T_{t}) T t |T_{t}| ,以及
    g ( t ) = C ( t ) C ( T t ) T t 1 g(t) = \frac{C(t) - C(T_{t})}{|T_{t}|-1}
    α = m i n ( α , g ( t ) ) \alpha = min(\alpha,g(t))

    这里, T t T_{t} 表示以 t t 为根结点的子树, C ( T t ) C(T_{t}) 是对训练数据的预测误差, T t |T_{t}| T t T_{t} 的叶结点个数。

  4. g ( t ) = α g(t) = \alpha 的内部结点 t t 进行剪枝,并对叶节点 t t 以多数表决法决定其类,得到树 T T

  5. k = k + 1 k = k+1 , α k = α \alpha_{k} = \alpha , T k = T T_{k} = T

  6. 如果 T k T_{k} 不是由根结点及两个叶结点构成的树,则回到步骤(3);否则令 T k T_{k} = T{n}

  7. 采用交叉验证法在子树序列 T 0 , T 1 ,   , T n T_{0},T_{1},\cdots,T_{n} 中选取最优子树 T a T_{a}

3.4 ID3, C4.5, CART算法比较

算法 支持模型 树结构 特征选择 连续值处理 缺失值处理 剪枝
ID3 分类 多叉树 信息增益 不支持 不支持 不支持
C4.5 分类 多叉树 信息增益比 支持 支持 支持
CART 分类,回归 二叉树 基尼指数,均方差 支持 支持 支持

4. 决策树优缺点

4.1 优点

  • 简单直观,易于理解和解释
  • 基本不需要预处理,如归一化、处理缺失值等
  • 能够同时处理离散值和连续值
  • 使用决策树预测的代价是 O ( log 2 m ) O(\log_{2}{m}) ,m为样本数
  • 可以处理多维度输出的分类问题
  • 常用于集成算法,如随机森林、提升树等

4.2 缺点

  • 容易过拟合(可以通过设置节点最少样本数量和限制决策树深度改进)
  • 容易偏向于样本比例过大的特征(可以通过调节样本权重改善)
  • 样本轻微改动会导致树结构的剧烈改变(可以通过集成学习之类的方法改善)
  • 寻找最优决策树是个NP难的问题,通过启发式方法容易陷入局部最优(可以通过集成学习之类方法改善)

5.sklearn应用

详见decision_trees.ipynb

6. reference

本文同步发布在我的github.io

猜你喜欢

转载自blog.csdn.net/weixin_43004311/article/details/82556625