决策树是一种基本的分类与回归方法,是一种描述对实例分类的树形结构。决策树还表示给定特征条件下类的条件概率分布(这已条件概率分布定义在结构空间的一个划分上)。
ID3算法采用信息增益进行特征选择
设训练集为D, ∣ D ∣ |D| ∣D∣为样本容量,设有K个类 C k C_k Ck, ∣ C k ∣ |C_k| ∣Ck∣为类 C k C_k Ck的个数(即 ∑ k = 1 K ∣ C k ∣ = ∣ D ∣ \sum \limits_{k=1}^K |C_k|=|D| k=1∑K∣Ck∣=∣D∣),设特征A有n个不同的取值 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} {a1,a2,...,an},根据A的取值将D划分为n个子集 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn,
∣ D i ∣ |D_i| ∣Di∣为 D i D_i Di的样本个数(即 ∑ i = 1 n ∣ D i ∣ = ∣ D ∣ \sum \limits_{i=1}^n |D_i|=|D| i=1∑n∣Di∣=∣D∣),子集 D i D_i Di中属于类 C k C_k Ck的样本集合为 D i k D_{ik} Dik, ∣ D i k ∣ |D_{ik}| ∣Dik∣为 D i k D_{ik} Dik的个数。则信息增益计算如下:
输入:训练数据集D,特征值A,阈值 ε \varepsilon ε
输出:决策树T
(1) 若D中所有实例属于同一类 C k C_k Ck,则T为单节点树,并将类 C k C_k Ck作为该节点的类标记,返回T;
(2) 若A为空集,即当前D不包含任何特征,将D中实例数最大的类 C k C_k Ck作为该节点的标记,返回T;
(3)否则,计算A中各特征对于D的信息增益,选择信息增益最大的特征 A g A_g Ag:
- 若 A g A_g Ag的信息增益小于阈值 ε \varepsilon ε,设置T为单节点数,并将D中实例数最大的类 C k C_k Ck作为该节点的标记,返回T。
- 否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai将D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子节点,有节点及其子节点构成T,返回T;
(4)对第i个子节点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A−{Ag}为特征集,递归调用1-3步,得到子树Ti,返回Ti
与ID3算法唯一不同就是特征选择采用信息增益比
算法步骤与ID3一致,只不过特征选择计算的是信息增益比
与ID3和C4.5不同,CART假设决策树是一颗二叉树
假设有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 Gini(p) = \sum \limits_{k=1}^K p_k(1-p_k) = 1-\sum \limits_{k=1}^K p_k^2 Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,基尼指数为
G i n i ( p ) = 2 p ( 1 − p ) Gini(p) = 2p(1-p) Gini(p)=2p(1−p)
对于给定样本集合D,基尼指数为
G i n i ( p ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(p) = 1-\sum \limits_{k=1}^K (\frac{|C_k|}{|D|})^2 Gini(p)=1−k=1∑K(∣D∣∣Ck∣)2
如果样本集合D根据特征A是否取某一可能值a被分割为D1和D2两部分,则在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 ) Gini(D,A) = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2) Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
输入:训练数据集D,停止计算的条件
输出:CART决策树
(1) 设节点的训练集为D,计算现有特征对该数据集的基尼指数。此时,对于每一个特征A,对其可能取的每个a,根据样本点对A=a的测试为“是”或“否”将D分割为D1和D2两部分。然后计算A=a时的基尼指数;
(2)在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点a作为最优特征和最优切分点。依最优特征和最优切分点从现节点生成两个子节点,将训练集依特征分配到两个子节点中。(3)递归调用1-2步,直到满足停止条件
设X和Y分别为输入和输出变量,且Y时连续变量,训练集为D。一颗回归树对应输入空间的一个划分以及在划分单元上的输出值。
假设已将输入空间划分为M个单元R1,…Rm,并且在每个单元上有一个固定的输出 c m c_m cm,则回归树模型表示为
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x) = \sum \limits_{m=1}^M c_mI(x \in R_m) f(x)=m=1∑McmI(x∈Rm)
当输入空间划分确定,可以用平方误差来表示回归树对训练数据的预测误差。采用评分误差最小的准则求解每个单元上的最优输出值。单元Rm上的 c m c_m cm的最优值 c ^ m \widehat{c}_m c m是Rm上所有输入实例xi对应的输出yi的均值。
输入:训练数据集D,停止计算的条件
输出:回归树f(x)
(1)选择最优切分变量j和切分点s,求解:
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 ] \underset{j,s}{{min} } [\underset{c_1}{{min} } \sum \limits_{x_i \in R_1(j,s)} (y_i-c_1)^2 + \underset{c_2}{{min} } \sum \limits_{x_i \in R_2(j,s)} (y_i-c_2)^2] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]
遍历变量j,对固定的切分变量j扫描切分点s,选择使得上方式子最小的对(j,s)
(2)选定的对(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)} <= s\} 和R_2(j,s)=\{x|x^{(j)} > s\} R1(j,s)={x∣x(j)<=s}和R2(j,s)={x∣x(j)>s}
c ^ m = 1 N m ∑ x i ∈ R m ( j , s ) y i , x ∈ R m , m = 1 , 2 \widehat{c}_m = \frac{1}{N_m} \sum \limits_{x_i \in R_m(j,s)} y_i,x \in R_m, m=1,2 c m=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2
(3)递归调用1-2,直到满足停止条件
其中的核心思想是,在每一次实际对结点进行进一步划分之前,先采用某一种指标来判断划分是否能提高增益,如验证集的数据的准确性、信息增益是否大于最低标准、样本个数是否小于最低标准等,如果是,就把结点标记为叶结点并退出进一步划分,否则就继续递归生成结点。
后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升(如验证集的准确率),则将该子树替换为叶结点。
具体地:
对于ID3和C4.5
可以使用如下损失函数来判断是否剪枝:
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ , H t ( T ) = ∑ k N t k N t log N t k N t C_α(T)= \sum\limits_{t=1}^{|T|}N_tH_t(T)+α|T|, H_t(T)= \sum\limits_{k}\frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t} Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣,Ht(T)=k∑NtNtklogNtNtk
其中|T|为叶结点数量,α控制经验风险与结构风险所占比例,越小树越复杂,过拟合风险越大。若将非叶子结点替换为叶子结点后损失函数降低,则将该子树替换为叶结点。
对于CART
剪枝步骤如下:
输入:CART算法生成的决策树T0
输出:最优决策树Tα
(1)设k=0,T=T0
(2)设α为+∞
(3)自下而上地对各内部节点t计算 C ( T t ) C(T_t) C(Tt), ∣ T t ∣ |T_t| ∣Tt∣以及:
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 , α = m i n ( α , g ( t ) ) g(t)=\frac{C(t)-C(T_t)}{|T_t|-1},α=min(α,g(t)) g(t)=∣Tt∣−1C(t)−C(Tt),α=min(α,g(t))
上述 ∣ T t ∣ |T_t| ∣Tt∣表示t为根节点的子树,C(T_t)是对训练数据的预测误差(如基尼指数), ∣ T t ∣ |T_t| ∣Tt∣是 T t T_t Tt的叶节点个数
(4)对g(t)=α的内部节点t进行剪枝,并对叶节点t以多数表决法确定其类别,得到T
(5)设k=k+1,αk=α,Tk=T
(6)如果Tk不是由根节点以及两个叶节点构成的树,返回步骤2,否则令Tk=Tn
(7)采用交叉验证法在子树T0,…Tn中选择最优子树