ML算法推导细节04—决策树DT

探究算法细节,深入了解算法原理


决策树:是 if-then规则的集合,可以用于分类,也可以用于回归问题,模型速度快,可解释性强。

三个步骤:特征选择、决策树生成、决策树剪枝

三种算法:ID3、C4.5、CART

1. 决策树ID3算法

1.1 信息熵

  • 衡量信息不确定性的一种指标,不确定性越大,信息熵越大。
  • 是度量样本集合纯度的一种指标,值越小,样本集合纯度越高。
    E n t ( D ) = − ∑ k = 1 K p k l o g 2 ( p k ) Ent(D)=-\sum_{k=1}^{K}p_klog_2(p_k) Ent(D)=k=1Kpklog2(pk)

对于二分类问题:
H ( p ) = − p l o g ( p ) − ( 1 − p ) l o g ( 1 − p ) H(p)=-plog(p)-(1-p)log(1-p) H(p)=plog(p)(1p)log(1p)

  • 当 p=0或p=1时,随机变量完全没有不确定性
  • 当 p=0.5时,熵最大,不确定性最大。
  • 熵H(X)表示随机变量X的不确定性,条件熵H(X|Y)表示X在知道Y以后剩下的不确定性。
  • H(x)-H(X|Y) 称为互信息,在ID3种叫信息增益

1.2 信息增益

  • 假设离散属性 a a a V V V个可能的取值 { a 1 , a 2 , . . . , a V } {\{a^1,a^2,...,a^V\}} {a1,a2,...,aV},若使用属性 a a a 来划分样本集 D D D,则会产生 V V V 个分支节点。
  • 考虑到不同的分支节点样本数不同,给分支节点赋予权重 ∣ D V ∣ / ∣ D ∣ |D^V|/|D| DV/D,即样本数越多的分支节点影响越大

使用属性 a a a 划分样本集 D D D信息增益为:

G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

信息增益越大,则使用属性 a a a 进行划分所获得的 “纯度提升” 越大

ID3算法,使用信息增益来进行决策树的划分属性选择

a ∗ = arg ⁡ max ⁡ a ∈ A Gain ⁡ ( D , a ) a_{*}=\underset{a \in A}{\arg \max } \operatorname{Gain}(D, a) a=aAargmaxGain(D,a)

1.3 根据信息增益选择属性的例子

属性集合 {色泽,根蒂,敲声,纹理,脐部,触感}

以属性 色泽 为例划分样本集,可得到3个子集,记为 D 1 D^1 D1(色泽=青绿), D 2 D^2 D2(色泽=乌黑), D 3 D^3 D3(色泽=浅白)

E n t ( D ) = − ( 8 17 log ⁡ 2 8 17 + 9 17 log ⁡ 2 9 17 ) = 0.998 Ent(D)=-\left(\frac{8}{17} \log _{2} \frac{8}{17}+\frac{9}{17} \log _{2} \frac{9}{17}\right)=0.998 Ent(D)=(178log2178+179log2179)=0.998

Ent ⁡ ( D 1 ) = − ( 3 6 log ⁡ 2 3 6 + 3 6 log ⁡ 2 3 6 ) = 1.000 \operatorname{Ent}\left(D^{1}\right)=-\left(\frac{3}{6} \log _{2} \frac{3}{6}+\frac{3}{6} \log _{2} \frac{3}{6}\right)=1.000 Ent(D1)=(63log263+63log263)=1.000

Ent ⁡ ( D 2 ) = − ( 4 6 log ⁡ 2 4 6 + 2 6 log ⁡ 2 2 6 ) = 0.918 \operatorname{Ent}\left(D^{2}\right)=-\left(\frac{4}{6} \log _{2} \frac{4}{6}+\frac{2}{6} \log _{2} \frac{2}{6}\right)=0.918 Ent(D2)=(64log264+62log262)=0.918

Ent ⁡ ( D 3 ) = − ( 1 5 log ⁡ 2 1 5 + 4 5 log ⁡ 2 4 5 ) = 0.722 \operatorname{Ent}\left(D^{3}\right)=-\left(\frac{1}{5} \log _{2} \frac{1}{5}+\frac{4}{5} \log _{2} \frac{4}{5}\right)=0.722 Ent(D3)=(51log251+54log254)=0.722

G a i n ( D , 色 泽 ) = E n t ( D ) − ∑ v = 1 3 ∣ D v ∣ ∣ D ∣ E n t ( D v ) = 0.109 Gain(D,色泽)=Ent(D)-\sum_{v=1}^{3}\frac{|D^v|}{|D|}Ent(D^v) = 0.109 Gain(D,)=Ent(D)v=13DDvEnt(Dv)=0.109

同理,依次计算其他属性的信息增益:

G a i n ( D , 根 蒂 ) = 0.143 , G a i n ( D , 敲 声 ) = 0.141 , G a i n ( D , 纹 理 ) = 0.381 , G a i n ( D , 脐 部 ) = 0.289 , G a i n ( D , 触 感 ) = 0.006 Gain(D,根蒂)=0.143,Gain(D,敲声)=0.141,Gain(D,纹理)=0.381,Gain(D,脐部)=0.289,Gain(D,触感)=0.006 Gain(D,)=0.143Gain(D,)=0.141Gain(D,)=0.381Gain(D,)=0.289Gain(D,)=0.006

所以选择纹理作为划分属性,然后对每个分支节点做进一步划分。

1.4 ID3算法步骤

输入为m个样本,每个样本有n个离散特征,特征集合为A,输出为决策树T

(1)初始化信息增益的阈值ϵ

(2)判断样本是否为同一类输出 D i D_i Di,如果是则返回单节点树T,标记类别为 D i D_i Di

(3)判断特征集合是否为空,如果是则返回单节点树T,标记类别为样本多数属类

(4)计算 n n n个特征的信息增益,选择信息增益最大的特征 A g A_g Ag

(5)如果 A g A_g Ag小于阈值ϵ,则返回单节点树T,标记类别为样本多数属类

(6)如果 A g A_g Ag大于阈值ϵ,按特征 A g A_g Ag的取值划分样本到各个分支,记为 D i D_i Di,返回增加了节点的树T。

(7)对于所有的子节点,令 D = D i , A = A − A g D=Di, A=A-{Ag} D=Di,A=AAg,递归调用2-6步,得到子树 T i T_i Ti 并返回。

1.5 ID3算法缺点

  • 没有考虑连续特征
  • 没有考虑缺失值
  • 没有考虑过拟合问题
  • 取值较多的特征比取值较少的特征信息增益大,偏向于选择取值较多的特征

2. 决策树C4.5算法

对ID3算法的4个缺点进行改进

2.1 信息增益率

G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ IV(a) = -\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|} IV(a)=v=1VDDvlog2DDv

G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain_{\_}ratio(D,a)=\frac{Gain(D,a)}{IV(a)} Gain_ratio(D,a)=IV(a)Gain(D,a)

  • I V ( a ) IV(a) IV(a)称为属性 a a a的固有值,属性取值数目越多, I V ( a ) IV(a) IV(a)越大
  • 信息增益率对取值较少的属性有所偏好
  • 启发式方法选择划分属性,先从候选属性中找出信息增益高于平均水平的,再从中选择信息增益率最高的

2.2 连续特征离散化

  • m个样本的连续特征 a a a 有 m个取值,从小到大排列为 a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am
  • 取相邻两个样本的平均数,得到 m-1 个划分点
  • 计算每个划分点的增益率,选择信息增益率最大的作为划分属性,两个分支(补充:类别y会因为划分点,而被划分成两个部分)
  • 与离散属性不同,连续属性在后面还可以参与属性选择(去掉了之前的连续属性的划分点)

2.3 剪枝

引入正则化系数进行初步剪枝,在CART树中具体讲。

2.4 缺失值处理

2个子问题

  • 在样本某些特征缺失的情况下,选择划分的属性
  • 选定了划分属性,对于在该属性上缺失特征的样本的处理。

(1)对于第一个子问题

  • 将数据分成两部分,对每个样本设置一个权重(初始可以都为1),一部分是有特征A的数据D1,另一部分是没有特征A的数据D2
  • 对数据集D1和特征A的各个特征值,计算加权重后的信息增益率
  • 最后乘上一个系数,这个系数是 “无特征A缺失的样本加权后” 所占加权总样本的比例。

(2)对于第二个子问题

  • 将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。
  • 比如缺失特征A的样本之前权重为1,特征A有3个特征值A1,A2,A3,样本个数分别为2,3,4,对应权重调节为2/9,3/9, 4/9。

2.5 C.5算法缺点

  • 剪枝方法可以优化。预剪枝,即在决策树生成的时候就决定是否剪枝;后剪枝,即生成决策树后,再通过交叉验证来剪枝
  • 生成的是多叉树,但二叉树运算效率高
  • 只能用于分类
  • 熵模型,有大量耗时的对数运算,连续值还有大量的排序运算

3. CART分类树

3.1 基尼系数

CART分类树,使用基尼系数代替信息增益率,选择最优的划分属性。

基尼系数:反映了随机抽取两个样本,类别不一致的概率
基尼系数:用于衡量数据集D的纯度,基尼系数越小,数据集纯度越高

Gini ⁡ ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ y ∣ p k 2 \operatorname{Gini}(D)=\sum_{k=1}^{|y|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}}=1-\sum_{k=1}^{|y|}p_k^2 Gini(D)=k=1yk̸=kpkpk=1k=1ypk2

G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini_{\_}index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1VDDvGini(Dv)

基尼系数可以作为熵模型的一个近似代替。

CART分类树,每次只对某个特征的值进行二分,建立的是二叉树

3.2 连续特征和离散特征的处理

(1)连续特征,离散化与C4.5一样,只是将信息增益率改成了基尼系数。

(2)离散特征,不停的二分离散特征

  • CART分类树会考虑把A分成{A1}和{A2,A3}, {A2}和{A1,A3}, {A3}和{A1,A2}三种情况
  • 找到基尼系数最小的组合,比如{A2}和{A1,A3},然后建立二叉树节点
  • 由于这次没有把特征A的取值完全分开,后面还有机会选择特征A来划分A1和A3。
  • 和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。

3.3 CART分类树算法步骤

输入是训练集D,基尼系数的阈值,样本个数阈值;输出是决策树T。

从根节点开始,用训练集递归的建立CART树

(1)对于当前节点的数据集D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。

(2)计算样本集D的基尼系数,如果小于阈值,则返回决策树子树,当前节点停止递归。

(3)计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数

(4)选择基尼系数最小的特征A对应的特征值a,把数据集划分成两部分D1和D2

(5)对左右子节点递归的调用1-4步,生成决策树。

生成的决策树做预测时,假如测试样本A落到了某个叶子节点,取多数属类

4. CART回归树

回归树与分类树的区别:

  • 在于样本输出,如果样本输出是离散值,那么这是一颗分类树。
  • 样本输出是连续值,那么那么这是一颗回归树。

CART回归树和分类树的建立和预测的2点区别:

  • 连续值的处理方法不同
  • 决策树建立后做预测的方式不同

4.1 对于连续值处理的区别

  • CART分类树,采用基尼系数选择特征
  • 回归模型,采用和方差的度量方式

CART回归树的度量目标:对于特征A的取值s,划分成的数据集D1和D2,使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。

表达式为:

min ⁡ ⎵ A , s [ m i n ⎵ c 1 ∑ x i ∈ D 1 ( A , s ) ( y i − c 1 ) 2 + min ⁡ ⎵ c 2 ∑ x i ∈ D 2 ( A , s ) ( y i − c 2 ) 2 ] \underbrace{\min }_{A,s}\left[\underbrace{m i n}_{c_1}\sum_{x_{i} \in D_{1}(A, s)}\left(y_{i}-c_{1}\right)^{2}+\underbrace{\min }_{c_2} \sum_{x_{i} \in D_{2}\left(A_{, s}\right)}\left(y_{i}-c_{2}\right)^{2}\right ] A,s minc1 minxiD1(A,s)(yic1)2+c2 minxiD2(A,s)(yic2)2

其中, c 1 c_1 c1 D 1 D_1 D1数据集的样本输出均值, c 2 c_2 c2 D 2 D_2 D2数据集的样本输出均值。

4.2 决策树建立后预测方式的区别

  • CART分类树,采用叶子节点里多数属类。
  • CART回归树,采用叶子的均值或者中位数。

5. 决策树损失函数的度量

  • 决策树学习的损失函数通常是正则化的极大似然函数(李航. 统计学习方法5.1.4节)。
  • 选取最优决策树是NP难问题,采用启发式方法,近似求解,得到次优解的决策树。
  • 决策树学习算法,递归的选择最优特征,使各子集在当前条件下分类最好。
  • 决策树的生成只考虑局部最优,决策树的剪枝考虑全局最优。
  • 决策树学习算法包括:特征选择、决策树生成、决策树剪枝
  • 决策树的剪枝往往通过极小化决策树整体的损失函数来实现。

假设树T的叶节点个数为 ∣ T ∣ |T| T,t是树T的叶节点,该叶节点有 N t N_t Nt个样本点,其中k类的样本点有 N t k N_{tk} Ntk

H t ( T ) H_t(T) Ht(T)表示叶节点t上的经验熵(ID3算法 or C4.5算法,CART树用基尼系数),表达式为:
H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T)=-\sum_{k}\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=kNtNtklogNtNtk

CART树表示为: H t ( T ) = 1 − ∑ k p k 2 H_t(T)=1-\sum_{k}p_k^2 Ht(T)=1kpk2

决策树的损失函数为:
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ = C ( T ) + α ∣ T ∣ C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|=C(T)+\alpha|T| Cα(T)=t=1TNtHt(T)+αT=C(T)+αT

  • C ( T ) C(T) C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| T表示模型的 复杂度。
  • α \alpha α确定时,子树越大,往往与训练数据的拟合越好,模型的复杂度越高。

只有在剪枝的过程中才有损失函数,

6. CART树的剪枝

  • CART回归树和CART分类树的剪枝策略:除了在度量损失的时候一个使用均方差,一个使用基尼系数,算法基本完全一样。
  • 解决过拟合的方法:对CART树进行剪枝,类似正则化
  • CART树采用后剪枝,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。

CART树的剪枝算法可以概括为两步:

  • 从生成的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根节点,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn}
  • 然后用交叉验证法对子树序列进行测试,选择最优子树。

6.1 剪枝的损失函数度量

ML算法推导细节05—随机森林RF:决策树的损失函数度量

在剪枝的过程中,对于任意的一棵子树T,计算子树损失函数为:

C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}\left(T\right)=C\left(T\right)+\alpha\left|T\right| Cα(T)=C(T)+αT

其中, α ≥ 0 \alpha \geq 0 α0为正则化参数, C ( T ) C(T) C(T)为训练数据的预测误差(分类树用基尼系数度量,回归树用均方差度量), ∣ T ∣ |T| T为子树T的叶子节点数量。

  • α = 0 \alpha=0 α=0时,没有正则化,原始生成的CART树就是最优子树
  • α = ∞ \alpha=\infty α=时,正则化最大,只有根节点的子树为最优子树
  • α \alpha α越大,剪枝的越厉害,生成的决策树就越小

对于固定的 α \alpha α,一定存在损失函数最小的子树。

6.2 正则化参数的选择

在这里插入图片描述
位于节点 t 的任意一颗子树 T t T_t Tt,如果没有剪枝,损失为:
C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+αTt

如果将 t 剪掉,只保留 t 的根节点,损失为:
C α ( T ) = C ( T ) + α C_{\alpha}(T)=C(T)+\alpha Cα(T)=C(T)+α

  • C ( T t ) &lt; C ( T ) C(T_t)&lt;C(T) C(Tt)<C(T),当 α = 0 \alpha=0 α=0或者很小时, C α ( T t ) &lt; C α ( T ) C_\alpha(T_t)&lt;C_\alpha(T) Cα(Tt)<Cα(T)
  • α \alpha α增大到一定时, C α ( T t ) = C α ( T ) C_\alpha(T_t)=C_\alpha(T) Cα(Tt)=Cα(T) α = C ( T ) − C ( T t ) ∣ T t ∣ − 1 \alpha=\frac{C(T)-C\left(T_{t}\right)}{\left|T_{t}\right|-1} α=Tt1C(T)C(Tt) T t T_t Tt T T T的损失相同,但 T T T节点更少,可以对 T t T_t Tt剪枝

CART树的交叉验证策略

  • 计算出每个子树是否剪枝的阈值α
  • 针对不同的α所对应的剪枝后的最优子树,做交叉验证。选择一个最好的α

7. 决策树算法总结

算法支持模型树结构特征选择连续值处理缺失值处理剪枝
ID3分类多叉树信息增益不支持不支持不支持
C4.5分类多叉树信息增益率支持支持支持
CART分类,回归二叉树基尼系数,方差支持支持支持

CART树的缺点:

  • 分类决策是由一个特征决定的,而不是一组特征决定的(改进:多变量决策树,选择最优的一个特征线性组合来做决策)
  • 如果样本发生一点点的改动,会导致树结构剧烈改变(改进:集成学习)

7.1 决策树优点

  • 简单直观,决策树的生成很直观,可解释性好
  • 不需要预处理,不需要归一化
  • 能处理缺失值,能处理离散值、连续值
  • 通过交叉验证的剪枝来选择模型,提高泛化能力
  • 对异常点的容错能力好,健壮性高

7.2 决策树的缺点

  • 非常容易过拟合,泛化能力不强。通过设置节点最少样本数和决策树深度来改进。
  • 样本发生一点点的改动,会导致树结构的剧烈改变。通过集成学习改进
  • 寻找最优决策树是一个NP难的问题,一般是通过启发式方法,容易陷入局部最优。通过集成学习改进。
  • 有些比较复杂的关系,决策树很难学习,比如异或。通过神经网络解决。
  • 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。通过调节样本权重来改善。

8. sklearn.tree

8.1 DecisionTreeClassifier和DecisionTreeRegression

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, 
splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, 
min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, 
min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

class sklearn.tree.DecisionTreeRegressor(criterion=’mse’, 
splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, 
min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, 
min_impurity_decrease=0.0, min_impurity_split=None, presort=False)
  • criterion:分类CART树 默认gini,回归CART树默认mse
  • splitter:best或random。选择划分属性时,best选择最优的,random随机在部分划分点中选择最优的。样本量非常大时,推荐random
  • max_depth:最大深度,默认不限制,一般取10-100
  • min_samples_split:某节点样本数小于这个值时,不再划分
  • min_samples_leaf:限制叶子节点数,如果某叶子节点数小于这个值,会和兄弟节点一起被剪枝。
  • min_weight_fraction_leaf:限制叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。当未提供sample_weight时,样本具有相同的权重。
  • max_features:划分时需要考虑的特征数量,有sqrt(n),log2(n)
  • max_leafs_nodes:限制最大叶子节点数,防止过拟合
  • min_impurity_decrease:如果分裂导致不纯度的减少大于这个值,则分裂
  • min_impurity_split:如果某节点的不纯度小于这个阈值,不再划分。
  • class_weight:样本各类别权重,四分类权重应为[{0:1,1:1},{0:1,1:5},{0:1,1:1},{0:1,1: 1}]而不是[{1:1},{2:5},{3:1},{4:1}]。如果指定了sample_weight,这些权重将与sample_weight(通过fit方法传递)相乘。
  • presort:数据是否预排序,一般选择false

8.2 sklearn决策树可视化

需要安装 graphviz
在这里插入图片描述
在这里插入图片描述
参考博客
1. 决策树算法原理(上)
2. 决策树算法原理(下)
3. 机器学习总结(lecture 9)算法:决策树Decision Tree(DT)
4. sklearn决策树文档
5. sklearn决策树源码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值