决策树
- 决策树是一种常见的机器学习的方法,其核心思想是相同(或相似)的输入产生相同(或相似)的输出,通过树状结构来进行决策,其目的是通过对样本的不同的属性的判断决策,将有共同属性的样本划分到一个叶子节点下,从而实现分类或回归。
- 决策树是一种常用的有监督算法,之所以名字中带有“树”,因为其算法的实现过程类似于一棵树的生长过程,它从根部(根节点)开始,逐步到进行分支(内部节点),最终到一片片末端的树叶(叶节点)。决策树中,所有的训练样本构成了根节点,每个内部节点对应一个特征(属性)测试,用来区分不同标签 的样本,经过特征测试后,这个节点包含的所有样本根据特征测试的结果划分到下一层的子节点中,层层细化,最终形成若干个叶子节点,即最终的分类结果。
根节点是我们所有的贷款申请人样本,我们首先使用“是否拥有房产”这个特征把所有申请人区别成两类,如果申请人在“拥有房产”这个特征上的结果为“是”,则直接划分到叶节点中,认为他可以偿还:如果申请人在“拥有房产”这个特征测试上的结果为否,则继续进行其他的特征测试,知道最后分配到某个叶节点中。
- 一旦构造了决策树,对新样本进行分类就很容易,具体做法是,从树 的根节点开始,测试新样本中相应的特征,根据结果选择恰当的分枝路线,沿着该路线到达最终的叶节点后,就得到了该样本的分类结果。
- 决策树的算法有很多类型,最大的差别就是最优特征选择的方法不同。最优特征指的是,在每个结点处,如何选择最好的特征(属性)对样本进行分类,这里最佳的意义就是经过这个特征的划分,能使分类精度最好,直到这棵树能够精确分类所有训练样本。
- 通常特征选择的方法有信息增益(ID3算法),增益率(C4.5算法),基尼系数(CART算法)。
决策树的结构
- 一般来说,一棵决策树包含一个根节点、若干个内部节点和若干个叶子节点. 叶子节点对应最终的决策结果,其它每个节点则对应与一个属性的测试. 最终划分到同一个叶子节点上的样本,具有相同的决策属性,可以对这些样本的值求平均值来实现回归,对这些样本进行投票(选取样本数量最多的类别)实现分类.
构建决策树
决策树的构建,就是不断选取好的特征作为决策节点,构建一颗泛化能力较强的树结构
- 训练集里面的x表示样本的属性,y表示属性的标签
决策树的构建是一个递归的过程,核心是以下两个问题: - 如何选取特征. 决策树构建的每一步,应该挑选最优的特征,进行决策对数据集划分效果最好;
- 决定何时停止分裂子节点.
如何选择特征呢?
先说下熵:熵(entropy):用来表示物体内部的混乱程度。一个物体内部构成越纯,熵越小;越混乱,熵越大。在机器学习中,表示随机变量分布的混乱程度。
① 信息熵:信息熵(information entropy)是度量样本集合纯度的常用指标,该值越大,表示该集合纯度越低(或越混乱),该值越小,表示该集合纯度越高(或越有序),定义如下:公式
H
=
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
2
P
(
x
i
)
H = -\sum_{i=1}^{n}{P(x_i)log_2P(x_i)}
H=−i=1∑nP(xi)log2P(xi)
其中,
P
(
x
i
)
P(x_i)
P(xi)表示集合中第i类样本所占比例,当
P
(
x
i
)
P(x_i)
P(xi)为1时(只有一个类别,比例为100%),
l
o
g
2
P
(
x
i
)
log_2P(x_i)
log2P(xi)的值为0,整个系统信息熵为0;当类别越多,则
P
(
x
i
)
P(x_i)
P(xi)的值越接近于0,
l
o
g
2
P
(
x
i
)
log_2P(x_i)
log2P(xi)趋近去负无穷大,整个系统信息熵就越大.
② 信息增益
决策树根据属性进行判断,将具有相同属性的样本划分到相同节点下,此时,样本比划分之前更加有序(混乱程度降低),信息熵的值有所降低。用划分前的信息熵减去划分后的信息熵,就是决策树获得的信息增益。可以用以下表达式表示:在D的数据集上,根据属性a进行划分,划分前的信息熵减去划分后的信息熵
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)
其中,D表示样本集合,a表示属性,v表示属性可能的取值
v
1
,
v
2
,
.
.
.
,
v
n
{v^1, v^2,...,v^n}
v1,v2,...,vn,
∣
D
v
∣
∣
D
∣
\frac{|D^v|}{|D|}
∣D∣∣Dv∣表示权重,样本越多的分支对分类结果影响更大,赋予更高的权重,
G
a
i
n
(
D
,
a
)
Gain(D, a)
Gain(D,a)表示在样本集合D上使用属性a来划分子节点所获得的信息增益.
- 香蕉占2/5,所以 P 1 = 0.4 P_1=0.4 P1=0.4;梨占1/5,所以 P 2 = 0.2 P_2 = 0.2 P2=0.2;黄瓜占1/5,所以 P 3 = 0.4 P_3 = 0.4 P3=0.4
- 根节点信息熵: − ( 0.4 ∗ l o g 2 0.4 + 0.2 ∗ l o g 2 0.2 + 0.4 ∗ l o g 2 0.4 ) ≈ 1.522 -(0.4 * log_2 0.4 + 0.2 * log_2 0.2 + 0.4 * log_2 0.4) \approx 1.522 −(0.4∗log20.4+0.2∗log20.2+0.4∗log20.4)≈1.522
- 根据颜色划分后:黄色分支信息熵 − ( 2 3 ∗ l o g 2 2 3 + 1 3 ∗ l o g 2 1 3 ) ≈ 0.918 -(\frac{2}{3} * log_2 \frac{2}{3} + \frac{1}{3} * log_2 \frac{1}{3}) \approx 0.918 −(32∗log232+31∗log231)≈0.918;绿色分支信息熵 − ( 1.0 ∗ l o g 2 1.0 ) = 0 -(1.0 * log_2 1.0) = 0 −(1.0∗log21.0)=0;整个第二层信息熵为 0.6 ∗ 0.918 + 0.4 ∗ 0 ≈ 0.55 0.6 * 0.918 + 0.4 * 0 \approx 0.55 0.6∗0.918+0.4∗0≈0.55
- 根据颜色划分后的信息增益: 1.522 − 0.55 ≈ 0.97 1.522 - 0.55 \approx 0.97 1.522−0.55≈0.97
- 以上可知,经过对样本按颜色进行类别划分,划分后的信息熵比原来下降了,下降的值就是信息增益。一般来说,信息增益越大,以该属性划分所获得的“纯度提升”越大. 著名的 ID3 决策树学习算法就是以信息增益为准则来划分属性.
③ 增益率
增益率不直接采用信息增益,而采用信息增益与熵值的比率来作为衡量特征优劣的标准. C4.5算法就是使用增益率作为标准来划分属性. 增益率定义为:
信息增益除以划分前的信息熵
G
a
i
n
_
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
Gain\_ratio(D, a) = \frac{Gain(D, a)}{IV(a)}
Gain_ratio(D,a)=IV(a)Gain(D,a)
其中
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|}
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
④ 基尼系数
基尼系数定义为:
G
i
n
i
(
p
)
=
∑
k
=
1
k
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
k
p
k
2
Gini(p) = \sum_{k=1}^{k} p_k (1-p_k) = 1 - \sum_{k=1}^{k} p_k^2
Gini(p)=k=1∑kpk(1−pk)=1−k=1∑kpk2
公式解析: p k p_k pk就是第k个类别的概率×不是这个类别的概率,将这k个概率相加
直观来说,基尼系数反映了从数据集D中随机抽取两个样本,类别标记不一致的概率. 因此,基尼系数越小,数据集的纯度越高.你想,如果抽取出来的两个样本一半一半,那么它的基尼系数肯定比任何情况都大。 CART决策树(Classification And Regression Tree)使用基尼系数来选择划分属性,选择属性时,选择划分后基尼值最小的属性作为最优属性. 采用和上式相同的符号表示,数据集D下属性a的基尼系数定义为:
∣
D
∣
|D|
∣D∣ 和
∣
D
V
∣
|D_V|
∣DV∣ 表示集合中元素的个数
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)
Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
3)如何停止分裂
以下几种情况会停止决策树子节点的构建:
- 当前节点所有样本属于同一个类别,无需划分
- 当前属性集为空,或者所有样本取值相同,无法划分
- 当前节点包含的样本集合为空,不能划分
- 当前节点样本数量少于指定数量
决策树实现
# 模型
model = st.DecisionTreeRegressor(max_depth=4) # 决策树回归器
# 训练
model.fit(train_x, train_y)
# 预测
pre_test_y = model.predict(test_x)
- 特征重要性
作为决策树模型训练过程中的副产品,根据每个特征划分子表前后信息熵减少量就标志了该特征的重要程度,此即为该特征重要性的指标。训练后得到的模型对象提供了属性feature_importances_来存储每个特征的重要性。在工程应用上,可以对决策树做一些优化,不必让每一个特征都参与子表划分,而只选择其中较重要的(或者说影响因素较大的)的特征作为子表划分依据。特征重要性的评价指标,就是根据该特征划分子表后所带来的信息熵减少量,熵减越大的就越重要,也就越优先参与子表的划分。
决策树的剪枝
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段. 在决策树学习中,为了尽可能正确分类训练样本,节点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学的“太好了”,以至于把训练集本身的一些特点当做数据所具有的一般性质而导致过拟合. 因此,可通过主动去掉一些分支来降低过拟合风险.
(1)预剪枝. 决策树生成过程中,对每个节点在划分前进行评估,若当前节点不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶子节点.
(2)后剪枝. 先训练为一颗完整的决策树,然后自低向上对非叶子节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化能力提升,则将该子树替换为叶节点.