机器学习算法及实战——决策树(二)

if-then规则集合
  • 一条由根节点到叶节点的路径 –> 一条规则
  • 路径上内部节点的特征 –> 规则的条件
  • 叶节点的类 –> 规则的结论
  • 性质:互斥且完备

1.特征选择算法

输入:训练数据集D和特征A;
输出:特征A对训练数据集D的信息增益g(D,A)
(1) 计算数据集D的经验熵H(D),

H ( D ) = k = 1 K | C k | | D | l o g 2 | C k | | D |

(2) 计算特征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 |

(3) 计算信息增益g(D, A),
g ( D | A ) = H ( D ) H ( D | A )

其中假设训练数据集D, | D | 表示样本个数,设有K个类 C k , | C k | 表示属于类 C k 的样本个数,根据特征A的n个不同的取值将训练数据集D划分为n个子集 D 1 , D 2 , , D n ,其中 | D i | 表示子集 D i 中的样本数,记子集 D i 中属于类 C k 的样本的集合为 D i k

Notes:上述过程是一次特征挑选的过程,首先计算原始数据的经验熵,然后对每一个特征(轮流判断),首先根据该特征的所有不同取值将原始数据进行划分,得到的数据子集分别计算该子集的经验熵,然后按照该子集本身样本占比加权(按概率)加和起来作为经验条件熵,两相作差即为该特征对应的信息增益值,而在计算所有特征对应的信息增益之后,我们选出其中信息增益最大的特征作为分割的特征对数据集进行划分,而且后面涉及到决策树的生成过程就是一个递归的对子数据集挑选最佳特征然后划分数据集的过程。

2.ID3

核心思想

  • 在决策树的各个结点上应用信息增益准则选择特征,递归地构建决策树。
  • 递归终止条件:所有特征的信息增益(设置信息增益的阈值来判断是否进一步划分)均很小或没有特征可以选择(每选择一个特征则后期划分子树不再使用前面使用过的特征,因为子树已经是在该特征下属于同一取值的实例集合)为止。
  • ID3相当于用极大似然法进行概率模型的选择。

算法-决策树生成

输入:训练数据集D和特征集A,阈值 ε
输出:决策树T
(1) (叶子结点)若D中所有实例属于同一类 C k ,则T为单节点树,并将类 C k 作为该结点的类标记,返回T;
(2) (终止条件之没有特征可供选择)若 A = ,则T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记(多数表决规则),返回T;
(3) 否则计算A中各特征对D的信息增益,选择信息增益最大的特征 A g ;
(4) (终止条件之阈值)若 A g 的信息增益小于阈值 ε ,则置T为单节点树,并将D中实例数最大的类 C k 作为该结点的类标记,返回T;
(5) 否则,对 A g 的每一可能值 a i ,依 A g = a i 将D划分为若干非空子集 D i ,并将 D i 中实例数最大的类作为标记构建子节点,返回 T i ;
(6) 对第i个子节点,以 D i 为训练集, A { A g } 为特征集,递归地调用(1)~(5)得到子树 T i 并返回。

3. C4.5

C4.5算法与ID3算法类似,不同之处在于,C4.5在生成的过程中,用信息增益比来选择特征。

输入:训练数据集D和特征集A,阈值 ε
输出:决策树T
(1) (叶子结点)若D中所有实例属于同一类 C k ,则T为单节点树,并将类 C k 作为该结点的类标记,返回T;
(2) (终止条件之没有特征可供选择)若 A = ,则T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记(多数表决规则),返回T;
(3) 否则计算A中各特征对D的信息增益比,选择信息增益比最大的特征 A g ;
(4) (终止条件之阈值)若 A g 的信息增益比小于阈值 ε ,则置T为单节点树,并将D中实例数最大的类 C k 作为该结点的类标记,返回T;
(5) 否则,对 A g 的每一可能值 a i ,依 A g = a i 将D划分为若干非空子集 D i ,并将 D i 中实例数最大的类作为标记构建子节点,返回 T i ;
(6) 对第i个子节点,以 D i 为训练集, A { A g } 为特征集,递归地调用(1)~(5)得到子树 T i 并返回。

Notes:上述决策树的生成算法只有树的生成,而且是针对训练集构造的树,容易产生过拟合。

4.剪枝

定义
在决策树学习中将已生成的树进行简化的过程

实现
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现

决策树的损失函数

C α ( T ) = t = 1 | T | | N t | H t ( T ) + α | T |

T | T | t | N t | k | N t k |
H t ( T )

H t ( T ) = k = 1 K | N t k | | N t | l o g 2 | N t k | | N t |

C ( T ) = t = 1 | T | | N t | H t ( T )
C α ( T ) = C ( T ) + α | T |

C ( T ) | T | α

Notes:
α
利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。

5.剪枝算法

输入:生成算法产生的整棵树T,参数\alpha
输出:修剪后的子树T\alpha
(1)计算每个结点的经验熵
(2)递归地从叶节点向上回缩:设叶节点回缩到其父节点之前与之后的整体树分别为 T B T A

C α ( T A ) C α ( T B )

则进行剪枝,即将父节点变为新的叶结点(关于这里叶节点的类别标记应该仍是以多数表决的方法)。
(3)返回(2)直至不能继续,得到损 T α

Notes:在向上回缩过程中判断损失函数值大小时,计算可以在局部进行,所以决策树的剪枝算法可以由一种动态规划的算法实现

6.CART(classification and regression tree)算法

与ID3,C4.5的区别

CART假设决策树是二叉树,而ID3,C4.5生成的过程中并无此假设,这也导致了两者的根本不同,ID3,C4.5每次选择出最佳特征之后,是按照该特征的每一个取值划分子树;而CART则是对每一个特征、每一个特征的每一个取值计算基尼指数(分类树)然后从所有特征、所有特征对应的取值计算所得的基尼指数中最小的特征及特征值作为切分点来划分子树,而划分依据则是判断实例对应特征的值是否等于该选定的特征值

  • 子树划分(特征选择)的准则不同
    – 回归树,平方误差最小化准则
    – 分类树,基尼指数最小化准则

算法-CART回归树

输入:训练数据集D
输出:回 f ( x )
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树
(1) 选择最 s j 求解

m i n j , s [ m i n c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + m i n c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ]

遍历 j j s 使 s , j
(2) 用选 s , j 决定相应的输出值:
R 1 ( j , s ) = { x | x ( j ) s } ; R 2 ( j , s ) = { x | x ( j ) > s } c m ^ = a v e ( y i | x i R m )

(3) 继续对两个子区域调用步骤(1),(2)直至满足停止条件
(4) 将输入空间划 M R 1 , R 2 , , R M 策树
f ( x ) = m = 1 M c m I ( x R m )

理解:回归树
X , Y Y 变量,给定训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , , ( x N , y N ) }
一个回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值,所以我们的主要目的是要构建回归树,也就是如何划分输入空间,因为一旦划分好输入空间,如将输入空间划 M R 1 , R 2 , , R M , 且在每个单元 R m c m 那么回归树的模型就可以表示为

f ( x ) = m = 1 M c m I ( x R m )

如何划分输入空间?
仍然是采用启发式的方法(尝试),假设我们取j的某 s 分实例点,就可以根据各实例点对应该 j 取值与选定的特征 s 大小来划分,即
R 1 ( j , s ) = { x | x ( j ) s }

R 2 ( j , s ) = { x | x ( j ) > s }

如何选择最优切分点s和对应的切分 j ?
逐一计算和比较,比较的标准是平方误差最小化,即
m i n j , s [ m i n c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + m i n c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ]

,这里 c 1 , c 2 就是各个区域的输出,那么各个区域的输出又是怎么得到的呢?
如何得到各区域的输出?
仍然是依照平方误差最小准则,计算 x i R m ( y i f ( x i ) ) 2 所以计算得到的单元 R m c m 的最优值刚好是 R m x i y i 均值,即

c m ^ = a v e ( y i | x i R m )

小结一下,通过计算各区域的实例对应的输出的均值可以得到当前尝试的划分点和划分变量划分的各区域的输出,从而可以计算和比较不同的切分点和切分变量下的误差,并进一步根据平方误差最小化准则从中选取出最优的切分点和切分变量,而确定了切分点和切分变量就相当于确定了区域的一个划分,接下来针对已划分的区域进一步根据需求进行划分或者停止划分就最终将输入空间划分为多个区域,而每个区域对应有一个确定的输出值,也就是构建好了一颗回归树。

分类树

分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点

基尼指数(不纯度)
Notes:基尼指数是一种比较流行的选择,此外也可以用分类错误来计算

定义
分类问题中,假设有K个类,样本点属于第k类的概率 p k , 概率分布的基尼指数定义为

G i n i ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2

对于给定的样本集合D,其基尼指数为

G i n i ( D ) = 1 k = 1 K ( | C k | | D | ) 2

其中, C k D k 样本子集, K 是类的个数
特征 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 )

,其中样本集合D根据特征A是否取某一可能值 a D 1 , D 2 两部分
D 1 = { ( x , y ) D | A ( x ) = a } ; D 2 = D D 1

基尼指数 G i n i ( D ) 表示集合D的不确定性,基尼指数 G i n i ( D , A ) 表示经A=a分割后集合D的不确定性,基尼指数值越大,样本集合的不确定性也就越大。

算法-CART分类树

输入:训练数据集D,停止计算的条件(如结点中样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多的特征)
输出:CART决策树
从根结点开始,递归地对每个结点进行以下操作:
(1) 设结点的训练数据集为D,计算现有特征对该数据集的基尼指数,对每一个特征A,对其可能的每一个取值a,根据样本点对A=a的测试为“是”或“否”将D分割 D 1 D 2 分,计算 A = a 时的基尼指数。
(2) 在所有可能的特征A以及它们所有可能的切分 a 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3) 对两个节点递归地调用(1),(2)直至满足停止条件
(4) 生成CART决策树.

CART剪枝

基本原理
首先从生成算法产生的决策 T 0 端开始不断剪枝,直到 T 0 根节点,形成一个子树序列 { T 0 , T 1 , , T n }
然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树
剪枝过程理解
基本原理如上所述,就是由先前生成的CART决策树开始逆向剪枝得到一系列不同的子树集合,然后使用另一份验证集来对上述子树测试选出其中损失函数最小的子树
而由于我们根据损失函数最小来选取决策树,而由损失函数的定义

C α ( T ) = t = 1 | T | | N t | H t ( T ) + α | T |

而我们主要是通过调整\alpha的值来权衡模型对训练集的预测能力和模型复杂度,因此对于固定的 α 必然存在使损失函 C α ( T ) 小的子树,而极端情况下,前面根据CART生成算法得到的决策树 T 0 为是模型复杂度最大时的树,即此时可认为 α = 0 ,而当 α = + 时对应的是以根结点为单节点树的简单模型

如此一来对于每一 α 的值,存在一个不同的子树模型,我们可以通过慢慢的从原始生成树中剪去叶节点并收集新得到的决策树,最后可以得到一个决策树的集合,而这个修剪和收集的过程,为了保证收集到完备的决策树序列,我们每次在原始生成树的基础上比较每个结点的剪枝前后的损失函数减少程度(即比较以该节点为根的节点的模型的损失与以该节点为单节点的模型的损失之差),并选取损失函数减少程度最小的一个子树部分,从原始生成树中剪去该子树得到新的子树保存到子树序列,并作为进一步剪枝的起始子树,直到最后得到以根节点为单节点模型。

Notes:机器学习技法中的CART剪枝过程似乎有所不同,不是穷尽所有决策树,而是从完全决策树逆向剪枝,每次减去某个叶子然后得到这‘一层’间之后的决策树的模型中误差最小的,然后进行下一次剪枝,最后从这些决策树中根据泛化误差来选出最佳决策树。

算法-CART剪枝

输入:CART算法生成的决策 T 0
输出:最优决策 T α
(1) 设 k = 0 , T = T 0
(2) 设 α = +
(3) 自下而上对各内部结点 t C ( T t ) , | T t |

g ( t ) = C ( t ) C ( T t ) | T t | 1

α = m i n ( α , g ( t ) )

其中 T t t 为根节点的子树, C ( T t ) 训练数据的预测误差, | T t | T t 叶节点个数
(4) 对 g ( t ) = α 的内部节点t进行剪枝,剪去 g ( t ) 最小的子树,并对叶节点t以多数表决法决定其类,得到树T
(5) 设 k = k + 1 , α k = α , T k = T
(6) 若 T k 不是由根结点及两个叶结点构成的树,就返回(3),否则令 T k = T n (即最后一次剪枝得到根结点为单节点模型)
(7) 采用交叉验证在剪枝得到的子树序列 T 0 , T 1 , , T n 中选取最优子树 T α

决策树算法对比
如果按照特征选择、决策树生成和决策树剪枝三个步骤来比较的话

  • 在特征选择上,三个决策树算法的选择标准都不一样:ID3(信息增益)、C4.5(信息增益比)、CART(分类:基尼指数,回归:最小二乘法);此外就分类而言,ID3和C4.5分别是选择是信息增益、信息增益比最大的特征而CART则选择基尼指数最小的特征;
  • ID3、C4.5每次选择特征并进行分支后便不再使用该特征,而CART则不同,因为CART每次是具体到选择某一特征的某一切分值,所以会存在特征的复用情况(当然是用过的特征值就不再使用了)
  • 在决策树生成时:三者的终止条件大致类似(预设阈值(叶节点中的样本数的阈值以及信息增益、基尼指数的阈值)、特征集合非空等),但是ID3和C4.5生成过程中是根据每一个特征值来生成一个对应子树,而CART则是根据特征值是否等于选定的特征值来进行二分(回归中则是根据大于小于某选定值划分区域);也就是说前两者是树,而CART是二叉树(而这也大概决定了为什么原始的CART可以用来做回归,而前两者不行);
  • 决策树剪枝方面:标准都是判断决策树整体的损失函数(预测误差+正则化项(模型复杂度));不同的是,ID3,C4.5是局部的对比叶节点删除前后的损失来决定是否剪枝,而CART则是自下而上从最复杂的完整二叉树一直剪枝到最简单的单节点决策树得到一系列决策树,并最后在验证集上验证选择其中最佳的决策树(每次剪枝为了保证最后得到的决策树序列尽可能完备,每次选择前后损失函数减少最小的一种剪枝策略)

http://izhaoyi.top/2017/06/19/Decision-Tree/

猜你喜欢

转载自blog.csdn.net/keithic/article/details/81252186