决策树
性别分类器
信息熵与基尼系数
在搭建决策树时,如何衡量随机变量的不确定是至关重要的。换句话说,我们的调优完全是基于选择什么作为最优特征指标进行调整,而熵和基尼指数都是最优特征指标。
信息熵的定义及相关证明
在信息论与概率统计中,熵是最基础的概念,其表示随机变量不确定的度量。设
X
X
X 是一个取有限个值的离散随机变量,其概率分布为:
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
…
,
n
P\left(X=x_{i}\right)=p_{i}, i=1,2, \ldots, n
P(X=xi)=pi,i=1,2,…,n
则随机变量
X
X
X 的熵定义为:
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(X)=-\sum_{i=1}^{n} p_{i} \log p_{i}
H(X)=−i=1∑npilogpi
为了使上式有意义,定义
0
log
0
=
0
0 \log 0=0
0log0=0 。因为熵的定义只依赖于
X
X
X 的分布,而与
X
X
X 的取值无关,所以我们可以将熵看成是分布的函数:
H
(
p
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(p)=-\sum_{i=1}^{n} p_{i} \log p_{i}
H(p)=−i=1∑npilogpi
上面说到均匀分布的熵最大,但这只是直观的感觉,并没有证明。下面利用拉格朗日乘子法进行证明。根据拉格朗日乘子的可以将
H
(
p
)
H(p)
H(p) 改写成:
H
(
p
)
=
−
∑
i
=
1
n
p
i
log
p
i
+
λ
(
∑
i
=
1
n
p
i
−
1
)
H(p)=-\sum_{i=1}^{n} p_{i} \log p_{i}+\lambda\left(\sum_{i=1}^{n} p_{i}-1\right)
H(p)=−i=1∑npilogpi+λ(i=1∑npi−1)
H
(
p
)
H(p)
H(p) 对每个
p
i
p_{i}
pi 求导,得到:
∂
H
(
p
)
∂
p
i
=
−
ln
p
i
−
1
+
λ
=
0
,
i
=
1
,
2
,
…
,
n
\frac{\partial H(p)}{\partial p_{i}}=-\ln p_{i}-1+\lambda=0, i=1,2, \ldots, n
∂pi∂H(p)=−lnpi−1+λ=0,i=1,2,…,n
由
−
ln
p
i
−
1
+
λ
=
0
-\ln p_{i}-1+\lambda=0
−lnpi−1+λ=0 可以得到
p
i
=
e
λ
−
1
,
i
=
1
,
2
,
…
,
n
p_{i}=e^{\lambda-1}, i=1,2, \ldots, n
pi=eλ−1,i=1,2,…,n
所以可知 p i p_{i} pi 是只与 λ \lambda λ 相关的值,每个 p i p_{i} pi 应该都相等,即 p 1 = p 2 = … = p n = 1 n p_{1}=p_{2}=\ldots=p_{n}=\frac{1}{n} p1=p2=…=pn=n1 ,此时 H ( p ) H(p) H(p) 取得最大值 log n \log n logn 。由此可知㒀的 值域是 [ 0 , log n ] [0, \log n] [0,logn] 。
基尼指数的定义及相关证明
基尼指数是经典决策树CART用于分美问题时选择最优特征的指标,是信息熵中
﹣
l
o
g
P
﹣logP
﹣logP 在
P
=
1
P = 1
P=1处一阶泰勒展开后的结果。假设有
K
K
K 个类,样本点属于第
k
k
k 类的概率为
p
k
p k
pk ,则概率分布的基尼指数定义为:
G
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
G(p)=\sum_{k=1}^{K} p_{k}\left(1-p_{k}\right)=1-\sum_{k=1}^{K} p_{k}^{2}
G(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
满足条件
∑
k
=
1
K
p
k
=
1
\sum_{k=1}^{K} p_{k}=1
∑k=1Kpk=1
正如上面所说,基尼指数同样可以描述一个随机变量的不确定性的程度,所以可以猜测:当 p 1 = p 2 = … = p K = 1 K p 1=p 2=\ldots=p_{K}=\frac{1}{K} p1=p2=…=pK=K1 时, G ( p ) G(p) G(p) 取得最大值,此时随机变量最不确定。那么,如何进行证明? 下面给出两种方法。
方法1: 同样可以使用拉格朗日乘子法进行证明。根据拉格朗日乘子的性质,改㝍
G
(
p
)
G(p)
G(p) 函数为:
G
(
p
)
=
1
−
∑
k
=
1
K
p
k
2
+
λ
(
∑
k
=
1
K
p
k
−
1
)
G(p)=1-\sum_{k=1}^{K} p_{k}^{2}+\lambda\left(\sum_{k=1}^{K} p k-1\right)
G(p)=1−k=1∑Kpk2+λ(k=1∑Kpk−1)
G
(
p
)
G(p)
G(p) 对每个
p
i
p_{i}
pi 求导,得到:
∂
G
(
p
)
∂
p
i
=
−
2
p
i
+
λ
=
0
,
i
=
1
,
2
,
…
,
K
\frac{\partial G(p)}{\partial p_{i}}=-2 p_{i}+\lambda=0, i=1,2, \ldots, K
∂pi∂G(p)=−2pi+λ=0,i=1,2,…,K
由
−
2
p
i
+
λ
=
0
-2 p_{i}+\lambda=0
−2pi+λ=0 可知
p
i
p_{i}
pi 同样只与常数
λ
\lambda
λ 相关,所以
p
1
=
p
2
=
…
=
p
K
=
1
K
p_{1}=p 2=\ldots=p_{K}=\frac{1}{K}
p1=p2=…=pK=K1
G
(
p
)
G(p)
G(p) 的值域为
[
0
,
1
−
1
K
]
\left[0,1-\frac{1}{K}\right]
[0,1−K1] 。
方法2: 构造
K
K
K 维空间中的两个点
P
1
=
[
p
1
,
p
2
,
…
,
p
K
]
T
P_{1}=\left[p_{1}, p_{2}, \ldots, p_{K}\right]^{T}
P1=[p1,p2,…,pK]T和
P
2
=
[
1
K
,
1
K
,
…
,
1
K
]
T
P_{2}=\left[\frac{1}{K}, \frac{1}{K}, \ldots, \frac{1}{K}\right]^{T}
P2=[K1,K1,…,K1]T ,其夹角为
θ
\theta
θ ,所以:
cos
θ
=
P
1
⋅
P
2
∣
P
1
∣
⋅
∣
P
2
∣
=
[
p
1
,
p
2
,
…
,
p
K
]
⋅
[
1
K
,
1
K
,
…
,
1
K
]
p
1
2
+
p
2
2
+
…
+
p
K
2
⋅
1
K
2
+
1
K
2
+
…
+
1
K
2
≤
1
\cos \theta=\frac{P_{1} \cdot P_{2}}{\left|P_{1}\right| \cdot\left|P_{2}\right|}=\frac{\left[p_{1}, p_{2}, \ldots, p_{K}\right] \cdot\left[\frac{1}{K}, \frac{1}{K}, \ldots, \frac{1}{K}\right]}{\sqrt{p_{1}^{2}+p_{2}^{2}+\ldots+p_{K}^{2}} \cdot \sqrt{\frac{1}{K^{2}}+\frac{1}{K^{2}}+\ldots+\frac{1}{K^{2}}}} \leq 1
cosθ=∣P1∣⋅∣P2∣P1⋅P2=p12+p22+…+pK2⋅K21+K21+…+K21[p1,p2,…,pK]⋅[K1,K1,…,K1]≤1
所以:
∑
k
=
1
K
p
k
2
≥
(
∑
k
=
1
K
p
k
)
2
K
\sum_{k=1}^{K} p_{k}^{2} \geq \frac{\left(\sum_{k=1}^{K} p_{k}\right)^{2}}{K}
k=1∑Kpk2≥K(∑k=1Kpk)2
于是:
G
(
p
)
≤
1
−
(
∑
k
=
1
K
p
k
)
2
K
=
1
−
1
K
G(p) \leq 1-\frac{\left(\sum_{k=1}^{K} p_{k}\right)^{2}}{K}=1-\frac{1}{K}
G(p)≤1−K(∑k=1Kpk)2=1−K1
等号在
p
1
=
p
2
=
…
=
p
K
=
1
K
p_{1}=p_{2}=\ldots=p_{K}=\frac{1}{K}
p1=p2=…=pK=K1 时达到。
搜索算法对比
在建立决策树时,我们常用到许多不同的算法进行搜索构建,其中最典型的搜索算法为ID3、C4.5、CART。
由于sklearn包内自带的决策树构建算法全部是基于CART改进算法进行的,所以这里我们对比决策树构建算法的区别,手动写了各种算法的构建代码,并基于各个算法进行比较:
ID3
ID3 (Iterative Dichotomiser 3) 是由 Ross Quinlan 于 1986 年开发的。该算法创建了一个多路树,为每个节点(即以贪婪的方式)找到将为分类目标产生最大信息增益的分类特征。树生长到它们的最大大小,然后通常应用修剪步骤来提高树泛化到看不见的数据的能力。
ID3 算法具体步骤:
输入: 训练数据集 D D D, 特征集 A A A, 阈值 ε \varepsilon ε;
输出: 决策树 T T T.
(1) 若 D D D 中所有实例属于同一类 C k C_{k} Ck,则 T T T 为单结点树,并将类 C k C_{k} Ck 作为该结点的类标记,返回 T T T ;
(2) 若 A = ∅ A=\varnothing A=∅,则 T T T 为单结点树,并将 D D D 中实例数最大的类 C k C_{k} Ck 作为该结点的类标记,返回 T T T ;
(3) 否则,按算法计算 A A A 中各特征对 D D D 的信息增益,选择信息增益最大的特征 A 8 A_{8} A8 ;
(4) 如果 A g A_{g} Ag 的信息增益小于呵值 ε \varepsilon ε,则置 T T T 为单结点树,并将 D D D 中实例数最 大的类 C k C_{k} Ck 作为该结点的类标记,返回 T T T ;
(5) 否则, 对 A g A_{g} Ag 的每一可能值 a i a_{i} ai,依 A g = a i A_{g}=a_{i} Ag=ai 将 D D D 分割为若干非空子集 D i D_{i} Di, 将 D i D_{i} Di 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T, 返回 T T T ;
(6) 对第 i i i 个子结点, 以 D i D_{i} Di 为训练集, 以 A − { A g } A-\left\{A_{g}\right\} A−{Ag} 为特征集, 递归地调用 步 (1) 〜步 (5), 得到子树 T i T_{i} Ti, 返回 T i T_{i} Ti.
其中数据集的信息增益计算方法为:
(1) 计算数据集
D
D
D 的经验熵
H
(
D
)
H(D)
H(D)
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
log
2
∣
C
k
∣
∣
D
∣
H(D)=-\sum_{k=1}^{K} \frac{\left|C_{k}\right|}{|D|} \log _{2} \frac{\left|C_{k}\right|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
(2) 计算特征
A
A
A 对数据集
D
D
D 的经验条件熵
H
(
D
∣
A
)
H(D \mid A)
H(D∣A)
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 \mid A)=\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} H\left(D_{i}\right)=-\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} \sum_{k=1}^{K} \frac{\left|D_{i k}\right|}{\left|D_{i}\right|} \log _{2} \frac{\left|D_{i k}\right|}{\left|D_{i}\right|}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
(3) 计算信息增益
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D, A)=H(D)-H(D \mid A)
g(D,A)=H(D)−H(D∣A)
由于ID3基础算法对无关紧要的特征也会精确分析,其类似穷举式的进行树搜索,最终建立的树效果较差,如下图所示。最终在我们的测试集上其分类正确率为 92.05%,且测试方差较大,鲁棒性较差。
C4.5
C4.5 是 ID3 的后继者,并通过动态定义将连续属性值划分为一组离散区间的离散属性(基于数值变量)取消了特征必须是分类的限制。C4.5 将训练好的树(即 ID3 算法的输出)转换为 if-then 规则集。然后评估每个规则的这些准确性,以确定它们的应用顺序。如果没有规则的准确性提高,则通过删除规则的先决条件来完成修剪。
该算法建立的树在测试集上的分类正确率为 96.86%
CART
CART(分类和回归树)与 C4.5 非常相似,但不同之处在于它支持数值目标变量(回归)并且不计算规则集。CART 使用在每个节点产生最大信息增益的特征和阈值构建二叉树。
CART 算法具体步骤:
输入: 训练数据集 D D D, 停止计算的条件;
输出: CART 决策树.
根据训练数据集, 从根结点开始, 递归地对每个结点进行以下操作, 构建二叉决策树:
(1) 设结点的训练数据集为 D D D, 计算现有特征对该数据集的基尼指数. 此时, 对每一个特征 A A A, 对其可能取的每个值 a a a, 根据样本点对 A = a A=a A=a 的测试为 “是” 或 “否” 将 D D D 分割成 D 1 D_{1} D1 和 D 2 D_{2} D2 两部分, 然后计算 A = a A=a A=a 时的基尼指数.
(2) 在所有可能的特征 A A A 以及它们所有可能的切分点 a a a 中, 选择基尼指数最 小的特征及其对应的切分点作为最优特征与最优切分点. 依最优特征与最优切分 点, 从现结点生成两个子结点, 将训练数据集依特征分配到两个子结点中去.
(3) 对两个子结点递归地调用 (1), (2), 直至满足停止条件.
(4) 生成 CART 决策树.
算法停止计算的条件是结点中的样本个数小于预定阈值, 或样本集的基尼指 数小于预定间值 (样本基本属于同一类), 或者没有更多特征.
其中如果样本集合
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) \in D \mid A(x)=a\}, \quad D_{2}=D-D_{1}
D1={(x,y)∈D∣A(x)=a},D2=D−D1
则在特征
A
A
A 的条件下, 集合
D
D
D 的基尼指数定义为
Gini
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
Gini
(
D
1
)
+
∣
D
2
∣
∣
D
∣
Gini
(
D
2
)
\operatorname{Gini}(D, A)=\frac{\left|D_{1}\right|}{|D|} \operatorname{Gini}\left(D_{1}\right)+\frac{\left|D_{2}\right|}{|D|} \operatorname{Gini}\left(D_{2}\right)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
该算法建立的树在测试集上的分类正确率为 97.23%。
改进CART
按照sklearn的文档介绍,其树搜索算法是基于改进CART,但并不明确其具体改进测试,推测其应该较原始CART算法改进较小。经测试,其预测准确率均值为97.50%,其分类结果和准确率于我们自己写的CART较为接近。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBYY7bBx-1639990672247)(res_prove_cart.png)]
为了测试的方便与结果的美观,我们的后续训练均基于sklearn的决策树包进行。
决策树参数训练
决策树划分标准(criterion)
如前所述,决策树的划分标准(不纯度度量)指标有信息熵"Entrophy"和基尼指数”Gini“,作为最基础的参数,我们首先需要进行对比,其结果如下:
不划分标准 | 交叉验证结果 |
---|---|
信息熵 | 95.54% |
基尼指数 | 96.15% |
对比发现,其它参数固定的情况下,基尼指数交叉验证结果更好,其作为我们决策树的划分标准更加合适。
最大深度(Maximum Depth)
第二个参数我们修正树的最大深度,是因为模型得分一般会随着最大深度单调递增,最终趋于稳定。而且最大深度一般对模型预测准确度的影响是最大的。
首先,我们将最大深度设置为2~50,然后进行5次5折交叉验证,对每次验证的深度-性能指标/预测得分进行绘制,得到了下图的结果。可以看出,随着深度的增加,各个指标的确是如预期变化的。
然后我们选择深度为10左右,再进行细化观察:
经过多次实验发现,验证结果的变化与设想有一定差距。分析结果,推测最大的可能性就是各个特征对性别推算的影响差距较大,很多特征在我们性别决策树的推测中不起作用甚至会起到负面作用,所以在寻优时需要适当丢弃一些特征进行判断,树的深度并不是越大越好。
最终,我们选择4作为我们树的最大搜索深度。
最小叶节点分割样本数(Minimum Samples Split)
一个节点必须至少有Minimum Samples Split个样本才能足够大以进行拆分。如果一个节点的样本数少于这个数值, 则分割过程停止,该节点不会被分割。
但是,这个数值不会控制叶的最小尺寸。例如,设置最小分割样本为11,假如父节点有20个样本,大于11,因此这个节点被拆分。但在此节点被拆分后,出现了一个子节点的样本数为5,小于11。
我们将最小叶节点分割样本数设置为2~15,然后进行5次5折交叉验证,对每次验证的最小叶节点分割样本数-性能指标/预测得分进行绘制,得到了下图的结果。
经过验证,我们最终选择3作为最小叶节点分割样本数。
最小叶节点样例数(Minimum Samples Leaf)
一个节点在分支后的每个子节点都必须包含至少Minimum Samples leaf个训练样本,这个结点才允许被分支,否则分支就不会发生。
和上面同理,我们先固定划分标准为Gini,最大深度为4,最小结点分割样本数为5进行参数5次5折交叉检验首先在0~100里查找:
然后我们再在0~15里进行比较,最终选择3作为最小节点样例数。
改进效果对比
我们将改进过的参数与为改进前对比,选用5*5折交叉验证,比较准确率,得到如下结果:
改进前:平均准确率约为95.2%。
改进后:平均准确率约为97.1%。
最终参数优化后生成的树为:
决策树的剪枝
理论分析
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树
T
T
T 的叶结点个数为
∣
T
∣
|T|
∣T∣ ,
t
t
t 是树
T
T
T 的叶结点,该叶结点有
N
t
N_{t}
Nt 个样本点,其中
k
k
k 类的样本点有
N
t
k
N_{t k}
Ntk 个,
k
=
1
,
2
,
⋯
,
K
k=1,2, \cdots, K
k=1,2,⋯,K ,
H
t
(
T
)
H_{t}(T)
Ht(T)为叶结点
t
t
t 上的经验熵,
α
⩾
0
\alpha \geqslant 0
α⩾0 为参数, 则决策树学习的损失函数可以定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)+\alpha|T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中经验熵为:
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
log
N
t
k
N
t
H_{t}(T)=-\sum_{k} \frac{N_{tk}}{N_{t}} \log \frac{N_{tk}}{N_{t}}
Ht(T)=−k∑NtNtklogNtNtk
在损失函数中, 将式 (4.1) 右端的第 1 项记作:
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
C(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)=-\sum_{t=1}^{|T|} \sum_{k=1}^{K} N_{tk} \log \frac{N_{tk}}{N_{t}}
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
这时有:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
式 中,
C
(
T
)
C(T)
C(T) 表示模型对训练数据的预测误差, 即模型与训练数据的拟合程度,
∣
T
∣
|T|
∣T∣ 表示模型复杂度,参数
α
⩾
0
\alpha \geqslant 0
α⩾0 控制两者之间的影响。 较大的
α
\alpha
α 促使选择较筒单的模型(树),较小的
α
\alpha
α 促使选择较复杂的模型(树),\alpha=0$ 意味着只考虑模型与训练数据的拟合程度, 不考虑模型的复杂度。
剪枝, 就是当 α \alpha α 确定时,选择损失函数最小的模型,即损失函数最小的子树。当 α \alpha α 值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型, 而决策树剪枝学习整体的模型。
寻找有效 a a a 值
最小成本复杂度修剪递归地找到具有“最弱链接”的节点。最弱的链接以有效 a a a 为特征,其中具有最小有效 a a a 的节点首先被修剪。为了了解哪些可能的 a a a 值是合适的,sklearn 包提供了在修剪过程的每个步骤中返回有效 a a a 值和相应的总叶子杂质的方法。随着 a a a 的增加,更多的树被修剪,这增加了其叶子的总杂质。
在下图中,最大有效 a a a 值被删除,因为它是只有一个节点的平凡树。
接下来,我们使用有效 a a a 训练决策树。在这里,我们展示了节点数量和树深度随着 alpha 的增加而减少。
当
a
a
a 设置为零并保持其他默认参数时,树会过度拟合,导致 100% 的训练准确度和 88% 的测试准确度。随着 alpha 的增加,更多的树被修剪,从而创建一个更好泛化的决策树。在本例中,设置
a
=
0.005
a=0.005
a=0.005 时可以最大化测试精度。