决策树(decision tree)是一种基本的分类与回归方法。用于分类时,其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的元组建立决策树模型;预测时,对新的数据,利用决策树模型进行分类。
决策树定义 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类别。
用决策树分类时,从根结点出发,对实例的某一特征进行测试,根据测试结果,将实例分配到子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分到叶结点的类中。
可以将决策树看成一个 if-then 规则的集合:由决策树的根结点到叶结点的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。决策树的路径或其对应的 if-then 规则具有一个重要的性质:互斥且完备。
决策树还可以表示给定特征条件下类的条件概率分布。将特征空间划分为互不相交的单元或区域,并在每个单元定义一个类的概率就构成了一个条件概率分布。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。各叶结点(单元)上的条件概率往往偏向于某一个类,即属于某一类的概率较大。决策树分类时将该结点的实例强行分到条件概率大的那一类。
假设给定训练数据集
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D = \{(x_1,y_1),(x_2,y_2),\dotsc,(x_N,y_N)\} D={(x1,y1),(x2,y2),…,(xN,yN)}
其中, x i = ( x i ( 1 ) , x i ( 2 ) , … , x i ( 1 ) ) T x_i=(x_i^{(1)},x_i^{(2)},\dotsc,x_i^{(1)})^T xi=(xi(1),xi(2),…,xi(1))T为输入实例(特征向量), n n n 为特征个数, y i ∈ { 1 , 2 , … , K } y_i \in \{1,2,\dotsc,K\} yi∈{1,2,…,K} 为类标记, i = 1 , 2 , … , N i=1,2,\dotsc,N i=1,2,…,N, N N N 为样本容量。
决策树学习的目标是根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。决策树学习本质上是从训练数据集中归纳出一组分类规则。决策树学习的损失函数通常是正则化的极大似然,决策树学习的策略是以损失函数为目标函数的最小化。当损失函数确定后,学习问题就变为在损失函数意义下选择最优决策树的问题。由于从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
因此决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。
特征选择在于选取对训练数据具有分类能力的特征。如果利用一个特征进行分类的结果与随机分类的结果没有很大的差别,则称这个特征是没有分类能力的,经验上扔掉这样的特征对决策树学习的精度影响不大。如果一个特征具有良好的分类能力,或者说是按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,也就是说选择这个特征后分割后的子集内比较统一稳定,混乱的程度比较低。因而通常特征选择的准则是信息增益或信息增益比。
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。设 X X X 是一个取有限个值得离散随机变量,其概率分布为
P ( X = x i ) = p i , i = 1 , 2 , … , n P(X=x_i)=p_i,i=1,2,\dotsc,n P(X=xi)=pi,i=1,2,…,n
则随机变量 X X X 的熵定义为
H ( X ) = − ∑ i = 1 n p i log p i H(X)=-\sum_{i=1}^{n}p_i\log{p_i} H(X)=−i=1∑npilogpi
若 p i = 0 p_i=0 pi=0,则定义 0 log 0 = 0 0\log 0=0 0log0=0。通常,对数以 2 为底或以 e 为底,这时熵的单位分别称作比特(bit)或纳特(nat)。由定义可知,熵只依赖于随机变量的分布,而与随机变量的取值无关,所以也可将 X X X 的熵记作 H ( p ) H(p) H(p),即
H ( p ) = − ∑ i = 1 n p i log p i H(p)=-\sum_{i=1}^{n}p_i\log{p_i} H(p)=−i=1∑npilogpi
熵越大,随机变量的不确定性就越大
设有随机变量 ( X , Y ) (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,\dotsc,n;j=1,2,\dotsc,m P(X=xi,Y=yi)=pij,i=1,2,…,n;j=1,2,…,m
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) (conditional entropy)表示在已知随机变量 X X X 的条件下随机变量 Y Y Y 的不确定性。条件熵定义为 X X X 给定条件下 Y Y Y 的条件概率分布对 X X X 的数学期望
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^{n}p_iH(Y|X=x_i) H(Y∣X)=i=1∑npiH(Y∣X=xi)
这里, p i = P ( X = x i ) , i = 1 , 2 , … , n p_i=P(X=x_i),i=1,2,\dotsc,n pi=P(X=xi),i=1,2,…,n
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵和条件熵分别是经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。此时,如果 0 概率,令 0 log 0 = 0 0 \log 0=0 0log0=0
信息增益(information gain)表示得知特征 X X X 的信息而使得类 Y Y Y 的信息的不确定性减少的程度。
信息增益 特征 A A A 对训练数据集 D D D 的信息增益 g ( D , A ) g(D,A) g(D,A), 定义为集合 D D D 的经验熵 H ( D ) H(D) H(D) 与特征 A A A 给定条件下 D D D 的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A) 之差,即
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
一般地,熵 H ( Y ) H(Y) H(Y) 与条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) 之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
决策树学习应用信息增益准则选择特征。给定训练数据集 D D D 和特征 A A A, 经验熵 H ( D ) H(D) H(D) 表示对数据集 D D D 进行分类的不确定性。而经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A) 表示在特征 A A A 给定的条件下对数据集 D D D 进行分类的不确定性。那么他们的差,即信息增益表示由于特征 A A A 而使得数据集 D D D 的分类不确定性减少的程度。显然,对于数据集 D D D 而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
信息增益的算法可总结如下:
输入训练数据集 D D D 和特征 A A A。
输出特征 A A A 对训练数据集 D D D 的信息增益 g ( D , A ) g(D,A) g(D,A)
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题,因而就有了信息增益比
信息增益比 特征 A A A 对训练数据集 D D D 的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A) 定义为其信息增益 g ( D , A ) g(D,A) g(D,A) 与训练数据集 D D D 关于特征 A A 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)
其中, H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣, n n n 是特征 A A A 的取值个数
决策树地生成有 ID3 算法以及 C4.5 算法, 这两周算法的区别在于 前者使用 信息增益作为选择特征的准则,后者选择信息增益比
算法:
输入 训练数据集 D D D , 特征集 A A A 阈值 ϵ \epsilon ϵ
输出 决策树 T T T。
决策树生成算法递归地产生决策树,这样往往对训练数据地分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂多,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。剪枝是从已生成的树上裁剪掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。 设树 T T T 的叶结点个数为 ∣ T ∣ |T| ∣T∣, t t t 是树 T T T 的叶结点,该叶结点有 N t N_t Nt 个样本,其中 k k k 类的样本点数有 N t k N_{tk} Ntk 个, k = 1 , 2 , … , K k=1,2,\dotsc,K k=1,2,…,K, H t ( T ) H_t(T) Ht(T) 为叶结点 t t t 上的经验熵, α ≥ 0 \alpha \geq 0 α≥0 为参数,则决策树学习的损失函数可定义为
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|}{N_tH_t(T)+\alpha|T|} Cα(T)=t=1∑∣T∣NtHt(T)+α∣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} Ht(T)=−k∑NtNtklogNtNtk
这时有,公式的前一项表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| ∣T∣ 表示模型的复杂度, 参数 α ≥ 0 \alpha \geq 0 α≥0 控制两者之间的影响。
剪枝就是当 α \alpha α 确定时,选择损失函数最小的模型,即损失函数最小的子树。当 α \alpha α 值确定时,子树越大,往往与训练数据的拟合越好,但模型的复杂度就越高。
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对悬链数据进行更好的拟合,而决策树生成只考虑了通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
剪枝算法:
输入生成算法产生的整个树 T T T ,参数 α \alpha α
输入修剪后的子树 T α T_{\alpha} Tα
分类与回归树(classification and regression tree, CART) 模型是一种广泛的决策树学习方法。
CART 是在给定输入随机变量 X X X 条件下输出随机变量 Y Y Y 的条件概率分布的学习方法。
CART 假设决策树是二叉树,内部结点特征的取值为 “是” 和 “否” ,左分支是 “是”,右分支是 “否”。这样,决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率。
CART 算法由两步组成:
决策树的生成就是递归地构建二叉决策树地过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
最小二乘回归树的生成算法:
输入:训练数据集 D D D
输出:回归树 f ( x ) f(x) f(x)
在训练数据集所爱的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上地输出值,构建二叉决策树
基尼系数: 分类问题中,假设有 K K K 个类,样本点属于第 k k k 类的概率为 p k p_k pk, 则概率分布的基尼指数定义为
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 {\tt Gini}(p)= \sum_{k=1}^K{p_k(1-p_k)}=1-\sum_{k=1}^K{p_k^2} Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于给定的样本集合 D D D, 其基尼指数为
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 {\tt Gini}(D) = 1- \sum_{k=1}^K({\frac{|C_k|}{|D|}})^2 Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
如果像本集合 D D D 根据特征 A A A 是否取某一可能值 a a a 被分割成 D 1 D_1 D1 和 D 2 D_2 D2 两部分,即
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 D1={(x,y)∈D∣A(x)=a},D2=D−D1
则在特征 A A A 的条件下,集合 D D 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 ) {\tt Gini}(D,A) = \frac{|D_1|}{D}{\tt Gini}(D_1) + \frac{|D_2|}{D}{\tt Gini}(D_2) Gini(D,A)=D∣D1∣Gini(D1)+D∣D2∣Gini(D2)
CART 生成分类树算法
输入:训练数据集 D D D,停止计算的条件
输出: CART 决策树
根据训练数据集, 从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
CART 剪枝算法由两步组成:首先从生成算法产生的决策树 T 0 T_0 T0 底端开始不断剪枝,直到 T 0 T_0 T0 的根结点,形成一个子树序列 { T 0 , T 1 , … , T n } \{T_0,T_1, \dotsc,T_n \} {T0,T1,…,Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
CART 剪枝算法如下
输入:CART 算法生成的决策树 T 0 T_0 T0
输出:最优决策树 T α T_{\alpha} Tα