参考:《统计学习方法(第二版)》.李航
http://cs229.stanford.edu/syllabus-autumn2018.html
https://www.jianshu.com/p/c343594572bc
构建树
我们想知道在哪些地方可以愉快的滑雪。经过调查我们发现一下规律:
横坐标是时间以月份划分,纵坐标是纬度范围为-90—90。图中绿色+号表示可以滑雪,红色圆圈为不可以滑雪。如果我们想用线性划分可以滑雪和不可以滑雪,显然是不可能的。虽然我们可以采用SVM中的核方法构建非线性划分。但是我们可不可以通过对数据中的特征选择,直接选择最终的结果。
接下我们就要构建决策树(Decision Trees)。首先以数据特征中一种设置区分阈值,选着分界线(Split)。比如首先以纬度L是否大于30将数据集划分两个。然后在两个字迹中再分别选择特征阈值,继续划分一分为二。直到每个独立的子集中只含有一种目标类别即可以滑雪或者不可以滑雪。这样我们就构建完成了一个决策树。
决策树通过贪婪、自顶向下、递归划分生成近似解。该方法是自顶向下的,因为我们从原始输入空间开始,通过对单个特征设置阈值,将它分成两个子区域。然后我们取其中一个子区域,通过一个新的阈值进行划分。我们继续以递归方式训练我们的模型,总是选择叶节点、特征和阈值来形成新的分割。形式上,给定一个父区域Rp、一个特征索引j和一个阈值t ∈ R,我们得到两个子区域R1和R2如下:
R
1
=
X
∣
X
j
<
t
,
X
∈
R
p
R_1={X|X_j<t,X\in R_p}
R1=X∣Xj<t,X∈Rp
R
2
=
X
∣
X
j
≥
t
,
X
∈
R
p
R_2={X|X_j\ge t,X\in R_p}
R2=X∣Xj≥t,X∈Rp
熵
但是我们应该如何选着特征作为划分标准呢?
在这前我想先说一下熵。熵值表示数据的不确定程度。我们都知道如果一件事发生的概率越大那么它的不确定程度越小即熵值越小。所以我们可以通过以下公式表示:
熵
=
−
∑
i
=
1
n
p
i
l
o
g
p
i
熵=-\sum\nolimits_{i=1}^np_ilogp_i
熵=−∑i=1npilogpi
其中pi为事件概率。
对于一个集合内部的混乱程度很大,说明熵值很大。
条件熵
条件熵H(Y|X)表示在已知随机变量X条件下随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵H(Y|X)定义为X给定条件下Y的条件概率分布的熵对X的数学期望: H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum\nolimits_{i=1}^np_iH(Y|X=x_i) H(Y∣X)=∑i=1npiH(Y∣X=xi)
确定根节点
构造树的基本想法是随着树的深度的增加,节点的熵迅速降低。熵降低的速度越快越好,这样我们有望得到一棵高度最矮的决策树。为什么说要得到最矮的决策树,是因为决策树越高,那么树对应的决策越有针对性,越容易产生过拟合。
信息增益
信息增益表示得知某一特征后判定某一类别的信息不确定性减少的程度。
定义为:特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验熵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)
根据信息增益准则的特征选择方法是:对训练集D,计算每个特征的信息增益,选择信息增益最大的特征。
信息增益比
以信息增益作为划分训练数据集的依据,存在偏向于选着取值较多的特征的问题,所以使用信息增益比。定义为,特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比。即 g R ( D , A ) = g ( D , A ) / H A ( D ) , H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ g_R(D,A)=g(D,A)/H_A(D),H_A(D)=-\sum\nolimits_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} gR(D,A)=g(D,A)/HA(D),HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣
决策树的生成
ID3算法
输入:训练数据集D,特征集A以及阈值
ε
\varepsilon
ε
输出:决策树T
(1)若D中只含有一类数据C,则树为单节点树,将类C作为该节点,返回T。
(2)若特征集A为空,则树为单节点树,将数据中类数量最多的类C作为该节点的类标记,返回T。
(3)1,2不满足,则计算特征对D的信息增益,得到最大信息增益
A
g
A_g
Ag。
(4)如果最大信息增益
A
g
A_g
Ag小于阈值
ε
\varepsilon
ε,则为单节点树,将数据中类数量最多的类C作为该节点的类标记,返回T。
(5)4不满足,对
A
g
A_g
Ag的每一种取值ai将D划分为若干个非空子集
D
i
D_i
Di,将
D
i
D_i
Di中的类数量最多的类作为标记,构建子结点,由子结点和根节点构成树T,返回T。
(6)对第i个子结点,以
D
i
D_i
Di为训练集,以A-{Ag}为特征集递归调用(1)-(5),得到子树Ti,返回T。
C4.5算法
C4.5算法与ID3算法类似,只不过在树生成过程中使用信息增益比来选择特征。
输入:训练数据集D,特征集A以及阈值
ε
\varepsilon
ε
输出:决策树T
(1)若D中只含有一类数据C,则树为单节点树,将类C作为该节点,返回T。
(2)若特征集A为空,则树为单节点树,将数据中类数量最多的类C作为该节点的类标记,返回T。
(3)1,2不满足,则计算特征对D的信息增益比,得到最大信息增益比
A
g
A_g
Ag。
(4)如果最大信息增益比
A
g
A_g
Ag小于阈值
ε
\varepsilon
ε,则为单节点树,将数据中类数量最多的类C作为该节点的类标记,返回T。
(5)4不满足,对
A
g
A_g
Ag的每一种取值ai将D划分为若干个非空子集
D
i
D_i
Di,将
D
i
D_i
Di中的类数量最多的类作为标记,构建子结点,由子结点和根节点构成树T,返回T。
(6)对第i个子结点,以
D
i
D_i
Di为训练集,以A-{Ag}为特征集递归调用(1)-(5),得到子树Ti,返回T。
剪枝
由上述两种算法生成的决策树,往往对训练集数据能够很好的分类,因此这样会产生很大的方差,会导致过拟合现象的发生。解决这个问题是考虑决策树的复杂度,对已生成的决策树进行剪枝。在决策树学习过程中对决策树进行化简的过程被称为剪枝。
决策树的剪枝往往是通过极小化决策树的损失函数和代价函数来实现的。
决策树的损失函数可以定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_\alpha(T)=\sum\nolimits_{t=1}^{|T|}N_tH_t(T)+\alpha|T|
Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣
其中|T|为决策树中叶结点个数,Nt为每个叶节点中的数据量,t是决策树的叶结点,
H
t
(
T
)
H_t(T)
Ht(T)叶节点上的经验熵。
α
\alpha
α为参数大于等于0.
H
t
(
T
)
=
−
∑
N
t
k
N
t
l
o
g
2
N
t
k
N
t
H_t(T) =-\sum\nolimits\frac{N_{tk}}{N_t}log_2\frac{N_{tk}}{N_t}
Ht(T)=−∑NtNtklog2NtNtk,这里
N
t
k
N_{tk}
Ntk为叶结点中k类的数据量,k=1,2,…,K。
若将
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
\sum\nolimits_{t=1}^{|T|}N_tH_t(T)
∑t=1∣T∣NtHt(T)用C(T)代替可得:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_\alpha(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
其中C(T)表示训练数据的预测误差,|T|表示模型复杂度,
α
\alpha
α控制两者的影响。
其实利用最小化损失函数就是正则化的极大似然估计。
树的剪枝算法:
输入:由决策树生成算法生成的树T,参数
α
\alpha
α
输出:修建后的子树
T
α
T_{\alpha}
Tα
(1)计算每个结点的经验熵。
(2)递归的由树的叶节点向上回缩。若一组叶节点回缩到父结点之前和之后的树分别为
T
B
T_B
TB和
T
A
T_A
TA,其对应的损失函数分别为
C
α
(
T
B
)
,
C
α
(
T
A
)
C_\alpha(T_B),C_\alpha(T_A)
Cα(TB),Cα(TA),如果
C
α
(
T
A
)
≤
C
α
(
T
B
)
C_\alpha(T_A)\le C_\alpha(T_B)
Cα(TA)≤Cα(TB),则进行修剪,将父结点变为新的叶结点。
(3)返回(2),直到不能继续为止,返回损失函数最小化的子树
T
α
T_{\alpha}
Tα.
CART算法
分类与回归树(classification and regression tree),CART同样由特征选择、树的生成和树的剪枝组成。CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。
决策树的生成就是二叉树的构建过程。对回归树用最小二乘准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
CART算法生成回归树
由CART算法生成的回归树一般被称为最小二乘回归树,算法如下:
输入:训练数据集D
输出:回归树f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域的输出值,构建二叉树。
(1)选择最优切分变量j与切分点s,求解
遍历变量j,对固定的切分变量j扫描切分点s,选择使上式达到误差最小的变量(j,s),其中R1和R2表示的是划分之后的空间。
(2)用选定的(j,s)划分区域并决定响应的输出值。
(3)继续对两个子区域调用步骤(1),(2),直到满足停止条件。
(4)将输入空间划分为M个区域R1,R2,R3…RM,生成决策树:
分类树的生成
分类树是用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼指数
分类问题中,假设有K个类,样本点属于第K类的概率为pk,则概率分布的基尼指数定义为
对于给定的样本集合D,其基尼指数为
其中,Ck是D中属于第k类的样本子集,K是类的个数。|Ck|和D分别表示子集的个数和样本的个数。
如果样本集合D根据特征A是否取某一可能的值α被分割成D1和D2,即
所以在特征A的条件下集合D的基尼指数为
其中基尼指数Gini(D)表示集合的不确定性,基尼指数G(D,A)表示A=a分解后集合的不决定性。基尼指数越大,样本集合的不确定性越大。
分类树生成算法:
输入:训练数据集D,停止计算的条件
输出:CART决策树
具体步骤:
(1)计算现有特征对该数据集的基尼指数,对于每一个特征A,可以对样本点A是否为a可以将数据集D分成数据集D1,D2。
(2)对于所有的特征A和所有可能的切分点a,选择基尼指数最小的特征以及相对应的切分点作为最优特征和最佳切分点。
(3)对最优子树递归调用(1)(2),直到满足停止条件。
(4)生成CART分类树。
剪枝处理
剪枝是决策树学习算法中对付过拟合的主要手段。主要是从已生成的书中剪掉一些子树或者叶子节点,并将根节点或者父节点作为新的叶子节点,从而简化分类树模型。决策树的剪枝往往是通过极小化决策树的整体损失函数或者代价函数。设树T的叶子节点数为|T|,叶子节点t上有Nt个样本点,其中k类的样本点数为Nkt,Ht(T)为结点t上的经验熵,α>=0为参数,所以损失函数定义为:
C(T) 表示对训练数据的预测误差,|T|表示模型的复杂度。损失函数其实正好表达了两者的平衡。
以t为根结点的子树
T
t
T_{t}
Tt 的损失函数是:
当
α
=
0
\alpha = 0
α=0及
α
\alpha
α充分小时,有不等式:
当
α
\alpha
α增大时,在某一
α
\alpha
α有:
即t与
T
t
T_{t}
Tt有相同的损失函数值,而的t结点少,因此对t进行剪枝。
在剪枝得到的子树序列
T
0
,
T
1
,
.
.
.
,
T
n
T_0, T_1, ... , T_n
T0,T1,...,Tn中通过交叉验证选取最优子树
具体地,利用独立的验证数据集,测试子树序列
T
0
,
T
1
,
.
.
.
,
T
n
T_0, T_1, ... , T_n
T0,T1,...,Tn 中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树 都对应一个参数
α
1
,
α
2
,
.
.
.
,
α
n
\alpha_1, \alpha_2, ... , \alpha_n
α1,α2,...,αn。所以,当最优子树
T
k
T_k
Tk确定时,对应的
α
k
\alpha_k
αk也确定了,即得到最优决策树
T
α
T_{\alpha}
Tα。
输入:CART决策树
输出:最优决策树
(1)设k=0,T=T0
(2)设
α
=
+
∞
\alpha = +\infty
α=+∞
(3)自下而上地对各内部结点计算
C
(
T
t
)
,
∣
T
t
∣
C(T_t),|T_t|
C(Tt),∣Tt∣,以及
其中,
T
t
T_t
Tt表示以t为根结点的子树,
C
(
T
t
)
C(T_t)
C(Tt)是对训练数据的预测误差,
∣
T
t
∣
|T_t|
∣Tt∣是
T
t
T_t
Tt的叶结点个数。
(4)自下而上地访问内部结点t,如果有
g
(
t
)
=
α
g(t)=\alpha
g(t)=α,则进行剪枝,并对叶结点 t 以多数表决法决定其类别,得到树T。
(5)设
k
=
k
+
1
,
α
k
=
α
,
T
k
=
T
k=k+1, \alpha_{k}=\alpha, T_{k}=T
k=k+1,αk=α,Tk=T。
(6)如果
T
k
T_k
Tk不是由根结点及两个叶结点构成的树,则回到步骤2,否则
T
k
=
T
n
T_k = T_n
Tk=Tn。
(7)采用交叉验证法在子树序列
T
0
,
T
1
,
⋯
,
T
n
T_{0},T_{1},\cdots,T_{n}
T0,T1,⋯,Tn中选取最优子树
T
α
T_{\alpha}
Tα。