[机器学习] - 树模型 [决策树,随机森林]

决策树

树模型是单独于线性模型(线性回归,逻辑回归)的一种可以用分类和回归问题的模型。 树模型在每一层,都会遇到一个结点进行判断,根据某一特征划分到一个子结点中;然后在进行下一层的判断,直到进入叶子节点。 根据叶子节点中的训练集的标签或者数值(根据问题类型:回归问题/分类问题),得到该样本的类别或者数值。

决策树模型的优势在于:

  1. 可解释性强,可以根据决策时每一层的结点 得到 特征值的重要性排序。结点越靠上,特征值越重要。
  2. 模型计算简单,计算量小。
  3. 数据不需要预处理,不用归一化,可以处理缺省值
  4. 对于离散值,连续值都可以计算。
  5. 对于异常点的容错性较高
  6. 决策树可以合并使用,实现更好的效果。

缺点:
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=1ypklog2pk
在未选择特征进行判断前,我们可以得到样本本身的纯度(信息熵)。 然后我们选择每一个特征,都分别作为特征进行划分,得到多个子结点,我们对子结点的纯度再次进行计算。这样子我们就得到了 根据每个特征进行划分后的纯度。 我们使用划分之前的纯度-划分以后的纯度 来表示 不同特征下的 纯度提升。 将该数值称为信息增益
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=1VDDvEnt(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=1VDDvlogDDv
IV(a)是每个属性的固有值。在这种情况下 信息增益率会选择 可取值较少的属性作为偏好。因此,一般来说,先选择 信息增益高于平均水平的属性,然后从中选择信息增益率最高的 作为特征。

注意: 上述的两种方法都只能用于分类问题。 对测试集进行测试时,分到叶子节点之后,将测试集样本中数量最多的标签 标记为测试样本的标签。 而以下说明的CART树 可以进行 分类问题,也可以进行 回归问题。

CART (Classification And Regression Tree)

之前的树模型在面对 标签时 都是一分多; 但是在CART中则是 一分二。 每次都只分成二叉树。 如果需要还需要分类的话则再次 在此属性中进行分类。 也就是说如果属性中有N个标签,分成两类(不能为空集),有 2 N − 2 2^N-2 2N2种分法。
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)=1k=1ypk2
而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} ρ=xDwxxD^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^=xD^wxxDk^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^=xD^wxxDv^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=1Vr^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=1yp^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的 “样本扰动”, 也有“属性扰动”。

结合策略

优势:

  1. 学习任务的假设空间很大,存在多个假设 在 训练集上都能达到相同的性能; 使用单学习器会提升泛化能力。
  2. 学习算法会陷入局部最优,难以表示全局最优。
  3. 当有些学习任务的真实假设不在当前的表示空间内,使用单学习器会无效;结合多个学习器则一定程度上拓展 表示空间,会更加逼近真实假设, 会有更好的效果。

数值类输出 一般采用 平均法 (简单平均,加权平均)。 对于性能差异较大的基学习器,可以使用加权平均;否则使用简单平均。

对于分类任务,一般采用 投票法: 绝对多数投票法(某标记得票超过一半,则预测为该标记,否则拒绝预测),多数投票(“少数服从多数”)
其中投票又分为 类标记(输出结果为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(hix)=(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^(hx)=i=1TwiA(h1x)=i=1Twi[hi(x)H(x)]2
另外,我们定义 每个“个体学习器”在样本 x x x上的误差 E ( h i ∣ x ) E(h_i|x) E(hix)和 集成的误差 E ( H ∣ x ) E(H|x) E(Hx)
E ( h i ∣ x ) = [ h i ( x ) − f ( x ) ] 2 E(h_i|x)=[h_i(x)-f(x)]^2 E(hix)=[hi(x)f(x)]2
E ( H ∣ x ) = [ H ( x ) − f ( x ) ] 2 E(H|x)=[H(x)-f(x)]^2 E(Hx)=[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^(hx)=i=1TwiE(hix) 表示个体学习器误差的加权平均值,则有:
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^(hx)=i=1TwiE(hix)E(Hx)=E^(hx)E(Hx)
我们将该式在所有样本上进行叠加:
∑ 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=1TwiA(hix)p(x)dx=i=1TwiE(hix)p(x)dxE(Hx)p(x)dx
最终我们可以得到
E = E ^ − A ^ E=\hat{E}-\hat{A} E=E^A^
我们可以知道, 个体学习器性能越好,多样性越大,集成学习器效果越好。

多样性增强

为了提升 “个体学习器”的多样性, 我们通常的做法是 对数据样本,输入属性,输出表示,算法参数 进行扰动。

  1. 数据样本扰动: bagging和RF中的自助采样。 但是这种方法只针对于 “不稳定基学习器”,如 决策树,神经网络。 对于“稳定学习器”,SVM,LR,素朴贝叶斯,K临近学习器等 用处不大。
  2. 输入属性扰动: 对于冗余属性比较多的情况(冗余属性比较少,属性比较少,则不适用), 随机选择一定的属性子集,然后基于属性子集设置训练器。
  3. 算法参数扰动: 使用不同的模型参数得到不同的网络,然后集成。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值