机器学习之决策树
目录
永远要记得,成功的决心远胜于任何东西。
什么是决策树?
- 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
- 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
- 分类树(决策树)是一种十分常用的分类方法。他是一种监管学习,所谓监管学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。
- 决策树路径或其对应的if-then规则集合具有一个重要的性质,互斥并且完备,也就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或者一条规则覆盖。
- 决策树将特征空间划分为互不相交的单元,并在每个单元定义一个类的概率分布。决策树的一条路径对应于划分中的一个单元,决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成,即P(Y|X),叶结点(单元)上的条件概率往往偏向某一类。
决策树的思想!
在对训练数据集分类时,究竟选择哪个特征更好?这就要求确定选择特征的准则。直观上如果一个特征具有更好的分类能力,或者说,按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就选择这个特征。
- 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。
- 其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
- 使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
信息增益
信息增益是什么?
-
在信息论与概率统计中,熵表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为: P ( X = x i ) = p i , i = 1 , 2 , ⋯ , n P(X=x_i) = p_i, i=1,2,\cdots,n P(X=xi)=pi,i=1,2,⋯,n则随机变量X的熵定义为 H ( x ) = − ∑ i = 1 n p i log 2 p i H(x)= - \sum_{i=1}^n p_i \log_2 p_i H(x)=−i=1∑npilog2pi若 p i = 0 % p_i=0 pi=0,则定义 0 l o g 2 0 = 0 % 0log_20=0 0log20=0。熵越大,随机变量的不确定性就越大。
-
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。定义为X给定条件下Y的条件概率分布的熵对X的数学期望 : H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)= \sum_{i=1}^np_iH(Y|X=x_i) H(Y∣X)=i=1∑npiH(Y∣X=xi)信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
-
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即 g ( D , A ) = H ( D ) − H ( D ∣ A ) H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ 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 ∣ g(D,A) = H(D) - H(D|A) \\ H(D) = - \sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 {\frac{|C_k|}{|D|}} \\ H(D \ | \ A) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} H(D_i) = - \sum_{i=1}^{n} \frac{|D_i|}{|D|} \sum_{k=1}^{K} \frac{|D_{ik}|}{|D_i|} \log_2 {\frac{|D_{ik}|}{|D_i|}} g(D,A)=H(D)−H(D∣A)H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣H(D ∣ A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
其中, ∣ C k ∣ % |C_k| ∣Ck∣为类 ∣ C k ∣ % |C_k| ∣Ck∣的样本个数, ∣ D ∣ % |D| ∣D∣表示样本容量。
特征A有n个不同的取值 a 1 , a 2 , . . . , a n % {a_1,a_2,...,a_n} a1,a2,...,an,根据取值将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∣的样本个数。 D i k = D i ∩ C k % D_{ik}=D_i∩C_k Dik=Di∩Ck。 -
决策树学习应用信息增益准则选择特征。给定训练数据集D和特征A,经验熵H(D)表示对数据集D进行分类的不确定性。而经验条件熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。那么他们的差,即信息增益,就表示由于特征A而使得对数据集D的分类的不确定性减少的程度。信息增益大的特征具有更强的分类能力。
信息增益算法:
- 输入:训练数据集D和特征A
输出:特征A对训练数据集D的信息增益g(D,A)-
(1) 计算数据集D的经验熵H(D) H ( D ) = − ∑ i = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D)= - \sum_{i=1}^K \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} H(D)=−i=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣ ∣ D ∣ % |D| ∣D∣表示数据集的大小, ∣ C k ∣ % |C_k| ∣Ck∣表示第k类数据的大小
-
(2) 计算特征A对数据集D的经验条件熵H(D|A) H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) H(D|A) = \sum_{i=1}^n \frac {|D_i|}{|D|} H(D_i) H(D∣A)=i=1∑n∣D∣∣Di∣H(Di) ∣ D i ∣ % |D_i| ∣Di∣表示 特征A取第i个值的数据的大小
-
(3) 计算信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)= H(D) - H(D|A) g(D,A)=H(D)−H(D∣A)
-
信息增益比是什么?
信息增益值的大小是相对训练数据集而验的,并且没有绝对意义。如果如果某个特征所有的取值都不相同(ID),那么根据这个特征对数据集划分使得条件熵为0,但是这个特征并不是最优特征。为消除这种影响引入了特征的内部信息
以信息增益作为划分训练数据集的特征,存在偏向于选择值较多的特征的问题,使用信息增益比可以对这一问题进行校正,这是特征选择的另一准则
i n f o ( D , A ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ∣ D i ∣ ∣ D ∣ info(D,A)= - \sum_{i=1}^n \frac{|D_i|}{|D|} \log \frac{|D_i|}{|D|} info(D,A)=−i=1∑n∣D∣∣Di∣log∣D∣∣Di∣很明显,A的取值越多,内部信息越大,加入这个惩罚项可以得出信息增益比的公式 g r ( D , A ) = g ( D , A ) i n f o ( D , A ) g_r(D,A) = \frac {g(D,A)}{info(D,A)} gr(D,A)=info(D,A)g(D,A)
特征的选择
首先要考虑哪个变量是树根,哪个是树节点,为此,我们需要考虑变量的重要性。
- ID3算法 :使用信息增益(作为不纯度)
- C4.5算法 :使用信息增益率(作为不纯度)
- CART 算法:使用基尼系数(作为不纯度)
不同的方法形成不同的决策树,决策树方法会把每个特征都试一遍,最后选取能够使分类分的最好的特征(e.g. 将A属性作为父节点,产生的纯度增益(GainA)要大于B属性作为父节点,则A作为优先选取的属性)。
决策树的构建原理?
- 1.开始构建根节点,将所有训练数据存放在根节点。选择一个最优的特征,按照这一特征将训练数据集分割成子集,是的各个子集有一个在当前条件下最好的分类。
- 2.如果这些子集已经能够被基本的正确分类,那么构建页节点,并将这些子集分类到对应的叶节点中去。
- 3.如果还有子集不能被基本的正确分类,那么就对这这些子集选择新的最有特征,继续对其进行分割,构建相应的节点
- 4.如此递归的进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。
最后每个子集都被分配到也节点上,既都有了明确的分类。这就生成的一颗决策树。
ID3算法
- 核心思想:是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
- 从根结点出发,选择信息增益最大的特征作为结点特征,由该特征的不同取值建立子结点,对子结点递归调用以上方法。直到所有特征的信息增益均很小(设一个阈值ε)或没有特征可选为止。
- 算法的基本思想:
- 初始化属性集合和数据集合
- 计算数据集合信息熵S和所有属性的信息熵,选择信息增益最大的属性作为当前决策节点
- 更新数据集合和属性集合(删除掉上一步中使用的属性,并按照属性值来划分不同分支的数据集合)
- 依次对每种取值情况下的子集重复第二步
- 若子集只包含单一属性,则为分支为叶子节点,根据其属性值标记
- 完成所有属性集合的划分
信息增益有一个问题:对可取值数目较多的属性有所偏好,例如:考虑将“编号”作为一个属性。为了解决这个问题,引出了另一个 算法C4.5。
C4.5算法
- 对ID3算法进行了改进,生成过程中用信息增益比来选择特征,克服了用信息增益选择属性偏向选择多值属性的不足
- 在构造树的过程中进行剪枝
- 对连续属性进行离散化,也就是说能处理连续属性。
- 能够对不完整的数据进行处理
CART算法
- CART算法使用基尼系数来选择划分属性。一个数据集的纯度可以用基尼系数来度量
- CART:分类与回归树,是应用广泛的决策树学习方法,既可用于分类,也可用于回归。
- CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”(1和0),左分支是取值为“是(1)”的分支,右分支是取值为“否”(0)的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。
决策树的生成
递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。
- 回归树的生成:假设已将输入空间划分为M个单元
R
1
,
R
2
,
.
.
.
,
R
M
% R_1,R_2,...,R_M
R1,R2,...,RM,并且在每个单元
R
M
% R_M
RM有一个固定的输出值
c
m
% c_m
cm,于是回归树模型可表示为:
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x) = \sum_{m=1}^{M} c_m I(x \in R_m)
f(x)=m=1∑McmI(x∈Rm)可以用平方误差
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
% \sum_{x_i \in R_m} (y_i - f(x_i))^2
∑xi∈Rm(yi−f(xi))2来表示训练误差,用最小化平方误差来求解。而单元
R
m
% R_m
Rm上的
c
m
% c_m
cm的最优值
c
^
m
% \hat c^m
c^m是
R
m
% R_m
Rm上所有输入实例
x
i
% x_i
xi对应的输出yi的均值,即:
c
^
m
=
a
v
e
(
y
i
∣
x
i
∈
R
m
)
\hat{c}_m = ave(y_i \ | \ x_i \in R_m)
c^m=ave(yi ∣ xi∈Rm)
这里采用启发式的方法对输入空间进行划分,选择 j % j j个变量 x ( j ) % x^{(j)} x(j)和它的取值 s % s s,作为切分变量和切分点,并定义两个区域 R 1 ( j , s ) = { x ∣ x ( j ) ⩽ s } , R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j, s) = \{x \ | \ x^{(j)} \leqslant s\}, \ R_2(j, s) = \{x \ | \ x^{(j)} \gt s\} R1(j,s)={x ∣ x(j)⩽s}, R2(j,s)={x ∣ x(j)>s}然后寻找最优切分变量 j % j j和最优切分点 s % s s,具体地,求解: min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] c ^ 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) , c ^ 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) \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] \\ \hat{c}_1 = ave( y_i \ | \ x_i \in R_1(j, s)), \ \hat{c}_2 = ave( y_i \ | \ x_i \in R_2(j, s)) j,smin [c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]c^1=ave(yi ∣ xi∈R1(j,s)), c^2=ave(yi ∣ xi∈R2(j,s))对固定输入变量 j % j j可以找到最优切分点 s % s s,遍历所有输入变量,找到最优的切分变量 j % j j,构成一个对 ( j , s ) % (j,s) (j,s)。依次将输入空间划分为两个区域。
对每个区域重复上述划分过程,直到满足停止条件位置,这样的回归树通常称为最小二乘回归树。 - 分类树的生成:分类问题中,假设有
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
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对于二分类:
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p) = 2p(1-p)
Gini(p)=2p(1−p)对于给定样本集合
D
% D
D,其基尼指数为:
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
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)∈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
)
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)Gini值越大,样本集合的不确定性也越大(与熵类似),因此每次选择Gini小的特征来划分。
算法停止条件:结点中的样本个数小于预定阈值,或,样本集的基尼指数小于预定阈值(样本基本属于同一类),或没有更多特征。上图显示了二分类问题中,Gini,半熵和分类误差率的关系,可以看到Gini和半熵很接近,都可近似表示分类误差率。
决策树的减枝
构建决策树是过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,导致对未知的测试数据的分类没有那么准确,因此需要对决策树进行简化。
决策树的剪枝基本策略有 预剪枝 (Pre-Pruning) 和 后剪枝 (Post-Pruning)。
- 预剪枝:其中的核心思想就是,在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分;如果可以就继续递归生成节点。
- 后剪枝:后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。
决策树的损失函数:
C
a
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
a
∣
T
∣
C_a(T) = \sum_{t=1}^{|T|} N_tH_t(T) +a|T|
Ca(T)=t=1∑∣T∣NtHt(T)+a∣T∣t为树T的叶结点,该结点有
N
t
% N_t
Nt个样本点,
H
t
(
T
)
% H_t(T)
Ht(T)为叶结点t的经验熵。
∣
T
∣
% |T|
∣T∣为树
T
% T
T叶结点的数量。
∣
T
∣
% |T|
∣T∣可以表示树的复杂度
当a=0时不考虑树的复杂度s
当a 无穷大时不考虑与训练数据的拟合度
剪枝算法:
输入:树T,参数a
输出:修建后的树
T
a
% T_a
Ta
- (1)计算每个节点的经验熵
- (2)递归的从树的叶结点向上回缩
- (3)如果回缩后的损失函数减小,则进行剪枝,将父节点变为新的叶结点。
- (4)返回(2),直到不能继续为止,得到损失函数最小的树 T a % T_a Ta
离散化处理
将连续型的属性变量进行离散化处理形成决策树的训练集:
- 将需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序
- 假设该属性对应不同的属性值共N个,那么总共有N-1个可能的候选分割值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点
- 用信息增益选择最佳划分
不完整数据处理
- 处理缺少属性值的一种策略是赋给该节点所有对应训练实例中该属性最常见的值,另一种复杂的情况是为该节点每个可能出现的值赋予一个概率
树形结构为什么不需要归一化?
- 因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。 按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。而且,树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。
- 既然树形结构(如决策树、RF)不需要归一化,那为何非树形结构比如Adaboost、SVM、LR、Knn、KMeans之类则需要归一化。
对于线性模型,特征值差别很大时,运用梯度下降的时候,损失等高线是椭圆形,需要进行多次迭代才能到达最优点。 但是如果进行了归一化,那么等高线就是圆形的,促使SGD往原点迭代,从而导致需要的迭代次数较少。