以下是我总结有关决策树的相关知识,不到位之处,烦请指出。
决策树(decision tree) 是一类常见的机器学习方法。顾名思义, 决策树是基于树结构进行决策的。一般的, 一棵树包含一个根节点、 若干个内部结点、若干个叶节点。
叶结点对应于决策结果, 其他每个节点则对应于每个属性测试.每个结点包含的样本集合根据属性测试的结果被划分到子结点钟;
根结点包含样全集,从根结点到每个叶节点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一棵泛化能力强的决策树,其基本流程遵循简单且直观的“分而治之(divide-and-conquer)”策略。
**输入:**训练集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) D={(x_1, y_1), (x_2, y_2), ..., (x_m, y_m)} D=(x1,y1),(x2,y2),...,(xm,ym)
属性集合 A = a 1 , a 2 , . . . , a d A={a_1, a_2, ..., a_d} A=a1,a2,...,ad.
**过程:**函数 T r e e G e n e r a t e ( D , A ) TreeGenerate(D,A) TreeGenerate(D,A)
1: 生成结点node
2: if D D D中样本全属于同类别 C C C then
3: 将node标记为 C C C类叶结点; return
4: end if
5: **if ** A = ∅ A=\varnothing A=∅ OR D D D中的样本在 A A A上的取值相同 then 6: 将node标记为叶结点, 其类别标记为 D D D中样本数最多的类;return
7:end if
8: 从 A A A中选取最优划分属性 a ∗ a_* a∗;
9: for a ∗ a_* a∗的每一个值 a ∗ v a_*^v a∗v do
10: 为node生成一个分支;令 D v D_v Dv表示D中在 a ∗ a_* a∗上的取值为 a ∗ v a_*^v a∗v的样本子集;
11: if D v D_v Dv为空 then
12: 将分支结点标记为叶结点, 其类别标记为 D D D中样本最多的类;return
13: else
14: 以 T r e e G e n e r a t e ( D v , A { a ∗ } ) TreeGenerate(D_v, A\{a_*\} ) TreeGenerate(Dv,A{a∗}) 为分支结点
15: endif
16: end for
**输出:**以node为根结点的一棵决策树
在决策树三种情形中会导致递归返回:
当前结点包含的样本全属于同一类别, 无需划分。
当前属性集为空, 或是所有样本在所有属性上的取值相同, 无法划分。
当前结点包含的样本集合为空, 不能划分。
2.1 信息增益
“信息熵”是度量样本集合纯度最常见的一种指标。假设当前样本集合 D D D中第 k k k类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ y ∣ ) p_k(k=1, 2, ..., |y|) pk(k=1,2,...,∣y∣), 则 D D D的信息熵定义为: (1) E N T ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k ENT(D)=-\sum_{k=1}^{|y|} p_klog_2p_k\tag{1} ENT(D)=−k=1∑∣y∣pklog2pk(1) E N T ( D ) ENT(D) ENT(D)的值越小, 则 D D D的纯度越高。
假定离散属性 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 0 V0 V0个分支结点,其中第 v v v个分支节点包含了 D D D中所有在属性 a a a上的取值为 a v a^v av的样本,记为 D v D^v Dv. 我们可以根据1式计算出 D v D^v Dv的信息熵, 再考虑到不同的分支结点所包含的样本数不同, 给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| ∣Dv∣/∣D∣。 样本数越多的分支结点的影响越大,于是可计算出用属性 a a a对样本集 D D D进行划分所获得的“信息增益” (2) 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)\tag{2} Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)(2) 一般而言,信息增益越大, 则意味着使用属性 a a a来进行划分所获得的"纯度提升"越大, 因此我们可用信息增益来进行决策树的划分属性选择。
2.2 增益率
由于信息增益准则对可取数目较多的属性有所偏好, 为减少这种偏好可能带来的不利影响, 可以使用“增益率(gain ratio)”来选择最优划分属性,增益率定义为: (3) G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V Gain_ratio(D,a)=\frac{Gain(D,a)}{IV}\tag{3} Gainratio(D,a)=IVGain(D,a)(3) 其中: (4) I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a) =-\sum_{v=1}^V\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}\tag{4} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣(4) 称为属性 a a a的"固有值"。属性 a a a的可能取值数目越多(即 V V V越大), 则 I V ( a ) IV(a) IV(a)的值通常会越大。增益率准则对可取数目较少的属性有所偏好。
基尼系数
CART(classification and Regression Tree)使用“基尼指数”来划分属性. (5) G i n i ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ‘ ≠ k p k p k ‘ = 1 − ∑ k = 1 ∣ ∣ y p k 2 Gini(D)=\sum_{k=1}^{|y|}\sum_{k`\ne k}p_kp_{k`}\\ =1-\sum_{k=1}^{||y}p_k^2\tag{5} Gini(D)=k=1∑∣y∣k‘̸=k∑pkpk‘=1−k=1∑∣∣ypk2(5) 直观来说, G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D中随机抽取两个样本,其类别标记不一致的概率,因此 G i n i ( D ) Gini(D) Gini(D)越小, 则数据集 D D D的纯度越高。属性 a a a的基尼指数定义为: (6) 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)\tag{6} Giniindex(D,a)=v=1∑VD∣Dv∣Gini(Dv)(6) 于是,我们在候选属性集合 A A A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性, 即 a ∗ = a r g m i n a ∈ A G i n i _ i n d e x ( D , a ) a_* = argmin_{a\in A} Gini\_index(D, a) a∗=argmina∈AGini_index(D,a)
剪枝(Pruning)是决策树学习算法对付“过拟合”的主要手段。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
预剪枝是指决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升, 则停止划分并将当前结点标记为叶节点。后剪枝则是先从训练集生成一颗完整的决策树, 然后自底向上的对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该字数替换为叶结点。后剪枝决策树通常比预剪枝保留更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底而上地对树种的所有非叶节点进行逐一考察,因此其训练时间开销比预剪枝决策树要大得多。
4.1 连续值处理
优于连续属性的可取值数目不再有限,因此,不能直接根据连续属性的可取值来对结点进行划分。最简单的策略是采用“二分法”对连续值进行处理。
给定样本集 D D D和连续属性 a a a, 假定 a a a在 D D D上出现了 n n n个不同的取值,将这些值从小到大进行排序。记为 { a 1 , a 2 , . . . , a n } \{a^1, a^2, ...,a^n\} {a1,a2,...,an},基于划分点 t t t可将 D D D分为子集 D t − D_t^- Dt−和 D t + D_t^+ Dt+,
D t − D_t^- Dt−包含那些在属性 a a a上取值不大于 t t t的样本,
D t + D_t^+ Dt+则包含那些在属性 a a a上取值大于 t t t的样本。
对于相邻的属性取值 a i a^i ai与 a i + 1 a^{i+1} ai+1来说, t t t在区间 [ a i , a i + 1 ) [a^i, a^{i+1}) [ai,ai+1)中取任意值所产生的划分结果相同。因此,对连续属性 a a a, 我们可考察包含 n − 1 n-1 n−1个元素的候选划分集合 (7) T a = { a i + a i + 1 2 ∣ 1 ≤ i ≤ n − 1 } T_a=\{\frac{a^i +a^{i+1}}{2}| 1\leq i \leq n-1 \}\tag{7} Ta={2ai+ai+1∣1≤i≤n−1}(7)
即把区间 [ a i , a i + 1 ) [a^i, a^{i+1}) [ai,ai+1)的中位点 a i + a i + 1 2 \frac{a^i+a^{i+1}}{2} 2ai+ai+1作为候选划分点。然后,我们就可像离散属性值一样来考虑这些划分点, 选取最优的划分点进行样本集合的划分。 (8) G a i n ( D , a ) = m a x t ∈ T a G a i n ( D , a , t ) m a x t ∈ T a E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a)=max_{t\in T_a}Gain(D, a, t)\\ max_{t \in T_a}Ent(D) -\sum_{\lambda \in \{-, + \}}\frac{|D^{\lambda}_t|}{|D|}Ent(D^{\lambda}_t) \tag{8} Gain(D,a)=maxt∈TaGain(D,a,t)maxt∈TaEnt(D)−λ∈{−,+}∑∣D∣∣Dtλ∣Ent(Dtλ)(8) 其中 G a i n ( D , a , t ) Gain(D, a, t) Gain(D,a,t)是样本集 D D D基于划分点 t t t二分后的信息增益. 于是, 我们就可选择使 G a i n ( D , a , t ) Gain(D, a, t) Gain(D,a,t)最大化划分点。
4.2 缺失值处理
“信息增益”的计算式为 G a i n ( D , a ) = ρ × G a i n ( D ^ , a ) = ρ × ( E n t ( D ^ ) − ∑ v = 1 V r ^ v E n t ( D ^ v ) ) Gain(D,a)=\rho \times Gain(\hat{D}, a)\\ =\rho \times (Ent(\hat{D}) -\sum_{v=1}^V \hat{r}_v Ent(\hat{D}^v)) Gain(D,a)=ρ×Gain(D^,a)=ρ×(Ent(D^)−v=1∑Vr^vEnt(D^v)) 其中若样本 x x x在划分属性 a a a上的取值已知, 则将 x x x划入与其取值对应的子结点,且样本权值在子结点中保持为 w x w_x wx. r若样本中 x x x在划分属性 a a a上的取值未知, 则将 x x x同时划入所有子结点, 且样本值在与属性值 a v a^v av对应的子结点中调整为$\hat{r} w_x $.直观地看, 这就是让同一个样本以不同的概率划入到不同的子结点中去。
若我们爸每个属性视为坐标空间中的一个坐标轴, 则 d d d个属性描述的样本就对应了 d d d维空间中的一个数据点, 对样本分类以为着在这个坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行, 即它的分类边界由若干个与坐标轴平行的分段组成。
树的内容很简单,后续会开一门专题的实践编程帖…
