文章目录
决策树
树模型是单独于线性模型(线性回归,逻辑回归)的一种可以用分类和回归问题的模型。 树模型在每一层,都会遇到一个结点进行判断,根据某一特征划分到一个子结点中;然后在进行下一层的判断,直到进入叶子节点。 根据叶子节点中的训练集的标签或者数值(根据问题类型:回归问题/分类问题),得到该样本的类别或者数值。
决策树模型的优势在于:
- 可解释性强,可以根据决策时每一层的结点 得到 特征值的重要性排序。结点越靠上,特征值越重要。
- 模型计算简单,计算量小。
- 数据不需要预处理,不用归一化,可以处理缺省值
- 对于离散值,连续值都可以计算。
- 对于异常点的容错性较高
- 决策树可以合并使用,实现更好的效果。
缺点:
1… 除了多变量决策树以外,决策树每次都是根据一个特征进行决策。实际上根据多个特征进行决策,效果会更好。
2. 决策树容易造成过拟合,需要人为设置结束指标。
3. 寻找最后的决策树是一个NP问题,采用启发式算法容易进入局部最优,需要集成学习进行改善。
我们从根结点开始,选择一个特征和划分方式(后续会详细说明),将数据划分成多个部分,形成子结点。然后每一部分的数据再选择其他的特征(对于连续/离散数值的特征,之前作为结点,后续仍然可以作为结点;而每个标签特征则只能作为一次结点),直到达到终止条件。
(没有人为限制的)终止条件:1. 当前结点中所有样本都属于同一个类别(
y
y
y相同)2. 结点中所有样本的属性 数值都相同,无法再进行划分。
实际上,我们在使用决策树模型时,会设置一些额外的生成条件: 每个节点的样本最小数量 ; 树的最大深度; 叶子节点的总数 等等。 这是为了避免对样本数据进行过拟合,对样本中的局部特征进行过分利用,最终导致在测试集效果不好。(后续会将预剪枝和后剪枝,也是为了避免树过于复杂。)
因此,决策树的核心就是 每个结点选择什么特征,以及如何根据该特征进行划分子结点。
ID3 决策树生成
每个结点分类后的最完美的结果就是 每个单独的子结点中 标签/数值 全都一致, 最差的结果就是 标签/数值 各种结果平均分布。 我们提出了 纯度(信息熵)来表示 每个结点的当前效果:
E
n
t
(
D
)
=
−
∑
k
=
1
∣
y
∣
p
k
l
o
g
2
p
k
Ent(D)=-\sum_{k=1}^{|y|}p_k log_2 p_k
Ent(D)=−k=1∑∣y∣pklog2pk
在未选择特征进行判断前,我们可以得到样本本身的纯度(信息熵)。 然后我们选择每一个特征,都分别作为特征进行划分,得到多个子结点,我们对子结点的纯度再次进行计算。这样子我们就得到了 根据每个特征进行划分后的纯度。 我们使用划分之前的纯度-划分以后的纯度 来表示 不同特征下的 纯度提升。 将该数值称为信息增益。
G
a
i
n
(
D
,
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D,a)=-\sum_{v=1}^V \frac{|D^v|}{|D|}Ent(D^v)
Gain(D,a)=−v=1∑V∣D∣∣Dv∣Ent(Dv)
式子中,
D
v
D^v
Dv表示划分后的每个结点的信息熵。 注意:此处计算信息熵是根据子结点含有的样本数量的加权平均。
这样子,我们就可以得到不同的特征 { a 1 , a 2 , … } \{a_1,a_2,\dots\} {a1,a2,…}对应的信息增益 G a i n ( D , a i ) Gain(D,a_i) Gain(D,ai),我们可以看哪组信息增益最大,就作为该节点的判断特征。
划分方式
对于 标签 比如:“红”,“黄”,“蓝”。 我们将含有相同标签的作为一类。
对于 连续数值 / 离散数值 的属性, 我们采用二分。 将数值进行排序,得到
x
1
,
x
2
,
x
3
,
…
x_1,x_2,x_3,\dots
x1,x2,x3,…,我们选择
x
1
+
x
2
2
,
x
2
+
x
3
2
\frac{x_1+x_2}{2},\frac{x_2+x_3}{2}
2x1+x2,2x2+x3作为划分点。 如果数值中存在相同数值,则不将其作为划分点。 因此对于连续数值,我们要计算 不同划分点下的 信息增益,得到信息增益最大的,作为该属性的划分点和信息增益。
C4.5 模型
上述使用信息增益可能会会出现一个问题。 如果某属性的标签数量很多,极端情况下 所有样本的该属性都不相同。 选用此属性进行分类之后 信息熵为0,得到的信息增益最大。 但是实际上这样的分类是无效的。 实际上,如果根据某特征分类得到的结点越多,信息增益越大,因此为了避免这种情况,提出了 增益率。
G
a
i
n
R
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
)
I
V
(
a
)
Gain \ Ratio(D,a)=\frac{Gain(D)}{IV(a)}
Gain Ratio(D,a)=IV(a)Gain(D)
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
∣
D
v
∣
∣
D
∣
IV(a)=-\sum_{v=1}^V \frac{|D^v|}{|D|}log \frac{|D^v|}{|D|}
IV(a)=−v=1∑V∣D∣∣Dv∣log∣D∣∣Dv∣
IV(a)是每个属性的固有值。在这种情况下 信息增益率会选择 可取值较少的属性作为偏好。因此,一般来说,先选择 信息增益高于平均水平的属性,然后从中选择信息增益率最高的 作为特征。
注意: 上述的两种方法都只能用于分类问题。 对测试集进行测试时,分到叶子节点之后,将测试集样本中数量最多的标签 标记为测试样本的标签。 而以下说明的CART树 可以进行 分类问题,也可以进行 回归问题。
CART (Classification And Regression Tree)
之前的树模型在面对 标签时 都是一分多; 但是在CART中则是 一分二。 每次都只分成二叉树。 如果需要还需要分类的话则再次 在此属性中进行分类。 也就是说如果属性中有N个标签,分成两类(不能为空集),有
2
N
−
2
2^N-2
2N−2种分法。
CART在 分类模型中使用的是 基尼系数
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
Gini(D)=1-\sum_{k=1}^{|y|}p_k^2
Gini(D)=1−∑k=1∣y∣pk2
而CART 在回归模型中使用的则是 MSE误差或者MAE误差。
剪枝
预剪枝
预剪枝主要是在创建树的过程当中使用。
我们为了查看 在进行某步划分时 是否会造成过拟合,需要设置一个 验证集。 在计算指标的时候不使用,但是在形成树后会计算 创建新结点前后的预测准确率。 如果更准确,则该结点 分叉成功;如果准确率下降,或者没有变化,则不进行分叉。
注意: 我们在进行预剪枝操作时,实际上只考虑了当前一个属性的优劣。有可能在此基础上使用其他特征之后 效果会有明显上升。 因此存在贪心的成分,会影响结果。
后剪枝
后剪枝在创建树之后对树进行修剪:
如果去掉某枝,验证机准确率会上升,则进行修剪;如果不上升,则进行保留。
后剪枝的欠拟合风险比较小,从下到上对于所有的结点都会进行判断,计算成本较高。
缺省值处理
有时 数据中会出现 部分信息缺失的情况,不同属性会出现不同的缺失状况。如果只使用完整的样本,对数据会是一种极大的浪费。
ρ
=
∑
x
∈
D
^
w
x
∑
x
∈
D
w
x
\rho=\frac{\sum_{x \in \hat{D}} w_x}{ \sum_{x \in D} w_x}
ρ=∑x∈Dwx∑x∈D^wx
表示了 未缺省的数据 在总数居中的比例。
p
k
^
=
∑
x
∈
D
k
^
w
x
∑
x
∈
D
^
w
x
(
1
<
k
<
∣
y
∣
)
\hat{p_k}=\frac{ \sum_{x \in \hat{D_k}} w_x }{ \sum_{x\in \hat{D}}w_x } (1<k<|y|)
pk^=∑x∈D^wx∑x∈Dk^wx(1<k<∣y∣)
p
k
^
\hat{p_k}
pk^表示 标签为k的 样本在 未缺省的数据中的比例。
r
v
^
=
∑
x
∈
D
v
^
w
x
∑
x
∈
D
^
w
x
(
1
<
v
<
V
)
\hat{r_v}=\frac{ \sum_{x\in \hat{D^v}} w_x }{ \sum_{x \in \hat{D}}w_x} (1<v<V)
rv^=∑x∈D^wx∑x∈Dv^wx(1<v<V)
r
v
^
\hat{r_v}
rv^表示 该属性值为
v
v
v的未缺省样本数量 在未缺省的数据中的比例。
每一个特征的到的增益率为
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(\hat{D},a)= \rho \times \{ Ent(\hat{D}) - \sum_{v=1}^{V} \hat{r}_v Ent(\hat{D^v}) \}
Gain(D,a)=ρ×Gain(D^,a)=ρ×{Ent(D^)−v=1∑Vr^vEnt(Dv^)}
E
n
t
(
D
^
)
=
−
∑
k
=
1
∣
y
∣
p
^
k
l
o
g
2
p
^
k
Ent(\hat{D})=-\sum_{k=1}^{|y|} \hat{p}_k log_2 \ \hat{p}_k
Ent(D^)=−k=1∑∣y∣p^klog2 p^k
在使用缺省值进行训练时, 如果该属性出现了缺省,则将该样本划分到所有的子结点中,将该样本的权重 w k w_k wk 分别修改为 r ^ v w k \hat{r}_v w_k r^vwk。
集成算法
将多个学习器结合在一起,使得结果比单个学习器的效果都好。(三个臭皮匠,顶个诸葛亮。)
一般“个体的学习器”都相同,都采用弱学习器,这种“个体学习器”被称为“基学习器”,这种集成算法被称为 “同质”。 如果“个体学习器”不相同,这种集成方法被称为“异质”。
集成学习的结果是通过投票法: “少数服从多数”。
为了获得好的集成,个体学习器应该“好而不同”: 不同的学习器在不同的情况下有较好的效果 (学习器不能太坏,有多样性。)
因此,生成 “好而不同”的个体学习器,是集成学习的核心。
集成学习分成两种: 一种是 个体学习器之间存在强相关,采用串行的方式生成,比如 提升算法。 另外一种就是 个体学习器之间不存在强依赖关系,独立性较强,采用并行方式生成,比如 bagging算法, 随机森林。
Bagging与随机森林
虽然无法得到 独立的基学习器,但是可以使基学习器之间存在较大的差异。对于一个训练集,我们在训练样本中采样,生成多个不同的子集,根据不同子集就可以生成不同的基学习器。但是基学习器对应的样本集不能过小,不然每个基学习器学习到的样本数量很少,学习能力不足。 因为,一般考虑 互有交叠的采样子集。
bagging
基于自助采样法: 我们在包含m个样本的数据集,随机选择一个样本,然后再将样本放回到数据集中,下次采样仍从 含有m个样本的数据集中采样。一直生成m个样本。此时的m个样本中会用重复的样本,大概会有63.2%的初始样本在采样集中。
根据这种方式,我们 可以采样出T个 训练样本。 我们根据每个训练样本 训练出 基学习器,然后再用 “少数服从多数”的原理,将这些基学习器进行结合。
因为自助采样过程中 会存在一些 初始样本中的数据,不在训练样本中,这些数据可以作为验证集来对 每个基学习器的泛化能力进行 “包外估计”。
一方面: 我们在创建基学习器的过程中 可以使用包外样本进行调参/生成树(预剪枝/后剪枝)。
另一方面,可以使用包外样本对学习器进行预测和误差估计。
Bagging算法 主要关注于 降低方差, 因此在 不剪枝决策树,神经网络等易受样本扰动的学习器上效果显著。
随机森林
随机森林是bagging的一个拓展变体,是在以决策树为基学习器构建Bagging集成的基础上,在决策树的训练过程中引入了 随机属性选择。
RF中, 对于基决策树的每个结点,会先从该结点的属性集合中随机选择 包含k个属性的子集,然后从子集中选择最优属性。
随机森林既有 bagging的 “样本扰动”, 也有“属性扰动”。
结合策略
优势:
- 学习任务的假设空间很大,存在多个假设 在 训练集上都能达到相同的性能; 使用单学习器会提升泛化能力。
- 学习算法会陷入局部最优,难以表示全局最优。
- 当有些学习任务的真实假设不在当前的表示空间内,使用单学习器会无效;结合多个学习器则一定程度上拓展 表示空间,会更加逼近真实假设, 会有更好的效果。
数值类输出 一般采用 平均法 (简单平均,加权平均)。 对于性能差异较大的基学习器,可以使用加权平均;否则使用简单平均。
对于分类任务,一般采用 投票法: 绝对多数投票法(某标记得票超过一半,则预测为该标记,否则拒绝预测),多数投票(“少数服从多数”)
其中投票又分为 类标记(输出结果为0/1),类概率(分到某类的概率,软投票)。
不同的投票类型不能混用。 有时可以将类标记转化为类概率(在有置信度的情况下),也可以将类概率转化为类标记。
另外还有学习法:stacking,将一个“个体学习器”学习到的输出 作为输入传入另一个“个体学习器”。 【初级学习器和次级学习器】
需要注意的是:次级学习器是初级学习器产生的,若是直接使用初级学习器的训练集生成 次级训练集,容易产生过拟合。因此一般使用交叉验证的方式,使用 初级训练器未使用的样本产生次级学习器的训练样本。
多样性分析
误差-分歧 分解
对于每一个“个体学习器”
h
i
(
x
)
h_i(x)
hi(x),我们有 集成
H
,我们定义每一个“个体学习器”对于集成在样本
H, 我们定义每一个“个体学习器”对于集成在样本
H,我们定义每一个“个体学习器”对于集成在样本x$的分歧:
A
(
h
i
∣
x
)
=
(
h
i
(
x
)
−
H
(
x
)
)
2
A(h_i|x)=( h_i(x)-H(x) )^2
A(hi∣x)=(hi(x)−H(x))2
则集成的“分歧”是:
A
^
(
h
∣
x
)
=
∑
i
=
1
T
w
i
A
(
h
1
∣
x
)
=
∑
i
=
1
T
w
i
[
h
i
(
x
)
−
H
(
x
)
]
2
\hat{A}(h|x)=\sum_{i=1}^T w_iA(h_1|x)=\sum_{i=1}^T w_i[h_i(x)-H(x) ]^2
A^(h∣x)=i=1∑TwiA(h1∣x)=i=1∑Twi[hi(x)−H(x)]2
另外,我们定义 每个“个体学习器”在样本
x
x
x上的误差
E
(
h
i
∣
x
)
E(h_i|x)
E(hi∣x)和 集成的误差
E
(
H
∣
x
)
E(H|x)
E(H∣x)
E
(
h
i
∣
x
)
=
[
h
i
(
x
)
−
f
(
x
)
]
2
E(h_i|x)=[h_i(x)-f(x)]^2
E(hi∣x)=[hi(x)−f(x)]2
E
(
H
∣
x
)
=
[
H
(
x
)
−
f
(
x
)
]
2
E(H|x)=[H(x)-f(x)]^2
E(H∣x)=[H(x)−f(x)]2
我们令
E
^
(
h
∣
x
)
=
∑
i
=
1
T
w
i
E
(
h
i
∣
x
)
\hat{E}(h|x)=\sum_{i=1}^T w_i E(h_i|x)
E^(h∣x)=∑i=1TwiE(hi∣x) 表示个体学习器误差的加权平均值,则有:
A
^
(
h
∣
x
)
=
∑
i
=
1
T
w
i
E
(
h
i
∣
x
)
−
E
(
H
∣
x
)
=
E
^
(
h
∣
x
)
−
E
(
H
∣
x
)
\hat{A}(h|x)=\sum_{i=1}^T w_i E(h_i|x)-E(H|x)=\hat{E}(h|x)-E(H|x)
A^(h∣x)=i=1∑TwiE(hi∣x)−E(H∣x)=E^(h∣x)−E(H∣x)
我们将该式在所有样本上进行叠加:
∑
i
=
1
T
w
i
∫
A
(
h
i
∣
x
)
p
(
x
)
d
x
=
∑
i
=
1
T
w
i
∫
E
(
h
i
∣
x
)
p
(
x
)
d
x
−
∫
E
(
H
∣
x
)
p
(
x
)
d
x
\sum_{i=1}^T w_i \int A(h_i|x)p(x) dx = \sum_{i=1}^T w_i \int E(h_i|x)p(x)dx - \int E(H|x)p(x) dx
i=1∑Twi∫A(hi∣x)p(x)dx=i=1∑Twi∫E(hi∣x)p(x)dx−∫E(H∣x)p(x)dx
最终我们可以得到
E
=
E
^
−
A
^
E=\hat{E}-\hat{A}
E=E^−A^
我们可以知道, 个体学习器性能越好,多样性越大,集成学习器效果越好。
多样性增强
为了提升 “个体学习器”的多样性, 我们通常的做法是 对数据样本,输入属性,输出表示,算法参数 进行扰动。
- 数据样本扰动: bagging和RF中的自助采样。 但是这种方法只针对于 “不稳定基学习器”,如 决策树,神经网络。 对于“稳定学习器”,SVM,LR,素朴贝叶斯,K临近学习器等 用处不大。
- 输入属性扰动: 对于冗余属性比较多的情况(冗余属性比较少,属性比较少,则不适用), 随机选择一定的属性子集,然后基于属性子集设置训练器。
- 算法参数扰动: 使用不同的模型参数得到不同的网络,然后集成。