决策树是什么东西?就是我们平常所说的if-else语句嵌套,我们把它组合成树的结构. 决策树中有两种结点,叶子结点和非叶子结点. 其中非叶节点代表的条件,叶子结点表示的实例所属的类别.
我们如何生成这个决策树呢,最主要的一点就是选择那个特征作为当前树的分割结点,这就叫做特征选择,有了特征选择就有了决策树的生成,最后我们还有进行决策树剪枝(后面会提到为什么剪枝).
现在我们有下面一张表的数据,想生成一个决策树模型,预测某个人是否符合贷款条件.

-
每一个叶子节点都对应一条从根节点到叶节点的规则,这表示决策树是if-else规则的集合。
-
如果一个实例到达了某个叶节点,一定表示它满足了从根节点到该叶子节点的所有条件,而后才得到类别,这不就是先满足条件再得到概率嘛,我们一般叫做条件概率分布.

问题来了,为什么我们要选择是否有房子作为第一个构造特征呢?我们构造学习模型,会遵守经验风险最小化或者似然函数极大规则,选择损失函数,我们如何根据风险最小化,选择特征呢?
由3种最优划分属性的方法引出了三种决策树。
ID3&C4.5
数据
给定训练数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}
其中, x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T xi=(xi(1),xi(2),...,xi(n))T特征向量,n是特征的个数, y i ∈ { 1 , 2 , . . . , K } y_i \in \{1,2,...,K\} yi∈{1,2,...,K}表示类别. N是样本个数. 基于这个数据生成决策树模型.
决策树
常见的决策树模型有以下三种(CART决策树既可以做分类也可以做回归):
- ID3: 使用信息增益准则选择特征, 相当于用极大似然法进行概率模型选择: g ( D , A ) = H ( D ) − H ( D ∥ A ) g(D,A)=H(D)-H(D\|A) g(D,A)=H(D)−H(D∥A)
- C4.5: 和ID3算法相似, 只是用信息增益比选择特征: 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)
- CART: 递归构建二叉决策树, 回归树:使用平方误差; 分类树:使用基尼指数: G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2 Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2
其中,
H
A
(
D
)
=
H
(
D
∣
A
)
H_A(D)=H(D|A)
HA(D)=H(D∣A).
于是,我们总结(ID3,C4.5)决策树算法伪代码:
4. 输入:数据集D,特征集合A,阈值e
5. 输出:决策树T
6. 如果D中所有实例输出同一类
C
k
C_k
Ck, 则T作为单节点树,并将类
C
k
C_k
Ck作为该节点的类标记,返回T;
7. 若
A
=
∅
A=\varnothing
A=∅,则T为单节点树,将D中实例数最多的类
C
k
C_k
Ck作为该节点的类标记,返回T;
8. 否则,根据信息增益(ID3)或者信息增益比(C4.5)计算特征A对D的值,选择当前最优的特征
A
g
A_g
Ag;
9. 如果
A
g
A_g
Ag的信息增益小于阈值e,则置T为单节点数,并将D中实例最多的类
C
k
C_k
Ck作为当前的类标记,返回T;
10. 否则,根据
A
g
A_g
Ag中的每一个不同的
a
i
a_i
ai,根据
A
g
=
a
i
A_g=a_i
Ag=ai将D分成若干个非空子集,对于第i个子节点,以
D
i
D_i
Di为数据集,以
A
−
A
g
A-{A_g}
A−Ag为特征集,递归(重复3-6)构造决策树
T
i
T_i
Ti,返回
T
i
T_i
Ti.
11. 对决策树模型T进行剪枝.
剪枝
首先剪枝的目的是为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝和后剪枝。
预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;
后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则该子树替换为叶结点。
CART
分类与回归树(classification and regression tree, CART)与上述决策树的不同,
- 既可以做分类又可以做回归.
- 是二叉树,内部节点特征取值,只有yes和no两个选项
同样地,先进行决策树构造,在基于验证集上进行CART决策树的剪枝,既然是回归和分类树,我们就分别介绍回归和分类两种情况.
- 分类: gini指数
- 回归: 平方误差
定义数据格式:
D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) D={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)} D=(x1,y1),(x2,y2),...,(xN,yN)
其中, x i x_i xi是向量,当回归问题时, y i y_i yi是连续变量; 分类问题时, y i y_i yi是离散变量.
回归树(Regerssion Tree)
算法:
在训练数据上,根据某一个特征将每个区域划分为两个子区域并决定每个子区域的输出值,递归构建二叉树.
- 选择最优切分变量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 ] min_{j,s}[min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i-c_1)^2 + min_{c_2}\sum_{x_i \in R_2(j,s)}(y_i-c_2)^2] minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]
遍历变量j,对固定的切分变量j扫描所有的s,找到使得上式最小的对(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)} \leq 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 c_m=\frac{1}{N_m}\sum_{x_i \in R_m(j,s)}y_i, x \in R_m, m=1,2 cm=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2 - 继续对两个子区域调用1和2,知道满足条件
- 将输入空间划分为M个区域
R
1
,
R
2
,
.
.
.
,
R
m
R_1,R_2,...,R_m
R1,R2,...,Rm,生成决策树:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^{M}c_mI(x \in R_m) f(x)=m=1∑McmI(x∈Rm)
分类树(classification tree)
基尼指数计算公式如下:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
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,得到:
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(D)=1-\sum_{k=1}^{K}p_k^2
Gini(D)=1−k=1∑Kpk2
其中,
C
k
C_k
Ck是D中所属第k类的样本子集,K是类的个数.
如果样本集合D根据特征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的条件下,集合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的不确定性,基尼指数(Gini(D,A))表示根据调教A=a后的集合D的不确定性,基尼指数越大,表示数据D的不确定性越大.
算法:
输入:训练数据D,停止计算的条件
输出:CART决策树
- 计算所有特征A的每一个值a对应的条件基尼指数的值,选择最优的划分得到 D 1 D_1 D1和 D 2 D_2 D2.
- 递归对两个数据集 D 1 D_1 D1和 D 2 D_2 D2继续调用1,知道满足条件.
- 生成CART树的分类树.
- 预测的时候,根据决策树,x落到的叶子节点对应的类别表示这个预测x的类别.