决策树
决策树结构
- 根节点——样本全集
- 内部节点——属性测试
- 叶节点——决策结果
决策树学习的目的就是为了产生一颗泛化能力强,即处理未见示例能力强的决策树。
操作步骤
输入:
训练集 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
过程
-
生成结点node
-
if D中样本全属于同一类别C,则
- 将node标记为C类叶结点 ,return
-
if A = 空集 or D中样本在A上取值相同则
- 将node标记为叶结点,将类别标记为D中样本数最多的类 return
-
从A中选择最优划分属性 a ∗ a_* a∗
-
for a ∗ a_* a∗的每一个值 a ∗ v a_*^v a∗v
- 为node生成一个分支;令 D v D_v Dv表示 D D D中在 a ∗ a_* a∗上取值为 a ∗ v a_*^v a∗v的样本子集
- if
D
v
D_v
Dv为空 则
- 将分支结点标记为叶结点,其类别标记为D中样本最多的类;return
- else
- 以 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∗)为分支结点
end for
在决策树算法中,又三种情形会return
- 当前结点包含的样本全属于同一类别,无需划分
- 当前属性集为空,或是所有样本在所有属性上的取值相同,无法划分
- 当前结点包含的样本集合为空,不能划分
在第2种情况下,当前结点标记为叶结点
在第3种情况下,也同样把当前结点标记为叶结点
但是其中是有区别的,第2种是将其类别设定为该结点所含样本最多的类别,第3种是将其类别设定为其父结点所含样本最多的类别。
划分
我们知道其中算法最重要的部分就是
- 从A中选择最优划分属性 a ∗ a_* a∗
即如何选择最优划分属性
信息熵
假定当前样本集合D种第k类样本所占比例为 p k ( k = 1 , 2 , . . ∣ y ∣ ) p_k(k=1,2,..|y|) pk(k=1,2,..∣y∣),则D的信息熵定义
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 Ent(D)=−k=1∑∣y∣pklog2pk
信息增益
离散属性a有V和可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a1,a2,...,aV ,如果使用a来对样本集划分,则会产生v个分支结点,其中第v个分支结点包含了D种所有在属性a上取值为 a v a^v av的样本,即为 D v D^v Dv。
以分辨鱼和哺乳动物为例,假设有属性集a = {有肺,卵生,会游}
那么就会根据这些属性划分数据集
其中会游可能就是排在第一的划分结点,然后接着是其他的。那么怎么判定那个是最重要的划分结点呢?
我们可以计算出根据不同的结点所包含的样本计算其中的信息熵,考虑到不同的分支结点所包含的样本数也不同,则给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| ∣Dv∣/∣D∣,即样本数越多的分支结点的影响越大。
从而根据属性a对样本集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=1∑V∣D∣∣Dv∣Ent(Dv)
Gain越大,则
D
v
D^v
Dv的信息熵越小,则说明用属性
a
v
a^v
av划分的“纯度提升”越大。
ID3算法就是比较各个属性划分的信息增益的大小来选择划分属性
增益率
以西瓜书举的例子来说明
如果使用编号来作为一个候选划分属性,可以猜测到用编号作为属性的得到的信息增益应该是最大的,因为每个分支结点只包含一个样本,这样,分支结点的纯度已达最大,但是这样的决策树没有泛化能力,无法对新样本进行有效预测。
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好带来的不利影响。我们使用增益率来选择最优划分属性。
增益率定义为
G
a
i
n
−
r
a
t
i
o
n
(
D
,
a
)
=
G
a
i
n
D
,
a
I
V
(
a
)
其
中
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
Gain-ration(D,a) = \frac{Gain{D,a}}{IV(a)}\\ 其中 IV(a) = -\sum_{v=1}^V \frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}
Gain−ration(D,a)=IV(a)GainD,a其中IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
I
V
(
a
)
IV(a)
IV(a)称为属性a的固有值,属性的取值数目越多,固有值越大。
但是,增益率准则对可取值数小的有所偏好(嗯,这不是又绕回来了嘛)所以C4.5算法不是直接用增益率来选择属性。而是先从其中找信息增益高于平均水平的属性,然后再从中选择增益率高的。
基尼指数
CART决策树就是直接使用“基尼指数”来选择化分属性。
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^{'}!=k}p_kp_{k^{'}}\\ = 1-\sum_{k=1}^{|y|}p_k^2
Gini(D)=k=1∑∣y∣k′!=k∑pkpk′=1−k=1∑∣y∣pk2
Gini(D)直接反映了从数据集D中随机抽取两个样本,其类别标记为不一样的概率。如果基尼指数越小,则纯度越高。
剪枝处理
剪枝是决策树学习算法中应对“过拟合”的主要手段。在决策树算法中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会导致决策树分支过多,以至于把训练集的一些特点当作所有数据都具有的一般性质而导致过拟合。
- 预剪枝
决策树生成过程中,对每个结点在划分前进行估计,若当前的划分不能带来决策树泛化性能提升,则停止划分并且将当前结点设定为叶结点。
优点:
减低了过拟合的风险,还减少了决策树的训练时间开销和测试时间开销。
缺点:
有些分支当前划分即便不能提升泛化能力,但在其基础上进行的后续划分却有可能导致性能的提高。预剪枝基于“贪心”禁止这些分支展开,提高了“欠拟合”的风险。
- 后剪枝
从训练集生成一棵的决策树,然后自底向上地对非叶结点进行考察,将该结点对应地子树替换为叶结点能带来决策树地泛化能力地提升,则将该子树替换为叶结点。
后剪枝首先考察决策树中的结点⑥,若将其领衔的分支剪除,则相当于⑥把替换为叶结点。替换后决策树的验证集精度提高的话,则后剪枝策略决定剪枝。
接着考察结点5,结点3和1
优点:
欠拟合的风险降低
缺点:
由于是构建决策树后进行剪枝的,因此训练时间开销比未剪枝和预剪枝的都大。
【学习笔记未完、待更新,注意仅作学习笔记,不用于商业用途】