[标点符] 机器学习算法之Boosting -集成学习的概念扥类 -bagging/boosting/stacking的区别 -boosting算法原理 -AdaBoost/Gradient Boosting/XGBoost简介

学习链接

机器学习算法之Boosting https://www.biaodianfu.com/boosting.html

前摘

机器学习2大类

机器学习通常会被分为2大类:监督学习和非监督学习,
目的是为了找到输入x与输出y之间的函数关系F:y = F(x)。

回归和分类的简单区别:

(https://www.zhihu.com/question/21329754/answer/151216012)

特性 分类(监督学习) 回归
输出类型 离散类型(所谓“定性”) 连续数据/概率的取值范围(可度量的区间,某段可度量的区间上取了一个概率点)
目的 寻找决策边界 找到最优拟合
评价方法 精度(accuracy/混淆矩阵等) 和方差/SSE(sum of square errors)或者拟合优度

集成学习含义

集成学习是通过训练弱干个弱学习器, 并通过一定的策略进行结合, 生成强学习器, 也成为多分类器系统(multi-classifier system).
集成学习先产生一组“个体学习器”/基学习器(individual learner),再用某种策略将它们结合起来。
很多现有的学习算法都足以从训练数据中产生一个个体学习器,我们将这种由个体学习器集成的算法分为两类:

  • 同质(homogeneous): 即集成中仅包含同种类型的一个个体学习期,如决策树-随机森林中就全是决策树学习算法, 如神经网络集成中就全是神经网络
  • 异质heterogenous) : 不同的学习算法组装而成, 又称为组件学习器

集成学习之同质学习器 boosting算法 VS bagging算法

按是否存在强依赖关系,分为两类:

  1. boosting算法:一系列个体学习器基本都需要串行生成,如Gradient Boosting等
  2. bagging算法: 不同的学习器之间不存在强依赖, 可以并行使用个体学习器
  3. 类比: 单个学习器进行学习

集成学习的结果则是由投票法(voting)决出,即“少数服从多数”:

  • 如图: a集成后提升了性能,b不变,C变差; 因此在集成学习中对个体学习器的要求应该是好而不同的(达到上图B的效果),既能满足准确性也能满足多样性
  • 随着集成中个体分类器数目T的增大,集成的错误率将指数级下降从而最终趋于0(这里还有一个前置条件就是个体分类器的错误率不能大于50%)。(但我们曾假设各个分类器之间的错误率是相互独立的,而实际上再同一个任务中个体学习器视为解决同一个问题训练出来的,这也就意味着它们之间显然不可能相互独立。)
  • 总之,最佳效果的组合是:多样化、好而不同

三种常见的集成学习的框架

bagging

从训练集中进行切割——子抽样,得到N个训练集,分别训练得到N个基模型,对对所有基模型预测的结果进行综合(加权平均、AUC加权等)产生最终的预测结果
如鱼佬给的xgboost_model 、lightgbm_test、 cat_model的混合模型————

boosting

一系列的基学习器需要串行执行, 每次训练产生一个新的弱模型、并将训练集转化成新的基学习器的训练数据;从而产生多个基模型等。

stacking(叠加) https://zhuanlan.zhihu.com/p/42229791

举例二级的stacking,主要分两步:

  • 多个基学习器,进行K折交叉验证,避免过拟合:
  • 分别汇集多个基学习器的训练集、测试集、新生成的特征列,构建新的基学习器

    代码 task_06_fusion_lgb_lgb.ipynb

Blending(混合) https://zhuanlan.zhihu.com/p/42229791

Blending与Stacking大致相同, 只是保留了一部分数据集不在第一阶段使用——但在第二阶段开发

代码 task_06_fusion_lgb_lgb.ipynb

从模型的偏差和方差的角度入手,看待什么是Boosting?

Boosting的基本概念

boosting 是个一种学习方法,它是一种有监督的分类学习方法:组合需要弱分类器来产生一个强大的分类器组。(要求:好而多)

boosting如何确定弱的规则?什么是“弱”?

弱: 基础的机器学习算法,精确度有限,计算量有限。

boosting算法会将多个弱学习器组合成一个强大的决策规则,boosting遵循如下的步骤:

  1. 分布式下,人人平等
  2. boosting更关注错误的分类的弱规则,再下一轮汇总增加权重
  3. 迭代第二步,直到达到预定的学习器数量或者预定的预测精度
  4. 最终, 组合成强学习器,提高模型的整体预测精度

Boosting算法的底层可以是任何算法,关于boosting算法,我们需要知道其中最有名的3个算法:

  • AdaBoost(Adaptive Boosting) 适应性提升
  • GBM(Gradient Boosting Machine) 梯度提升
  • XGBoost (extreme Gradient Boosting)极端坡度提升

AdaBoost : 解决分类和回归问题

大多数的提升方法都是改变训练数据的概率分布(或说训练数据的权值分布),来针对不同的训练分布调用弱学习算法学习一系列弱分类器。
这样一来,对于提升方法而言,就有了两个问题需要去解决:

在每一轮如何改变训练数据的权值或概率分布?

  • 提高那些被错误分类的样本的权值,降低正确分类的样本; 再下一轮中,弱分类器会更加关注没有被正确分类的样本的权值.
  • 持续下去, 分类问题便会被一系列的弱分类器"分而治之"
    如何将弱分类器组合成一个强分类器?
  • 加权多数表决法:提升正确率高的弱分类器,同时减小分类误差率大的弱分类器的权值、使其在表决中起较小的作用

AdaBoost简单代码

from sklearn.ensemble import AdaBoostClassifier # For Classification
from sklearn.ensemble import AdaBoostRegressor  # For Regression
from skleran.tree import DecisionTreeClassifier
 
dt = DecisionTreeClassifier() # 作为基学习器
clf = AdaBoostClassifier(n_estimators=100, base_estimator=dt, learning_rate=1)
clf.fit(x_train, y_train)

可以调整参数以优化算法的性能:

  • n_estimators:它控制了弱学习器的数量
  • learning_rate:控制在最后的组合中每个弱分类器的权重,需要在learning_rate和n_estimators间有个权衡
  • base_estimators:它用来指定不同的ML(机器学习)算法。
    也可以调整基础学习器的参数以优化它自身的性能。

Gradient Boosting: 梯度提升算法

简介: 每一次建立模型是在之前已经建立的模型的损失函数的梯度下降方向

  • 损失函数(loss function) : 描述的是模型的不靠谱程度,损失函数越大,则模型越容易出错
  • 如果我们的模型能够让损失函数持续地下降,则说明我们的模型在不停地改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降

python实现GBDT(梯度提升决策树)

在Python Sklearn库中,我们可以使用Gradient Tree Boosting或GBDT(Gradient Boosting Descision Tree)。它是一个关于任意可微损失函数的一个泛化,可以用来解决分类和回归问题。

from sklearn.ensemble import GradientBoostingClassifier  # For Classification
from sklearn.ensemble import GradientBoostingRegressor   # For Regression
 
clf = GradientBoostingClassfier(n_estimators=100, learning_rate=1.0, max_depth=1)
clf.fit(X_train, y_train)

可以调整参数以优化算法的性能:

  • n_estimators :控制弱学习器的数量
  • learning_rate:控制最后组合中弱学习器的权重,,需要在learning_rate和n_estimators间有个权衡
  • max_depth:单个回归估计的最大深度。最大深度限制了树的结点数量。调整该参数的最佳性能:最好的值取决于输入的变量
    你可以调整损失函数以获得更好地性能。

偏差(bias)和方差(variance)

数据 (X1, X2, …, Xn)

  • 偏差:描述的是预测值和真实值之前的差异(减法运算)
  • 方差:描述的是预测值与预测值之前(作为整体数据的随机变量)的离散程度

模型 F(X1, X2, …, Xn)

  • 模型的偏差:不同的模型在同一的验证集、训练集上的准确度
  • 模型的方差的意义:方差越大的模型越容易过拟合;通常来说弱模型是偏差高(在训练集上准确度低)方差小(防止过拟合能力强)的模型。

XGBoost (Extreme Gradient Boosting) TOOD: 单开一章具体细讲

是GBDT的一种高效实现,XGBoost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。

GBDT的一般步骤

  • Step 1: 初始化。初始化y_hat在第0时刻的值。
  • Step 2:求残差。通过类似梯度下降法的思路,每次y都向梯度下降的方向挪一小步。只是在GBDT,y挪的一小步并不是一个variable,而是一个function。
  • Step 3:构建决策树。使用决策树逼近这个残差 –g,得到第t个决策树:f_t。
  • Step 4:求叶节点权重。
  • Step 5:更新输出y。y(t) = y(t – 1) + learning_rate * f_t

XGBoost优势:

  • 显式地将树模型的复杂度作为正则项加在优化目标
  • 公式推导里用到了二阶导数信息,而普通的GBDT只用到一阶
  • 允许使用列抽样(column(feature)sampling)来防止过拟合,借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。
  • 实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗。
  • 节点分裂算法能自动利用特征的稀疏性。
  • 样本数据事先排好序并以block的形式存储,利于并行计算
  • penalty function Omega主要是对树的叶子数和叶子分数做惩罚,这点确保了树的简单性。
  • 支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit。
posted @ 2020-10-01 22:53  山枫叶纷飞  阅读(275)  评论(0编辑  收藏  举报