赞
踩
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。决策树是一个预测模型,代表的是对象属性与对象值之间的一种映射关系。
决策树的基本流程如下
即按属性不断的对样本进行划分,直到每个叶结点都只包含同一类的样本
关键是如何选择最优划分属性,随着划分过程不断进行,希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度(purity)越来越高。
1)信息熵:
假定当前样本集合
D
D
D中第
k
k
k类样本所占比例为
p
k
(
k
=
1
,
2
,
…
,
∣
Y
∣
)
p_k(k=1,2,\ldots,|Y|)
pk(k=1,2,…,∣Y∣),则
D
D
D的 信息熵(information entropy) 定义为
E
n
t
(
D
)
=
−
∑
k
=
1
∣
Y
∣
p
k
log
2
p
k
Ent(D)=-\sum_{k=1}^{|Y|}{p_k\log_2p_k}
Ent(D)=−k=1∑∣Y∣pklog2pk
E
n
t
(
D
)
Ent(D)
Ent(D)的值越小,则
D
D
D的纯度越高。
假定离散属性a有V个可能的取值
{
a
1
,
a
2
,
…
,
a
V
}
\{a^1,a^2,\dots,a^V\}
{a1,a2,…,aV},其对样本集D进行划分会产生V个分支结点,
D
v
D^v
Dv表示第v个分支结点的样本(D中在属性a上取值为
a
v
a^v
av的样本),每个分支包含的样本数不同,给分支结点赋予权重
∣
D
v
∣
∣
D
∣
\dfrac{|D^v|}{|D|}
∣D∣∣Dv∣,即样本数越多的分支结点影响越大,则 信息增益(information gain) 定义为
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}{\dfrac{|D^v|}{|D|}Ent(D^v)}
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
信息增益越大,意味着用属性a来进行划分获得的"纯度提升"越大。ID3决策树学习算法以信息增益为准则来选择划分属性。
如果一个属性划分的每个分支只包含1个样本,即这些分支结点的纯度已达最大,则该属性的信息增益显然是最大的,但这样的决策树显然不具有泛化能力。
信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好带来的影响,产生了 增益率(gain ratio)
G
a
i
n
_
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
,
其中
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
log
2
∣
D
v
∣
∣
D
∣
Gain\_ratio(D,a)=\dfrac{Gain(D,a)}{IV(a)},\text{其中} IV(a)=-\sum_{v=1}^{V}{\dfrac{|D^v|}{|D|}\log_2\dfrac{|D^v|}{|D|}}
Gain_ratio(D,a)=IV(a)Gain(D,a),其中IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
称为属性a的"固有值"(intrinsic value),属性a的取值越多,则IV(a)值通常越大。
C4.5算法采用信息增益率来选择划分属性,先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
1)基尼值
数据集D的纯度可用基尼值来度量
G
i
n
i
(
D
)
=
∑
i
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
i
=
1
∣
Y
∣
p
k
2
Gini(D)=\sum_{i=1}^{|Y|}\sum_{k'\neq k}{p_kp_{k'}}=1-\sum_{i=1}^{|Y|}{p_k^2}
Gini(D)=i=1∑∣Y∣k′̸=k∑pkpk′=1−i=1∑∣Y∣pk2
公式推导:
∑
i
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
p
k
′
=
∑
i
=
1
∣
Y
∣
p
k
∑
k
′
≠
k
p
k
′
=
∑
i
=
1
∣
Y
∣
p
k
(
1
−
p
k
)
=
1
−
∑
i
=
1
∣
Y
∣
p
k
2
\color{red}\sum_{i=1}^{|Y|}\sum_{k'\neq k}{p_kp_{k'}}=\sum_{i=1}^{|Y|}{p_k}\sum_{k'\neq k}{p_{k'}}\\ \color{red}=\sum_{i=1}^{|Y|}{p_k}(1-p_k)\\ \color{red}=1-\sum_{i=1}^{|Y|}{p_k^2}\\
i=1∑∣Y∣k′̸=k∑pkpk′=i=1∑∣Y∣pkk′̸=k∑pk′=i=1∑∣Y∣pk(1−pk)=1−i=1∑∣Y∣pk2
G
i
n
i
(
D
)
Gini(D)
Gini(D)反映了从数据集D中随机抽取两个样本,其类别不一致的概率,
G
i
n
i
(
D
)
Gini(D)
Gini(D)越小,数据集D的纯度越高。
2)基尼指数
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}{\dfrac{|D^v|}{|D|}Gini(D^v)}
Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
CART决策树(Classification and Regression Tree) 使用基尼指数来选择划分属性,即在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性
a
∗
=
arg
min
a
∈
A
G
i
n
i
_
i
n
d
e
x
(
D
,
a
)
a_*=\arg\min_{a\in A} Gini\_index(D,a)
a∗=arga∈AminGini_index(D,a)
因为决策树的学习过程中,经常会产生过多的分支,导致过拟合,所以剪枝(pruning)是决策树算法对付过拟合的手段。
决策树剪枝的基本策略有"预剪枝"和"后剪枝"。
对泛化性能的评估可以用"验证集"
C4.5决策树算法中采用的二分法。
给定样本集D和连续属性a,a在D上有n个不同的取值,将这n个取值从小到大排序,记为
{
a
1
,
a
2
,
…
,
a
n
}
\{a^1,a^2,\dots,a^n\}
{a1,a2,…,an},基于划分点t可将D分为子集
D
t
−
D^-_t
Dt−(在属性a上取值<=t的样本)和
D
t
+
D^+_t
Dt+(在属性a上取值>t的样本)。可得包含n-1个元素的候选划分点集合
T
a
=
{
a
i
+
a
i
+
1
2
∣
1
≤
i
≤
n
−
1
}
T_a=\{\dfrac{a^i+a^{i+1}}{2}|1\leq i\leq n-1\}
Ta={2ai+ai+1∣1≤i≤n−1}
对该集合可以像离散属性值一样来考察。例如对于最优的信息增益
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\{-,+\}}{\dfrac{|D_t^\lambda|}{|D|}Ent(D_t^\lambda)}
Gain(D,a)∗=maxt∈TaGain(D,a,t)=maxt∈TaEnt(D)−λ∈{−,+}∑∣D∣∣Dtλ∣Ent(Dtλ)
给定数据集D和属性a,令
D
~
\tilde D
D~表示D中在属性a上没有缺失值的样本子集。假定属性a有V个可取值
{
a
1
,
a
2
,
…
,
a
V
}
\{a^1,a^2,\dots,a^V\}
{a1,a2,…,aV},令
D
~
v
\tilde D^v
D~v表示
D
~
\tilde D
D~中在属性a上取值为
a
v
a^v
av的样本子集,令
D
~
k
\tilde D_k
D~k表示
D
~
\tilde D
D~中属于第k类
(
k
=
1
,
2
,
…
,
∣
Y
∣
)
(k=1,2,\dots,|Y|)
(k=1,2,…,∣Y∣)的样本子集,显然有
D
~
=
⋃
k
=
1
∣
Y
∣
D
~
k
=
⋃
v
=
1
V
D
~
v
\tilde D=\bigcup_{k=1}^{|Y|}\tilde D_k=\bigcup_{v=1}^{V}\tilde D^v
D~=⋃k=1∣Y∣D~k=⋃v=1VD~v,为每个样本x赋予一个权重
w
x
w_x
wx,并定义
ρ
=
∑
x
∈
D
~
w
x
∑
x
∈
D
w
x
,
p
~
k
=
∑
x
∈
D
~
k
w
x
∑
x
∈
D
~
w
x
(
1
≤
k
≤
∣
Y
∣
)
,
r
~
v
=
∑
x
∈
D
~
v
w
x
∑
x
∈
D
~
w
x
(
1
≤
v
≤
V
)
\rho=\dfrac{\sum_{x\in \tilde D}w_x}{\sum_{x\in D}w_x},\\ \tilde p_k=\dfrac{\sum_{x\in \tilde D_k}w_x}{\sum_{x\in \tilde D}w_x}\quad (1\leq k\leq|Y|),\\ \tilde r_v=\dfrac{\sum_{x\in \tilde D^v}w_x}{\sum_{x\in \tilde D}w_x}\quad (1\leq v\leq V)
ρ=∑x∈Dwx∑x∈D~wx,p~k=∑x∈D~wx∑x∈D~kwx(1≤k≤∣Y∣),r~v=∑x∈D~wx∑x∈D~vwx(1≤v≤V)
ρ
\rho
ρ表示无缺失值样本所占的比例,
p
~
k
\tilde p_k
p~k表示无缺失值样本中第k类所占的比例,
r
~
v
\tilde r_v
r~v表示无缺失值样本中在属性a上取值
a
v
a^v
av的样本所占的比例。显然
∑
k
=
1
∣
Y
∣
p
~
k
=
1
,
∑
v
=
1
V
r
~
v
=
1
\sum_{k=1}^{|Y|}{\tilde p_k=1}, \sum_{v=1}^{V}{\tilde r_v=1}
∑k=1∣Y∣p~k=1,∑v=1Vr~v=1。
信息增益可推广为
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(\tilde D,a)\\ =\rho\times(Ent(\tilde D)-\sum_{v=1}^{V}{\tilde r_vEnt(\tilde D^v)})
Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)−v=1∑Vr~vEnt(D~v))
其中
E
n
t
(
D
~
)
=
−
∑
k
=
1
∣
Y
∣
p
~
k
log
2
p
~
k
Ent(\tilde D)=-\sum_{k=1}^{|Y|}{\tilde p_k\log_2\tilde p_k}
Ent(D~)=−k=1∑∣Y∣p~klog2p~k
在决策树学习开始阶段,根结点中各样本的权重初始化为1。在划分过程中,若样本x在属性a上的取值已知,则将x划入与其取值对应的子结点,且样本权值在子结点中保持为
w
x
w_x
wx;若样本x在属性a上的取值未知(即为缺失值),则将x同时划入所有子结点,且样本权值在与属性值
a
v
a^v
av对应的子结点中调整为
r
~
v
⋅
w
x
\tilde r_v\cdot w_x
r~v⋅wx。直观的看,就是将属性值缺失的样本以不同的概率划入到不同的子结点中去。
把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本对应了d维空间中的一个数据点,对样本分类即为在坐标空间中寻找不同类样本之间的分类边界,这些分类边界由若干个与坐标轴平行的分段组成。
平行分段划分时间开销大,若使用斜的划分边界可以大大简化。
此时非叶结点不再仅对某个属性,而是对属性的线性组合进行测试。如下图
sklearn中关于实现决策树的类是sklearn.tree.DecisionTreeClassifier,官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
下面是该类各参数、属性和方法的介绍,基本翻译自官方文档:
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=0.0000001, class_weight=None, presort=False)
注意:由于在划分的时候特征是随机排列的,因此尽管数据集相同,每次得到的最优划分属性也不一定相同,为了避免这种情况,random_state必须固定。
本例所用数据集为sklearn自带的iris(鸢尾花卉)数据集。
该数据集共150个样本,包含4个特征分别为Sepal Length(花萼长度)、Sepal Width(花萼宽度)、Petal Length(花瓣长度)、Petal Width(花瓣宽度),共分为3类分别为Setosa(山鸢尾)、Versicolour(变色鸢尾)、Virginica(维吉尼亚鸢尾)。数据样例如下
sklearn 的 DecisionTreeClassifier 仅提供了预剪枝,所以本例采取了网格搜索法确定最佳的参数(max_depth、min_samples_split、min_samples_leaf)。决策树生成后,还使用了Graphviz绘制了决策树。Graphviz的安装及使用详见 https://www.cnblogs.com/shuodehaoa/p/8667045.html
from sklearn.datasets import load_iris from sklearn import tree from sklearn import model_selection from sklearn.model_selection import GridSearchCV import graphviz # 加载iris数据集 iris = load_iris() # 拆分为训练集和测试集 x_train, x_test, y_train, y_test = model_selection.train_test_split(iris.data, iris.target, test_size=0.25, random_state=1234) # 使用网格搜索法,尝试不同组合(最大深度、分支最小样本量、叶节点最小样本量) # 根据经验,数据量较小时树的最大深度可设置10以内,较大时则需设置比较大的树深度,如20左右 max_depth = [2, 3, 4, 5, 6] min_samples_split = [2, 4, 6, 8] min_samples_leaf = [2, 4, 8, 10, 12] parameters = {'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf} # 网格搜索法,测试不同的参数值 grid_dtcateg = GridSearchCV(estimator=tree.DecisionTreeClassifier(), param_grid=parameters, cv=10) # 模型拟合 grid_dtcateg.fit(x_train, y_train) # 返回最佳参数组合 print('最佳参数组合为:', grid_dtcateg.best_params_) # 构建分类决策树 dt = tree.DecisionTreeClassifier(max_depth=grid_dtcateg.best_params_['max_depth'], min_samples_leaf=grid_dtcateg.best_params_['min_samples_leaf'], min_samples_split=grid_dtcateg.best_params_['min_samples_split'], random_state=1234) # 模型训练 dt.fit(x_train, y_train) # 模型评估 print('模型准确率为:', dt.score(x_test, y_test)) # 绘制决策树 dot_data = tree.export_graphviz(dt, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True) graph = graphviz.Source(dot_data) graph.render('iris')
运行可得最终结果如下
绘制的决策树如下
在网上搜寻了很久,发现很少有讲到最后绘制的这个决策树,各个部分的具体意思是什么。于是博主决定在这里详细的讲解一下。
以根结点为例
下面我们以一个具体的样本来看一下决策树是如何判断其所属类别的。
Sepal Length | Sepal Width | Petal Length | Petal Width |
---|---|---|---|
5.0 | 1.3 | 2.7 | 1.5 |
从根结点开始,划分属性为Petal Length,样本的Petal Length为2.7>2.6,因此流入右分支;第二层划分属性为Petal Width,样本的Petal Width为1.5<1.65,因此流入左分支;第三层划分属性为Petal Length,样本的Petal Length为2.7<4.95,因此流入左分支;第四层就是叶结点了,刚才流入的左分支,因此最终的分类就是Versicolour。
参考文献:
[1]周志华.《机器学习》.清华大学出版社,2016-1
[2]https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。