很多集成学习器,他们的基本模型都是决策树,我们经常提到的gbdt模型,它的基模型就是CRAT树.
决策树是什么东西?就是我们平常所说的if-then条件,我们把它组合成树的结构. 决策树中有两种结点,叶子结点和非叶子结点. 其中非叶节点代表的条件,叶子结点表示的实例所属的类别.
我们如何生成这个决策树呢,最主要的一点就是选择那个特征作为当前树的分割结点,这就叫做特征选择,有了特征选择就有了决策树的生成,最后我们还有进行决策树剪枝(后面会提到为什么剪枝).
之前的笔记都没有分析书中的例子,没有一个直观的解释,这次我们从这个例子出发,看一下什么是决策树.
现在我们有下面一张表的数据,想生成一个决策树模型,预测某个人是否符合贷款条件.
现在假如我们通过"某种方法"构造了一颗下面的决策树. 从下图可以看到特征对应的是非叶子结点,如果这个被分到这个叶节点,就预测为这个叶节点的类别. 从图中我们可以知道以下两点:
问题来了,为什么我们要选择是否有房子作为第一个构造特征呢?我们构造学习模型,会遵守经验风险最小化或者似然函数极大规则,选择损失函数,我们如何根据风险最小化,选择特征呢?
给定训练数据集
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是样本个数. 基于这个数据生成决策树模型.
常见的决策树模型有以下三种(决策树既可以做分类也可以做回归):
先给出两个定义,信息熵和条件熵:
信息熵表示随机变量不确定性的度量,设随机标量X是一个离散随机变量,其概率分布为:
P ( X = x i ) = p i , i = 1 , 2 , . . . , n P(X=x_i)=p_i, i=1,2,...,n P(X=xi)=pi,i=1,2,...,n
则随机变量X的熵定义为:
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^{n}p_ilog{p_i} H(X)=−i=1∑npilogpi
熵越大,随机变量的不确定性就越大,当 p i = 1 n p_i=\frac{1}{n} pi=n1$时,
随机变量的熵最大等于logn,故 0 ≤ H ( P ) ≤ l o g n 0 \leq H(P) \leq logn 0≤H(P)≤logn.
条件熵就是在给定X的条件的情况下,随机标量Y的条件,记作 H ( Y ∣ X ) H(Y|X) H(Y∣X),可以结合贝叶斯公式进行理解,定义如下
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^{n}p_iH(Y|X=x_i) H(Y∣X)=i=1∑npiH(Y∣X=xi)
这里 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.
一般在基于数据的估计中,我们使用的基于极大似然估计出来的经验熵和经验条件熵.
model | feature select | 树的类型 | 计算公式 |
---|---|---|---|
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 | {分类:信息增益比} | 多叉树 | 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)决策树算法伪代码:
从上述算法中,我们有三个问题,需要再次提出,并进行解释:
上面提到过,信息熵表示数据的混乱的程度,信息增益是信息熵和条件信息熵的差值,表示的熵减少的程度,信息增益越大,代表根据我们的决策树规则得到的数据越趋向于规整,这就是我们划分类别的目的.
信息增益根据特征之后的条件信息熵,这样的话偏向于特征取值较多的特征的问题,因此使用信息增益比对这个问题进行校正.
在构造决策树的过程中,我们的两个停止条件是,子集只有一个类别和没有可以选择的特征,这是我们全部利用了数据中的所有可以使用的信息,但是我们知道数据是可能有误差了,而且数据不足,我们需要得到更鲁棒的模型,剪枝的意义就是是的深度减小,这样的就相当于减少规则的情况下,决策树的性能反而不差,使其更加鲁棒.
再说为什么剪枝,我们构造决策树的时候,是完全的在训练数据上得到最优的模型. 这就是问题,这就什么,这就过拟合,训练误差很小,但是验证集上就不怎么好用. 损失=经验风险最小化+正则项=结构风险最小化. 构造决策树的时候只考虑了经验风险最小化,剪枝的时候我们考虑结构风险最小化,正则项就是树的叶子节点个数. 重新定义损失函数,树的叶子节点个数|T|,t是树T的叶节点,该叶节点有 N t N_t Nt个样本,其中k类的样本点有 N t k N_{tk} Ntk个,k=1,2,…,K, H t ( T ) H_t(T) Ht(T)是叶子节点t经验熵, α ≤ 0 \alpha \leq 0 α≤0是参数,平衡经验损失和正则项,得到计算公式如下:
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∣
其中,经验熵为:
H t ( T ) = − ∑ k N t k H t l o g N t k H t H_t(T)=-\sum_{k}\frac{N_{tk}}{H_t}log\frac{N_{tk}}{H_t} Ht(T)=−k∑HtNtklogHtNtk
这是有:
C α = C ( T ) + α ∣ T ∣ C_{\alpha}=C(T)+\alpha|T| Cα=C(T)+α∣T∣
决策树剪枝优化过程考虑了在训练数据上的经验风险最小化和减小模型复杂度两个方向. 因为加了正则项,所有我们基于贪心的思想进行剪枝,因为当剪掉一个树节点,虽然经验风险增加了,但是模型复杂度降低了,我们基于两个方面的平衡进行剪枝,如果剪掉之后,总的风险变小,就进行剪枝.
算法:
输入: 算法产生的整个决策树,参数 α \alpha α
修剪之后的树 T α T_{\alpha} Tα
分类与回归树(classification and regression tree, 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=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},D−2=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决策树
从上面两个算法的不同可以看出,只是在label的设置和决策节点选择的方式不同,整个架构依然是决策树的常用的架构. 而且上面的树的构建过程,都是基于训练数据的经验风险最小化,没有使用带有正则项的结构风险最小化,这样的模型容易发生过拟合,为了不让模型过拟合,我们需要进行模型的剪枝.
CART树的剪枝有很多难点和有意思的地方让我们开慢慢解开这层面纱
CART剪枝算法有两步组成:
损失函数:
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+\alpha|T| Cα(T)=C(T)+α∣T∣
其中,T为任意子树, C ( T ) C(T) C(T)是在训练数据上的预测误差,|T|是树的叶子节点的个数, α ≥ 0 \alpha \geq 0 α≥0是参数, C α ( T ) C_{\alpha}(T) Cα(T)是参数 α \alpha α是的子树T的整体的损失,参数 α \alpha α是平衡训练数据拟合程度和模型复杂度的权重.
对于固定的 α \alpha α,一定存在使损失函数 C α ( T ) C_{\alpha}(T) Cα(T)最小的子树,将其记作 T α T_{\alpha} Tα. 我们可以理解为每一个 α \alpha α都对应一个最有子树和最小损失.
而且已经得到证明,可以用递归的方法对树进行剪枝. 将 α \alpha α从小增大, 0 = α 0 < α 1 < . . . < α n < + ∞ 0=\alpha_0<\alpha_1<...<\alpha_n<+\infty 0=α0<α1<...<αn<+∞,产生一系列的区间 [ α i , α i + 1 ) , i = 0 , 1 , . . . , n [\alpha_i,\alpha_{i+1}),i=0,1,...,n [αi,αi+1),i=0,1,...,n;剪枝得到的子树序列对应着区间 α ∈ [ α i , α i + 1 ) , i = 0 , 1 , . . . , n \alpha \in [\alpha_i,\alpha_{i+1}),i=0,1,...,n α∈[αi,αi+1),i=0,1,...,n的最有子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn}.
我们给出算法:
输入: CART算法生成的决策树T_0.
输出: 最优的决策树T_{\alpha}
接下面,我们不去看算法,来看书中给的一段文字的截图,这里截图是因为我要画图,进行比较解释,图中自由理论(哈哈):
看懂这个图之后,再看算法一气呵成,因为我们假设每一次得到的树都有可能是最优的,所以不能直接去最后一个树,要使用交叉验证选择最有的决策树结构.
决策树用途相当广泛,而且有很多变形,看着简单其实不易,需要看看探索每一个知识点. 目前机器学习,人工智能如此火热,需要进行理论实践学习等多方面的结合方能立于不败之地.
注:生活如此,问题不大. 喵~