zoukankan      html  css  js  c++  java
  • 【机器学习】树模型

    机器学习之树模型

    大纲

    • 决策树和回归树模型:ID3, C4.5,CART
    • AdaBoost框架
    • 提升树:梯度提升树

    决策树

    决策树模型可以看做是if-else指令集合,通过对特征空间的划分来完成分类或者回归任务。以下图中的分类任务为例,假设数据集包含了:

    • 三个类别:黄色、蓝色、绿色
    • 两个维度的特征空间:(x_1, x_2)

    根据if-else规则很容易将特征空间划分为三个区域:(R_1, R_2, R_3),对应的决策树如右图所示。也可以先对(x_1)进行划分,但是可以证明,先对(x_1)进行划分得到的决策树会比示例中的更加复杂,将会产生4个叶子节点,特征空间也会被划分的更加零碎。

    特征的划分

    从上一部分的示例中可以看出,在决策树的构建中,选取特征维度的何种序列进行划分,都能实现最终的任务。但是如果顺序选取的不合理,得到的决策树的复杂程度会有很大的差异。

    一个好的划分维度应该是能够将数据分的足够开,这包含了两个方面:类内差距足够小、类间差距足够大。从示例中可以看出,如果先用(x_2)进行划分,绿色类完全被分开,如果先用(x_1)进行划分则达不到这种效果。

    类内差距小与类内的混乱程度是一致的。衡量混乱程度的指标有很多,比如信息熵、基尼系数、均方误差、方差等。前两个指标通常用在分类任务中,ID3和C4.5采用了信息熵;后两个指标在本质上是一样的,通常用在回归任务中,CART树在分类时采用了基尼系数,在回归任务中采用了均方误差。各类指标的表达式如下:

    • 信息熵

      [H(X) = -sum_{i=1}^N p(x_i)log p(x_i) ]

    • 基尼系数

      [Gini(X) = sum_{i=1}^N p(x_i)(1 - p(x_i)) ]

    • 均方误差

      [MSE(X) = sum_{i=1}^N left(x_i - ar{X} ight)^2 ]

    • 方差

      [Var(X) = frac{1}{N}sum_{i=1}^N left(x_i - ar{X} ight)^2 ]

    在选取划分特征中,是通过比较划分前后数据的混乱程度实现。假设对于分类任务:

    • 数据集:(D),共包含(K)个类别:(C_1, C_2, ..., C_K)
    • 离散特征(A)(D)划分(n)个部分:(D_1, D_2, ..., D_n),划分后的(D_i)中包含各个类别的集合为:(C_{i1}, C_{i2}, ..., C_{iK})

    划分前后的信息熵分别记为:(H(D), H(D|A))

    [H(D) = -sum_{k=1}^K frac{|C_k|}{|D|}logfrac{|C_k|}{|D|}\ H(D|A) = -sum_{i=1}^n frac{|D_i|}{|D|} sum_{k=1}^{K}frac{|C_{ik}|}{|D_i|}logfrac{|C_{ik}|}{|D_i|} ]

    计算信息增益

    [g(D, A) = H(D)-H(D|A) ]

    因此最优的划分特征为

    [A^star = argmax_{gin Dom(A)} g(D, A) ]

    其中Dom(A)表示特征域

    对于回归任务:

    • 数据集:((X,y)in R^{n+1})

    • 连续特征(j)从切分点(s)(D)划分为两个部分:(R_1(j, s) = {x|x^{(j)}< s}, R_2(j,s) = {x|x^{(j)}geq s})

    选取切分特征时,遍历维度(j),扫描切分点(s)求解下式:

    [min _{j, s}left[min _{c_{1}} sum_{x_{i} in R_{1}(j, s)}left(y_{i}-c_{1} ight)^{2}+min _{c_{2}} sum_{x_{i} in R_{2}(j, s)}left(y_{i}-c_{2} ight)^{2} ight] ]

    决策树的构建

    ID3

    回归树

    AdaBoost框架

    理论基础

    AdaBoost的基本思想是通过融合一些弱分类器来提升模型性能。PAC理论证明了一个问题是强可学习的充分必要条件是弱可学习,因此通过结合一些弱学习器来实现强可学习的想法自然而然的诞生。AdaBoost可以认为是不同的学习器侧重学习不同特征,下一个学习器着重学习之前的学习器没有学到的部分,从而实现从数据中抽象出更多的特征。

    基本构成

    AdaBoost框架一般包含如下的部分:

    • 基学习器:(h(x; heta)),基学习器一般是弱学习器,弱学习器可易理解为学习效果稍微好于随机猜测

    • 融合策略:(H(x) = sum_limits{i=1}^m alpha_ih(x; heta_i))

    • 损失函数(二分类问题):(mathcal{L}_{exp}(y, f(x) = exp(-yf(x)))

    学习策略

    AdaBoost的学习过程包括三个部分:

    • 基学习器计算
    • 基学习器权重计算
    • 数据分布更新

    AdaBoost的学习采用了前向算法,即假设前(i-1)个部分已经学习完成,然后求解第(i)个学习器及其权重。对于第(i)个学习器:

    [egin{align} mathcal{L}(y, H_{i}(x)) &= sum_{j=1}^Nexp{-y_j (H_{i-1}(x_j) + alpha h(x_j)}\ &= sum_{j=1}^N exp{-y_j (H_{i-1}(x_j)}exp{-y_j alpha h(x_j)}\ &overset{Delta}{=} sum_{j=1}^N ar{w}_{i, j} exp{-y_jalpha h(x_j)}\ &= sum_{j=1}^N ar{w}_{i, j} (1 -y_jalpha h(x_j) + frac{1}{2}(y_jalpha h(x_j))^2)\ &=sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -y_jalpha h(x_j))\ &=sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -alpha(1 - 2mathbb{I}(y_j eq h(x_j))\ &= sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -alpha + 2alpha mathbb{I}(y_j eq h(x_j))\ end{align} ]

    最优学习器(h_i(x))为:

    [h_i(x) = arg min sum_{j=1}^N ar{w}_{i, j}mathbb{I}(y_j eq h(x_j)) ]

    从该公式可以看出,对于被(H_{i-1}(x))分错的样本,(h_i(x))会着重学习

    [egin{aligned} mathcal{L}(y, H_i(x)) &= sum_{j=1}^{N} ar{w}_{i, j} exp left[-y_{j} alpha h_ileft(x_{j} ight) ight] \ &=sum_{y_{j}=h_{i}left(x_{j} ight)} ar{w}_{i,j} mathrm{e}^{-alpha}+sum_{y_{j} eq h_{i}left(x_{j} ight)} ar{w}_{i,j} mathrm{e}^{alpha} \ &=left(mathrm{e}^{alpha}-mathrm{e}^{-alpha} ight) sum_{j=1}^{N} ar{w}_{i,j} mathbb{I}left(y_{j} eq h_ileft(x_{j} ight) ight)+mathrm{e}^{-alpha} sum_{j=1}^{N} ar{w}_{i,j} end{aligned} ]

    学习器(h_i(x))的权重(alpha_i)为:

    [alpha_i = frac{1}{2}logfrac{1-e_{i}}{e_i} ]

    其中(e_i)为分类器(h_i(x))的错误率

    [egin{aligned} e_{i} &=frac{sum_limits{j=1}^{N} ar{w}_{i,j} mathbb{I}left(y_{j} eq h_ileft(x_{j} ight) ight)}{sum_limits{j=1}^{N} ar{w}_{i,j}} \ &=sum_{j=1}^{N} w_{i,j} mathbb{I}left(y_{j} eq h_ileft(x_{j} ight) ight) end{aligned} ]

    (alpha_i)可以看出,高错误率的子学习器占据的权重较小

    数据分布更新:

    [egin{align} ar{w}_{i,j} &= exp{-y_jH_{i-1}(x_j)}\ H_i(x) &= H_{i-1}(x) + alpha_i h_i(x)\ ar{w}_{i+1, j} &= exp{-y_j(H_{i-1}(x_j)+alpha_i h(x_j))}\ &= ar{w}_{i,j}exp{-y_jalpha_i h(x_j)} end{align} ]

    提升树

    提升树主要是用来解决回归任务。将回归树(T(x) = sum_limits{i=1}^{M}hat{c}_i mathbb{I}(xin R_i))作为基学习器,对于前向分步:

    [egin{aligned} &H_{0}(x)=0\ &egin{aligned} H_{m}(x) &=H_{m-1}(x)+Tleft(x ; Theta_{m} ight), quad m=1,2, cdots, M \ H_{M}(x) &=sum_{m=1}^{M} Tleft(x ; Theta_{m} ight) end{aligned} end{aligned} ]

    在第m步时:

    [egin{align} hat{Theta}_{m}&=arg min _{Theta_{m}} sum_{i=1}^{N} Lleft(y_{i}, H_{m-1}left(x_{i} ight)+Tleft(x_{i} ; Theta_{m} ight) ight)\ &=sum_{i=1}^Nleft[y_i-H_{m-1}(x_i)-Tleft(x_i ; Theta_{m} ight) ight]^{2}\ &=sum_{i=1}^Nleft[r_i-Tleft(x_i ; Theta_{m} ight) ight]^{2} end{align} ]

    即在m步时拟合当前的残差即可

    在前向算法中,如果采用了平方损失或者指数损失是非常容易实现的,如果采用其他的损失函数将不容易计算。为此采用了类似于梯度下降的思想提出了梯度提升树(GDBT),将采用平方损失的提升树中的残差表达式换为梯度值即可:

    [r_{m i}=-left[frac{partial Lleft(y_{i}, hleft(x_{i} ight) ight)}{partial hleft(x_{i} ight)} ight]_{h(x)=H_{m-1}(x)} ]

  • 相关阅读:
    【java规则引擎】drools6.5.0版本中kmodule.xml解析
    【java规则引擎】drools6.5.0版本api简介
    git撤销各种状态下的操作
    【策略】一致性Hash算法
    【策略】一致性Hash算法(Hash环)的java代码实现
    【转载】对一致性Hash算法,Java代码实现的深入研究
    Zookeeper之Curator(1)客户端对节点的一些监控事件的api使用
    【2】基于zookeeper,quartz,rocketMQ实现集群化定时系统
    NIO之直接缓冲区与非直接缓冲区
    NIO之缓冲区(Buffer)的数据存取
  • 原文地址:https://www.cnblogs.com/vinnson/p/13302225.html
Copyright © 2011-2022 走看看