9.1 什么是决策树
决策树是一种监督学习。一棵决策树由分支结点、分支和叶结点构成。
每个内部结点表示一个属性上的测试,每个分支代表一个测试输出,每个叶结点代表一种类别或类的分布。
优点:可读性好,具有描述性,有助于人工分析;
效率高。一次构建,重复使用,每次预测的最大计算次数不超过树的深度。
9.2 属性选择的几个度量
1. 期望信息或信息熵
表示任意样本集的纯度,样本内部的混乱程度与熵值成正比。
设
D
D
D 为数据集合(含有
s
=
∣
D
∣
s=|D|
s=∣D∣ 个样本),类别属性具有
m
m
m 个不同值
v
i
(
i
=
1
,
2
,
⋅
⋅
⋅
,
m
)
v_i(i=1,2,···,m)
vi(i=1,2,⋅⋅⋅,m),即分为
m
m
m 个类:
ω
i
(
i
=
1
,
2
,
⋅
⋅
⋅
,
m
)
\omega_i(i=1,2,···,m)
ωi(i=1,2,⋅⋅⋅,m)。
s
i
s_i
si 是
ω
i
\omega_i
ωi 类中的样本数,
s
i
=
∣
ω
i
∣
s_i=|\omega_i|
si=∣ωi∣,
p
i
p_i
pi 是任意样本属于类
ω
i
\omega_i
ωi 的概率,
p
i
p_i
pi 用
s
i
/
s
s_i/s
si/s 估计,即
p
i
=
s
i
/
s
,
s
=
s
1
+
s
2
+
⋅
⋅
⋅
+
s
m
p_i=s_i/s,s=s_1+s_2+···+s_m
pi=si/s,s=s1+s2+⋅⋅⋅+sm,则样本分类的期望信息为:
I
n
f
o
(
D
)
=
I
(
s
1
,
s
2
,
⋅
⋅
⋅
,
s
m
)
=
E
(
p
1
,
p
2
,
⋅
⋅
⋅
,
p
m
)
=
−
∑
i
=
1
m
p
i
log
2
p
i
=
−
∑
i
=
1
m
s
i
s
log
2
s
i
s
Info(D)=I(s_1,s_2,···,s_m)=E(p_1,p_2,···,p_m)=-\sum\limits_{i=1}^{m}p_i{\log}_2p_i=-\sum\limits_{i=1}^{m}\frac{s_i}{s}{\log}_2\frac{s_i}{s}
Info(D)=I(s1,s2,⋅⋅⋅,sm)=E(p1,p2,⋅⋅⋅,pm)=−i=1∑mpilog2pi=−i=1∑mssilog2ssi
其中,定义
log
2
0
=
0
{\log}_20=0
log20=0。
E E E 满足下列特性:
1)非负性
E
(
p
1
,
p
2
,
⋅
⋅
⋅
,
p
m
)
≥
0
E(p_1,p_2,···,p_m)\ge 0
E(p1,p2,⋅⋅⋅,pm)≥0
2)确定性
E
(
1
,
0
)
=
E
(
0
,
1
)
=
E
(
0
,
1
,
0
,
⋅
⋅
⋅
)
=
0
E(1,0)=E(0,1)=E(0,1,0,···)=0
E(1,0)=E(0,1)=E(0,1,0,⋅⋅⋅)=0
3)上凸性
E
(
λ
p
+
(
1
−
λ
)
q
)
>
λ
E
(
p
)
+
(
1
−
λ
)
E
(
q
)
其
中
0
<
λ
<
1
E(\lambda p+(1-\lambda)q)>\lambda E(p)+(1-\lambda)E(q)\\ 其中0<\lambda<1
E(λp+(1−λ)q)>λE(p)+(1−λ)E(q)其中0<λ<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 个子集:
S
1
,
S
2
,
⋅
⋅
⋅
,
S
v
S_1,S_2,···,S_v
S1,S2,⋅⋅⋅,Sv,其中
S
j
S_j
Sj 包含
D
D
D 中在属性
A
A
A 上取值为
a
j
a_j
aj 的样本。记
s
i
j
s_{ij}
sij 是子集
S
j
S_j
Sj 中属于类
ω
j
\omega_j
ωj 的样本数,即
s
i
j
=
∣
{
x
∣
x
∈
S
j
⋀
x
∈
ω
i
}
∣
,
s
=
∣
D
∣
s_{ij}=|\{ x|x\in S_j \bigwedge x\in \omega_i\}|,s=|D|
sij=∣{x∣x∈Sj⋀x∈ωi}∣,s=∣D∣。非类别属性
A
A
A 的熵:
E
(
A
,
D
)
=
∑
j
=
1
v
s
1
j
+
s
2
j
+
⋅
⋅
⋅
+
s
m
j
s
I
(
s
1
j
,
s
2
j
,
⋅
⋅
⋅
,
s
m
j
)
I
(
s
1
j
,
s
2
j
,
⋅
⋅
⋅
,
s
m
j
)
=
−
∑
i
=
1
m
s
i
j
s
j
log
2
s
i
j
s
j
E(A,D)=\sum\limits_{j=1}^{v}\frac{s_{1j}+s_{2j}+···+s_{mj}}{s}I(s_{1j},s_{2j},···,s_{mj})\\ I(s_{1j},s_{2j},···,s_{mj})=-\sum\limits_{i=1}^{m}\frac{s_{ij}}{s_j}{\log}_2\frac{s_{ij}}{s_j}
E(A,D)=j=1∑vss1j+s2j+⋅⋅⋅+smjI(s1j,s2j,⋅⋅⋅,smj)I(s1j,s2j,⋅⋅⋅,smj)=−i=1∑msjsijlog2sjsij
3. 信息增益
信息增益是定义属性分类训练数据效力的度量标准。简单地说,一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低(样本按照某属性划分时造成熵减少的期望)。
一个属性
A
A
A 相对样例集合
D
D
D 的信息增益
G
a
i
n
(
A
)
Gain(A)
Gain(A) 被定义为
G
a
i
n
(
A
,
D
)
=
I
n
f
o
(
D
)
−
E
(
A
,
D
)
=
I
(
s
1
,
s
2
,
⋅
⋅
⋅
,
s
m
)
−
E
(
A
,
D
)
Gain(A,D)=Info(D)-E(A,D)=I(s_1,s_2,···,s_m)-E(A,D)
Gain(A,D)=Info(D)−E(A,D)=I(s1,s2,⋅⋅⋅,sm)−E(A,D)
4. 信息增益比
信息增益比是衡量属性分裂数据的广度和均匀性。
一个属性的分裂信息定义为:
S
p
l
i
t
I
n
f
o
(
A
,
D
)
=
−
∑
i
=
1
v
∣
S
i
∣
∣
D
∣
log
2
∣
S
i
∣
D
SplitInfo(A,D)=-\sum\limits_{i=1}^{v}\frac{|S_i|}{|D|}{\log}_2\frac{|S_i|}{D}
SplitInfo(A,D)=−i=1∑v∣D∣∣Si∣log2D∣Si∣
其中,
S
1
,
S
2
,
⋅
⋅
⋅
,
S
v
S_1,S_2,···,S_v
S1,S2,⋅⋅⋅,Sv 是属性
A
A
A(
v
v
v 个值)分割
D
D
D 而形成的
v
v
v 个子集。实际上,分裂信息是
D
D
D 关于属性
A
A
A 的各值的熵。
一个属性的信息增益比定义为:
G
a
i
n
R
a
t
i
o
(
A
,
D
)
=
G
a
i
n
(
A
,
D
)
S
p
l
i
t
I
n
f
o
(
A
,
D
)
GainRatio(A,D)=\frac{Gain(A,D)}{SplitInfo(A,D)}
GainRatio(A,D)=SplitInfo(A,D)Gain(A,D)
5. 基尼指标
定义为:
G
i
n
i
(
D
)
=
∑
j
=
1
m
p
j
(
1
−
p
j
)
=
1
−
∑
j
=
1
m
p
j
2
Gini(D)=\sum\limits_{j=1}^{m}p_j(1-p_j)=1-\sum\limits_{j=1}^{m}{p_j}^2
Gini(D)=j=1∑mpj(1−pj)=1−j=1∑mpj2
其中,
p
j
p_j
pj 为类
j
j
j 出现的频率,通常有
p
j
=
∣
S
j
∣
∣
D
∣
p_j=\frac{|S_j|}{|D|}
pj=∣D∣∣Sj∣。
基尼指标主要在 C A R T CART CART 算法中使用。用于二分情况的选择。
如果按属性
A
A
A 将数据集
D
D
D 划分成两个子集
S
1
,
S
2
S_1,S_2
S1,S2,则分割后的
G
i
n
i
s
p
l
i
t
{Gini}_{split}
Ginisplit 是
G
i
n
i
s
p
l
i
t
(
D
)
=
N
1
N
G
i
n
i
(
S
1
)
+
N
2
N
G
i
n
i
(
S
2
)
{Gini}_{split}(D)=\frac{N_1}{N}Gini(S_1)+\frac{N_2}{N}Gini(S_2)
Ginisplit(D)=NN1Gini(S1)+NN2Gini(S2)
其中,
N
1
=
∣
S
1
∣
,
N
2
=
∣
S
2
∣
,
N
=
∣
D
∣
N_1=|S_1|,N_2=|S_2|,N=|D|
N1=∣S1∣,N2=∣S2∣,N=∣D∣。
9.3 matlab代码
%旧版本
function [result]=DecisionTree(X,Y,Z)
%X为二维矩阵,每行代表一个样本
%Y为单元矩阵,每个元素为单字符型,如y={'1','1','2','2'}
%Z为待识样本,为行向量,其长度与X每行的长度相同
t=classregtree(x,y); %建立决策树
result=treeval(t,Z) %对Z进行分类
sfit=t.classname(result);
result=str2num(sfit{1,1}) %获得分类结果
treedisp(t); %显示分类结果
%新版本
function [result]=DecisionTree(X,Y,Z)
%X为二维矩阵,每行代表一个样本
%Y为单元矩阵,每个元素为单字符型,如y={'1','1','2','2'}
%Z为待识样本,为行向量,其长度与X每行的长度相同
t=fitctree(X,Y);
result=predict(t,Z);
view(t)