提升方法与前向分步算法
提升方法
- 从弱学习算法出发,反复学习,得到一系列弱分类器,然后组合这些弱学习器,提升为强学习器
- 两个问题:
- 在每一轮如何改变训练数据的权值或概率分布
- 如何将弱学习器组合成一个强学习器
前向分步算法
- AdaBoost另一种解释:
- 加法模型
- 损失函数为指数函数
- 学习算法为前向分步算法
- 二类分类学习方法
前向分步算法(Forward Stagewise Algorithm)
- 考虑加法模型(additive model)
\[f(x)=\sum \limits_{m=1}^M \beta_m b(x;\gamma_m) \]
- 其中,\(b(x;\gamma_m)\)为基函数,\(\beta_m\)为基函数的系数,\(\gamma_m\)为基函数参数
- 给定训练数据及损失函数\(L(y, f(x))\)条件下,学习加法模型成为经验风险极小化即损失函数极小化问题
\[\mathop{\min} \limits_{\beta,\gamma} \sum \limits_{i=1}^N L(y_i, \beta b(x_i; \gamma)) \]
- 前向分步算法如下:
- 输入:训练集,损失函数\(L\),基函数集\(\{b(x;\gamma)\}\)
- 输出:加法模型\(f(x)\)
- 初始化\(f_0(x)=0\)
- 对\(m=1,2,\cdots,M\)
- 极小化损失函数,得到参数
\[(\beta_m, \gamma_m)=\mathop{\arg\min}\limits_{\beta, \gamma}\sum \limits_{i=1}^N L(y_i, \ f_{m-1}(x)+\beta b(x; \gamma))\]
- 更新
\[f_m(x)=f_{m-1}(x) + \beta_m b(x;\gamma_m) \]
- 得到加法模型
\[f(x)=f_M(x)=\sum \limits_{m=1}^M \beta_m b(x; \gamma_m) \]
提升树原理
提升树算法
- 如果将输入空间\(\mathcal{X}\)划分为\(J\)个互不相交的空间\(R_j\)(回归树叶节点个数),并且在每个区域确定输出的常量\(c_j\)(\(c_j\)就是回归或者分类的值),那么树可以表示成
\[T(x;\Theta)=\sum \limits_{j=1}^J c_j I(x \in R_j)\]
- 回归问题提升树使用以下前向分步算法:
\[f_0(x)=0\]
\[f_m(x)=f_{m-1}(x)+T(x;\Theta_m) \]
\[f_M(x)=\sum \limits_{m=1}^M T(x;\Theta_m) \]
- 在第\(m\)步,需求解
\[\hat{\Theta}_m=\mathop{\arg \min}\limits_{\Theta_m} \sum \limits_{i=1}^N L(y_i, f_{m-1}(x_i)+T(x_i; \Theta_m)) \]
平方误差损失函数
\[L(y, f_{m-1}(x)+T(x;\Theta_m))=[y-f_{m-1}(x)+T(x;\Theta_m)]^2=[r-T(x;\Theta_m)]^2\]
\(r=y-f_{m-1}(x)\)是残差。因此只需要简单地拟合当前模型的残差
- 回归问题的提升树算法:
- 输入:训练集
- 输出:提升树\(f_M(x)\)
- 初始化\(f_0(x)=0\)
- 对\(m=1,2,\cdots,M\)
- 计算残差
\[r_{mi} = y_i-f_{m-1}(x_i) \]
- 拟合残差\(r_{mi}\),学习一个回归树,得到\(T(x;\Theta_m)\)
- 更新
\[f_m(x)=f_{m-1}(x) + T(x;\Theta_m) \]
- 得到回归问题提升树
\[f_M(x)=\sum \limits_{m=1}^M T(x;\Theta_m) \]
梯度提升
- 当损失函数是平方损失或者指数损失,优化简单
- 梯度提升解决其他优化问题
- 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值
- 梯度提升算法:
- 输入:训练集;损失函数\(L(y, f(x))\)
- 输出:回归树\(\hat{f}(x)\)
- 初始化
\[f_0(x)=\mathop{\arg\min}\limits_{c}\sum \limits_{i=1}^N L(y_i, c) \]
其中,\(c\)是回归值,它是只有一个根节点的树
- 对于\(m=1,2,\cdots,M\)
- 对\(i=1,2,\cdots,N\),计算
\[r_{mi}=-\left[ \frac{\partial L(y_i, f(x_i))}{\partial f(x_i)} \right] \]
- 对\(r_{mi}\)拟合一个回归树,得到第\(m\)棵树的叶节点区域\(R_{mj}\)
- 对\(j=1,2,\cdots,J\),为每个叶节点计算最好的回归值
\[c_{mj}=\arg\min\limits_{c}\sum \limits_{x_i \in R_{mj}} L(y_i, f_{m-1}(x_i)+c) \]
- 更新
\[f_m(x)=f_{m-1}(x)+\sum \limits_{j=1}^J c_{mj}I(x\in R_{mj}) \]
- 得到回归树
\[\hat{f}(x)=f_M(x)=\sum \limits_{m=1}^M\sum \limits_{j=1}^J c_{mj}I(x\in R_{mj}) \]
梯度提升与梯度下降的区别联系
- 联系
- 每轮迭代,利用损失函数相对于模型的负梯度方向的信息对当前模型更新
- 区别
- 梯度下降:模型以参数化形式表示,模型更新等价于参数更新
- 梯度提升:模型直接定义在函数空间中,扩展了可使用的模型种类
GBDT优缺点
- 优点:
- 预测阶段计算速度快,树与树之间可以并行计算
- 分布稠密的数据集上,泛化能力和表达能力好
- 使用决策树的GBDT具有可解释性和鲁棒性,能自动发现特征间的高阶关系,不需要对数据做特殊预处理如归一化等
- 局限性:
- 高维稀疏数据集上,表现不如SVM或者神经网络
- 处理数值型特征效果明显,文本分类特征上不是最好
- 训练过程需要串行训练
XGBoost和GBDT的联系和区别
- GBDT是机器学习算法,XGBoost是该算法的工程实现
- 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型复杂度,有利于防止过拟合,提高泛化能力
- GBDT训练时只用了代价函数的一阶信息,XGBoost同时使用了一阶和二阶导数
- 传统的GBDT使用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器
- 传统的GBDT在每轮迭代时使用全部数据,XGBoost则采用了与随机森林类似的策略,支持对数据进行采样
- 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习缺失值的处理策略
来源:https://www.cnblogs.com/weilonghu/p/11923062.html