决策树
分类
分类是指根据样本数据的特征将其类型确定为某一已有的类别。分类是一种监督学习方法,必须事先明确知道各个类别的信息。
在面向海量数据进行分类时,为了降低使数据满足分类算法要求而所需的预处理代价,可以选择用聚类算法。
决策树
决策树是一种依托策略抉择而建立起来的树。是一种代表对象属性与对象值之间映射关系的预测模型。树中每个节点用于表示某个对象,每个分叉路径用于表示某个可能的属性值,从根节点到某叶节点所经历的路径所表示的对象值则对应该叶节点。决策树学习的目的是产生一个泛化能力强的决策树。
信息增益
构建决策树的过程就是选择特征的过程,要使得分割后的数据集的标签信息增益最大。
信息增益就是原始数据集标签熵减去分割后的数据集标签熵,信息增益大则熵变小,数据更加有序,便于尽快得到样本的分类结果。
一个属性A相对样本集合S的信息增益
G
a
i
n
(
S
,
A
)
Gain(S, A)
Gain(S,A)计算公式是:
G
a
i
n
(
S
,
A
)
=
H
(
S
)
−
Σ
v
∈
V
(
A
)
∣
S
v
∣
∣
S
∣
H
(
S
v
)
Gain(S,A)=H(S)-\Sigma_{v\in V(A)}\frac{|S_v|}{|S|}H(S_v)
Gain(S,A)=H(S)−Σv∈V(A)∣S∣∣Sv∣H(Sv)
其中,
H
(
S
)
=
Σ
i
=
1
m
(
−
p
i
l
o
g
2
p
i
)
H(S)=\Sigma_{i=1}^m(-p_ilog_2p_i)
H(S)=Σi=1m(−pilog2pi)(S是包含关于某个目标概念的正负样本的样本集,目标属性有m个不同的种类,H(S)表示S相对这m个状态类别的熵,
p
i
p_i
pi表示子集合中不同属性样本的比例)
算法伪代码
def DTree(examples, attributes):
if 所有样本都属于同一分类 then:
返回标号为该分类的叶节点
elif 属性值为空 or 样本在attributes上取值相同 then:
返回标号为examples中最普遍分类的叶节点
else:
选择一个最优划分属性A作为根节点(ID3算法选择信息增益为标准来选择划分属性)
for A的每一个可能的值vi:
令examplesi为具有A=vi的样本子集
从根节点出发增加分支(A=vi)
if examplesi 为空 then:
创建标号为examples中最普遍分类的叶节点
else:
递归创建子树DTree(examplesi, attributes-{A})
决策树算法改进
ID3算法即迭代二叉树3代,是一种用于决策树改进的算法。决策树越小越优。ID3算法的核心问题是判断测试哪个属性是最佳的分类属性。
ID3算法的思想是以信息增益度量属性为依据,采用自顶向下的贪婪策略遍历可能的决策空间,以选择出分裂后信息增益最大的属性,大致流程如下:
- 首先使用统计测试来确定每一个实例属性单独分类训练样本的能力,选择分类能力最好的属性作为树的根节点。
- 为根节点属性的每个可能值产生一个分支,把训练样本分配到适当的分支之下,重复该步骤,用每个分支节点关联的训练样本选取在该点被测试的最佳属性,从而形成对合格决策树的贪婪搜索。
信息增益准则对可取纸数目较多的属性有所偏好,这种偏好可能带来不利影响。
C4.5算法是对ID3的改进分类决策树算法。C4.5采用信息增益率来选择属性。
在树构造过程中要进行减枝处理,在构造决策树时,最好排除具有几个元素的节点,否则容易导致过拟合。
C4.5也支持对非离散数据和不完整数据进行处理。
信息增益率:
G
a
i
n
R
a
t
i
o
(
S
,
A
)
=
G
a
i
n
(
S
,
A
)
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
GainRatio(S, A)=\frac{Gain(S,A)}{SplitInformation(S,A)}
GainRatio(S,A)=SplitInformation(S,A)Gain(S,A)
分裂信息用来衡量属性分裂数据的广度和均匀程度,定义为:
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
=
−
Σ
i
=
1
m
∣
S
i
∣
∣
S
∣
l
o
g
2
∣
S
i
∣
∣
S
∣
SplitInformation(S,A)=-\Sigma_{i=1}^m\frac{|S_i|}{|S|}log_2\frac{|S_i|}{|S|}
SplitInformation(S,A)=−Σi=1m∣S∣∣Si∣log2∣S∣∣Si∣
A的取值数目越多,则
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
SplitInformation(S,A)
SplitInformation(S,A)的值会越大。
因此,增益率准则对可取值数目较少的属性有所偏好。C4.5算法采用启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
CART决策树使用基尼指数来选择划分属性。
数据S的纯度可以用基尼指数来衡量:
G
i
n
i
(
S
)
=
Σ
k
=
1
∣
y
∣
Σ
k
′
≠
k
p
k
p
k
′
=
1
=
Σ
k
=
1
∣
y
∣
p
k
2
Gini(S)=\Sigma_{k=1}^{|y|}\Sigma_{k'\neq k}p_kp_{k'}=1=\Sigma_{k=1}^{|y|}p_{k}^2
Gini(S)=Σk=1∣y∣Σk′=kpkpk′=1=Σk=1∣y∣pk2
基尼指数越小,表示数据纯度越高。即在选择划分属性时,选择划分后基尼指数最小的属性。
剪枝处理
剪枝是决策树学习算法对付“过拟合”的主要手段。决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点;但有些分治的当前划分虽然不能提升泛化能力,甚至导致泛化能力下降,但是在其基础上进行后续划分却有可能导致性能提升,预剪枝进制这些分支展开,其实有欠拟合的风险。
后剪枝是先从训练集中生成一棵完整的决策树,然后自底向上的队非叶节点进行考察,如果将该节点对应的子树替换成叶节点之后能带来决策树泛化能力的提升,则将该子树替换成叶节点。
后剪枝决策树通常比预剪枝决策树保留了更多的分枝。后剪枝决策树欠拟合的风险很小,泛化性能往往优于预剪枝决策树。但是因为它是在完全生成决策树之后进行剪枝,所以它的训练时间开销要比不剪枝的决策树和预剪枝的决策树要大很多。
连续值处理
不能直接采用连续值可以取的值来对节点进行划分。需要使用连续属性离散化技术,最简单的策略是使用二分法对连续属性进行处理。具体做法如下:
例如数据集D上有一个连续属性a,D中针对属性a,出现了n个不同的属性值,我们需要将属性值从小到大进行排序,最终结果是
a
1
,
a
2
,
a
3
,
.
.
.
,
a
n
{a_1,a_2,a_3,...,a_n}
a1,a2,a3,...,an,基于不同的划分点位置,可以将数据集D基于属性a划分成两个数据集
D
t
−
D_t^-
Dt−,
D
t
+
D_t^+
Dt+,其中
D
t
−
D_t^-
Dt−中的值其属性a的取值小于等于划分点,
D
t
+
D_t^+
Dt+中的值其属性a的取值大于划分点。
则划分点可以考虑如下集合
T
a
=
{
a
i
+
a
i
+
1
2
∣
i
≤
i
≤
n
−
1
}
T_a={\{\frac{a^i+a^{i+1}}{2}|i\le i\le n-1\}}
Ta={2ai+ai+1∣i≤i≤n−1},再该集合中选择信息增益最大的划分点。再在所有属性中寻找信息增益最大的属性作为当前的节点。和离散属性不同的是,如果当前节点划分属性是连续属性,该属性还可以作为其后代节点的划分属性。