前言
在评分卡建模中,模型可解释性很重要,除了Logistic回归模型,决策树也是一个非常好理解的模型。决策树是一种贪心算法,得到的树不一定是最优的,而是效果较好的次优模型。
决策树学习步骤为:特征选择->决策树生成->剪枝。
一、决策树原理
由于决策树模型无法提前知道,所以只能先从根节点开始在属性空间中选择最优的属性进行分裂得到不同的分支,即中间节点,然后中间节点继续在属性空间中选择最优的属性进行下一次分裂,以此类推,直到满足条件后整个树得以确定。
对于分类问题常用的特征指标有信息增益,信息增益比,基尼指数(Gini),回归问题可以使用均方误差进行特征选择。
对于分类问题,每次的新分支生成都是为了将样本类别尽可能分开,即每个叶子节点下样本都属于同一类别。这里用纯度(Purity)来描述样本类别的一致性,纯度越高,则节点中类别不一致性越小。信息熵是度量样本纯度的一种常用指标,是纯度的量化表示,定义如下: 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其中,X是一个离散随机变量,取有限值。熵越大,随机变量的不确定性越大,n为类别个数, p i p_i pi表示第i个类别的概率。
在信息论中,信息是随机变量不确定性的度量,而概率是随机变量确定性的度量。信息熵是不确定性度量的平均值,熵越大,不确定性越大,越小不确定性越小,纯度越高。
在决策树的生成或分支节点的生成过程中,需要进行两次选择:属性空间中最优划分属性的选择,以及最优属性的划分区间选择(该属性上的最优切分点的选择)。在进行切分之前,先求出当前状态下的信息熵,选择切分属性进行切分后得到各分割节点的信息熵总和。我们总希望划分后的信息熵比没划分的信息熵小,这样结果的纯度就会更高。这里,信息熵减小的值就是信息增益,而给定属性划分后得到的信息熵的和就是条件熵。条件熵定义如下:
H
(
D
∣
A
)
=
−
∑
i
,
k
p
(
D
k
,
A
i
)
log
p
(
D
k
∣
A
i
)
=
−
∑
i
,
k
p
(
A
i
)
p
(
D
k
∣
A
i
)
log
p
(
D
k
∣
A
i
)
=
−
∑
i
=
1
n
∑
k
=
1
K
p
(
A
i
)
p
(
D
k
∣
A
i
)
log
p
(
D
k
∣
A
i
)
=
−
∑
i
=
1
n
p
(
A
i
)
∑
k
=
1
K
p
(
D
k
∣
A
i
)
log
p
(
D
k
∣
A
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
log
∣
D
i
k
∣
∣
D
i
∣
\begin{aligned} H(D|A)&=-\sum_{i,k}p(D_{k},A_{i})\log p(D_{k}|A_{i})\\ &=-\sum_{i,k}p(A_i)p(D_k|A_i)\log p(D_k|A_i)\\ &=-\sum_{i=1}^n\sum_{k=1}^Kp(A_i)p(D_k|A_i)\log p(D_k|A_i)\\ &=-\sum_{i=1}^n p(A_i)\sum_{k=1}^Kp(D_k|A_i)\log p(D_k|A_i)\\ &=-\sum_{i=1}^n \frac{|D_i|}{|D|}\sum_{k=1}^K \frac{|D_{ik}|}{|D_i|}\log\frac{|D_{ik}|}{|D_i|} \\ \end{aligned}
H(D∣A)=−i,k∑p(Dk,Ai)logp(Dk∣Ai)=−i,k∑p(Ai)p(Dk∣Ai)logp(Dk∣Ai)=−i=1∑nk=1∑Kp(Ai)p(Dk∣Ai)logp(Dk∣Ai)=−i=1∑np(Ai)k=1∑Kp(Dk∣Ai)logp(Dk∣Ai)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log∣Di∣∣Dik∣
简写如下:
H
(
D
∣
A
)
=
∑
i
=
1
n
P
(
A
i
)
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
log
∣
D
i
k
∣
∣
D
i
∣
\begin{aligned} H(D|A)&=\sum_{i=1}^nP(A_i)H(D_i)\\ &=-\sum_{i=1}^n \frac{|D_i|}{|D|}\sum_{k=1}^K \frac{|D_{ik}|}{|D_i|}\log\frac{|D_{ik}|}{|D_i|} \end{aligned}
H(D∣A)=i=1∑nP(Ai)H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log∣Di∣∣Dik∣
其中,n表示属性A划分区间的个数,
∣
D
i
∣
|D_i|
∣Di∣表示第i个划分中的样本个数;
∣
D
∣
|D|
∣D∣表示样本总数;K表示类别种类,本例为二分类,K=2;
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
log
∣
D
i
k
∣
∣
D
i
∣
\sum_{k=1}^K \frac{|D_{ik}|}{|D_i|}\log\frac{|D_{ik}|}{|D_i|}
∑k=1K∣Di∣∣Dik∣log∣Di∣∣Dik∣ 表示属性A在第i个划分下类别的信息熵;
这里,
p
i
=
P
(
X
=
x
i
)
,
i
=
1
,
2
,
.
.
.
,
n
p_{i}=P(X=x_{i}), i=1,2,...,n
pi=P(X=xi),i=1,2,...,n;
∣
D
i
k
∣
|D_{ik}|
∣Dik∣表示第i个划分下第K个类别中的样本数;
∣
D
i
∣
|D_i|
∣Di∣表示第i个划分中的总样本数;
信息增益定义如下:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
已知样本标签,可以根据上述信息增益的公式计算各个属性,选择信息增益最大的属性作为最优划分属性,然后在最优划分属性中选择最优切分点,假设该属性为离散变量,则N个可能取值对应N-1种划分方式,依次计算信息增益选择最优即可。
上述是一层决策树生成过程,将上层分支节点作为根节点继续进行节点生成并重复多次,直到决策树满足截止条件,即可完成整棵决策树的生成过程,决策树的生成是一种贪心算法,为了防止树结构过于庞大出现过拟合现象,需要设置截至条件,出现如下三种情况时该节点可以结束分裂:
- 天下大吉状态:当前节点都属同一类别,纯度最高,完美状态。
- 无可奈何状态:当前节点属性集为空,或有属性,但所有属性取值都相同,没有可划分属性,但依然存在类别不一致问题,只能将类别中条件概率最大的作为该节点最终决策标签,出现这种情况可能是特征工程做的不够充分的导致的,需要进一步特征工程。
- 穷途末路状态:当前节点样本集为空,没有可划分样本或样本太少,这时只能将父节点的标签作为该节点的预测标签,这种情况可能出现过拟合,所以需要限制叶节点的最小样本数。
另外,截止条件也可以增加其他限制,如信息增益必须大于一个增益阈值,还可以限定树的深度,中间节点的样本数等。
决策树生成的本质就是从根节点到叶节点信息熵平均值不断下降的过程。信息熵越来越低,样本纯度越来越高,分类效果也越好。但信息增益指标更倾向于选择属性空间中取值较多的属性作为最优划分属性。如果一个属性种类越多,那么对其划分得到的类别纯度越容易提高,信息增益越大。改进办法是使用信息增益比,公式如下:
g
r
(
D
,
A
)
=
g
(
D
,
A
)
/
H
(
A
)
g_r(D,A)=g(D,A)/H(A)
gr(D,A)=g(D,A)/H(A)
其中H(A)是对数据按属性划分得到的信息熵。解决了信息增益对较多属性的偏好,但信息增益比却对较少属性有偏好。进一步改进是使用Gini系数,应用最广泛的CART分类回归树就是采用这种指标完成树结构的生成。
名称 | 分类or回归 | 特征选择指标 | 属性选择原则 | 属性选择偏好 | 属性类型 | 缺失值 | 异常点 |
---|---|---|---|---|---|---|---|
ID3 | 分类 | 信息增益 | 越大越好 | 取值较多属性 | 离散变量 | 不支持 | 不敏感 |
C4.5 | 分类 | 信息增益比 | 越大越好 | 取值较少属性 | 离散/连续变量 | 支持 | 不敏感 |
CART | 分类或回归 | 基尼系数或MSE | 越小越好 | — | 离散/连续变量 | 支持 | 不敏感 |
在ID3中采用信息熵来度量样本标签的不一致性或纯度,C4.5采用一个启发式方法,先从候选划分属性中找出信息增益高于平均水平的属性,然后再从中选择信息增益比最高的进行划分,而CART树则采用一种新的纯度度量指标:Gini指数。基尼值计算公式如下:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2=1−k=1∑K(∣D∣∣Ck∣)2
其中,k表示类别的个数,|D|表示样本总数,
∣
C
k
∣
|C_k|
∣Ck∣表示第k个类别下的样本数。直观看,基尼值反映了从数据集中随机抽取两个样本类别不一致的概率,基尼值越小,样本纯度越高,属性总体的基尼值公式如下:
G
i
n
i
(
D
,
i
)
=
∑
j
=
1
V
∣
D
j
∣
∣
D
∣
G
i
n
i
(
D
j
)
Gini(D,i)=\sum_{j=1}^V\frac{|D_j|}{|D|}Gini(D_j)
Gini(D,i)=j=1∑V∣D∣∣Dj∣Gini(Dj)
其中,i表示属性空间的第i个属性,V表示该属性的可能取值,如性别属性{'男‘,’女‘,’未知‘};|D|表示样本总数,
∣
D
j
∣
|D_j|
∣Dj∣表示第i个属性第j个类别下的样本数;
G
i
n
i
(
D
j
)
Gini(D_j)
Gini(Dj)表示第i个属性第j个取值的基尼值;
G
i
n
i
(
D
j
)
Gini(D_j)
Gini(Dj)表示第i个属性的总体基尼值,也叫基尼指数。
二、决策树剪枝(pruning)
剪枝分为预剪枝和后剪枝,预剪枝是在决策树生成时进行剪枝,后剪枝是在完整决策树生成以后再进行剪枝操作。
- 基于泛化能力的预剪枝过程如下:
将数据集分为训练集和测试集,在训练集上进行分支生成前,先在测试集上验证模型效果,如果分类误差或准确率等,如果分支生成后对测试集的预测效果有提升,则保留分支,否则将该分支剪掉 ,不生成,重复多次上述操作,直到满足截止条件,决策树生成完毕。 - 基于泛化能力的后剪枝过程如下:
对于已生成的决策树模型,在测试集上验证当前模型的预测效果,然后递归的从叶子节点向父节点回撤,此时的父节点变为叶子结点,回撤后,如果模型在测试集预测效果有提升,则剪掉该叶子结点,否则保留原叶子节点。重复多次,直到模型预测性能不再提升,或提升效果小于一定阈值,剪枝完毕。 - 基于损失函数加正则项的后剪枝方法如下:
采用信息熵作为损失函数,决策树过于复杂主要表现在叶子节点数上(深度也在一定程度反映了决策树的复杂度),因此,决策树的损失函数可以用叶子结点信息熵总和与叶子节点数量表示,总损失函数如下:
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中,|T|表示叶节点个数, N t N_t Nt表示落在第t个叶节点的样本数, H t ( T ) H_t(T) Ht(T)表示第t个叶节点的信息熵, α \alpha α是惩罚项。 H t H_t Ht的计算公式如下:
H t ( T ) = − ∑ k = 1 K N t k N k log N t k N k H_t(T)=-\sum_{k=1}^{K}\frac{N_{tk}}{N_{k}}\log \frac{N_{tk}}{N_{k}} Ht(T)=−k=1∑KNkNtklogNkNtk
其中K为第t个叶节点下属性的可能取值数量, N t k N_{tk} Ntk为第t个叶节点下属性的第k个取值的样本数。将公式前半部分定义为C(T),如下:
C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k log N t k N k C_(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}{N_{tk}}\log \frac{N_{tk}}{N_{k}} C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNkNtk
则总的损失函数简写如下:
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+α∣T∣
其中,C(T)反映了训练数据的预测误差,而|T|为正则项。
从集成学习的角度理解,决策树模型是集成学习模型:基学习器是决策树桩,损失函数是信息熵或基尼值或均方误差,每一步特征选择均是令指标更优化,进而学习一个最优的决策树桩(基学习器)。对于回归问题,损失函数变为均方误差,其他地方与分类问题一致。
##三、 决策树的优缺点
决策树优点:
- 决策树易于理解和实现
- 同时支持连续型变量和离散型变量
- 异常点不敏感,不需要数据归一化
- CART树同时支持分类和回归,支持多分类
决策树缺点:
- 易过拟合,学习最优模型N-P难,基于启发式学习方法,贪心搜索局部最优。
- 每次分类只能根据单个特征划分,在处理特征关联性比较强的数据时需要特征工程
- 决策树不稳定,数据中的微小变化可能导致完全不同的树生成。
- 有些概念很难被决策树学习到,例如XOR。
- 数据不均衡时,决策结果可能会有偏差,需要先对数据集进行样本不平衡处理,