目录
1.简介
决策树是一种基本的分类与回归方法,是一种描述对实例分类的树形结构。决策树还表示给定特征条件下类的条件概率分布(这已条件概率分布定义在结构空间的一个划分上)。
2.决策树的分类
2.1 ID3算法
2.1.1 特征选择(信息增益)
ID3算法采用信息增益进行特征选择
- 信息熵
随机变量X的信息熵定义如如下:
H ( X ) = H ( p ) = − ∑ i = 1 n p i log p i H(X) = H(p) = - \sum \limits_{i=1}^n p_i \log p_i H(X)=H(p)=−i=1∑npilogpi - 条件熵
H ( Y ∣ X ) = − ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X) = - \sum \limits_{i=1}^n p_i H(Y|X=x_i) H(Y∣X)=−i=1∑npiH(Y∣X=xi)
设训练集为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的个数。则信息增益计算如下:
- 经验熵
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D) = - \sum \limits_{k=1}^K \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣ - 经验条件熵
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 ∣ log 2 ∣ D i k ∣ ∣ D i ∣ H(D|A) = \sum \limits_{i=1}^n \frac{|D_i|}{|D|} H(D_i) = - \sum \limits_{i=1}^n \frac{|D_i|}{|D|} \sum \limits_{k=1}^K \frac{|D_{ik}|}{|D_i|} \log_2 \frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣ - 信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A) = H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
2.1.2 算法步骤
输入:训练数据集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
2.2 C4.5算法
2.2.1 特征选择(信息增益比)
与ID3算法唯一不同就是特征选择采用信息增益比
- 信息增益比
信息增益比定义为信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集D关于特征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 \limits_{i=1}^n \frac{|D_i|}{|D|} \log_2 \frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
2.2.2 算法步骤
算法步骤与ID3一致,只不过特征选择计算的是信息增益比
2.3 CART算法
与ID3和C4.5不同,CART假设决策树是一颗二叉树
2.3.1 分类树
2.3.1.1 特征选择(基尼指数)
假设有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)
2.3.1.2 算法步骤
输入:训练数据集D,停止计算的条件
输出:CART决策树
(1) 设节点的训练集为D,计算现有特征对该数据集的基尼指数。此时,对于每一个特征A,对其可能取的每个a,根据样本点对A=a的测试为“是”或“否”将D分割为D1和D2两部分。然后计算A=a时的基尼指数;
(2)在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点a作为最优特征和最优切分点。依最优特征和最优切分点从现节点生成两个子节点,将训练集依特征分配到两个子节点中。(3)递归调用1-2步,直到满足停止条件
2.3.2 回归树
2.3.2.1 特征选择(平方误差)
设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的均值。
- 空间划分方法
选择第j个变量 x ( j ) x^{(j)} x(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}
然后寻找最优切分变量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 ] \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]
2.3.2.2 算法步骤
输入:训练数据集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,直到满足停止条件
3.决策树的剪枝
3.1预剪枝
其中的核心思想是,在每一次实际对结点进行进一步划分之前,先采用某一种指标来判断划分是否能提高增益,如验证集的数据的准确性、信息增益是否大于最低标准、样本个数是否小于最低标准等,如果是,就把结点标记为叶结点并退出进一步划分,否则就继续递归生成结点。
3.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中选择最优子树