Boosting
GBM
GBM 全称gradient boosting machine,一般叫做梯度提升树算法。是一类很常用的集成学习算法,在多次数据挖掘比赛中获得了优秀的成绩。
boosted tree
提升树是以分类树和回归树为基学习器的提升算法,就是将T(x;Θm)学习器定义为了决策树。提升树(boosting tree)是以决策树为基本学习器的提升方法,它被认为是统计学习中性能最好的方法之一。对于分类问题,提升树的决策树是二叉决策树,对于回归问题,提升树中的决策是二叉回归树。提升树采用前向分步算法,不同问题的提升树学习算法主要区别在于使用的损失函数不同。提升树的学习思想有点类似一打高尔夫球,先粗略的打一杆,然后在之前的基础上逐步靠近球洞,也就是说每一棵树学习的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
梯度提升树(GBT)
上面所讲的提升树中,当损失函数是平方损失函数和指数损失函数时,每一步优化都很简单。因为平方损失函数和指数损失函数的求导非常简单。当损失函数是一般函数时,往往每一步优化不是很容易。针对这个问题,Freidman提出了梯度提升树算法(GBT)。
梯度提升树(GBT)的一个核心思想是利用损失函数的负梯度在当前模型的值作为残差的近似值,本质上是对损失函数进行一阶泰勒展开,从而拟合一个回归树。
GBM梯度提升树
GBM(提升器)算法,又名GBDT,是基于梯度下降算法得到提升树模型。它与提升树的关键不同之处,就在于残差更新的方式。
Xgboost相比与GBDT:
(1) 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。例如,xgboost支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
(2) xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
(3)列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
(4)并行化处理:在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
(个人认为后面两个,更改的GBDT也可以做到,相比于GBDT,Xgboost最重要的优点还是用到了二阶泰勒展开信息和加入正则项)
Stacking
Stacking是个多层的多模型集合方法。每一层都可包括多个模型,下一层利用上一层模型的结果进行学习。下面以2层为例介绍此方法:
*2层Stacking运行示意图
Stacking- Stacking第一层中模型Mi的运行示意图
Stacking 流程
Stacking流程比较复杂因为涉及到交叉验证的过程,其流程与Blending类似,具体如下:
- 将数据划分为训练集和测试集(test_set),对训练集进行划分为K个大小相似的集合,取其中一份作为验证集val_set,其余的为训练集train_set;
- 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
- 对于每一个模型来说,train_set和val_set是不一样的,如2.2图所示;然后利用各自的train_set训练各自的模型,训练好的模型对各自的val_set和test_set进行预测,得到val_predict和test_predict;
- 创建第二层的模型,将每个模型对应的val_predict拼接起来作为第二层的训练集,将所有模型的test_predict取平均值作为第二层的测试集;用训练好的第二层模型对第二层的测试集进行预测,得到的结果即为整个测试集的结果
Stacking 图解
stacking 网上有两种解释,一种是单个模型进行5次交叉验证得到一个结果,然后对每个模型都进行相同的操作,此时训练集的维度为(#样本数目 x #模型数目);另一种是每个模型对数据的每一折输出一个结果,然后把每一折的结果拼接起来,此时的训练集维度(#样本数目 x 1)。
imageBlending
是一种模型融合的方法,和Stacking过程很类似。
Blending 流程
Blending相较于Stacking来说要简单一些,其流程大致分为以下几步:
- 将数据划分为训练集和测试集(test_set),其中训练集需要再次划分为训练集(train_set)和验证集(val_set);
- 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
- 使用train_set训练步骤2中的多个模型,然后用训练好的模型预测val_set和test_set得到val_predict, test_predict1;
- 创建第二层的模型,使用val_predict作为训练集训练第二层的模型;
- 使用第二层训练好的模型对第二层测试集test_predict1进行预测,该结果为整个测试集的结果
Blending 图解
imageBlending流程图
imageBlending与Stacking对比
Blending的优点在于:
1.比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
2.避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
3.在团队建模过程中,不需要给队友分享自己的随机种子
而缺点在于:
1.使用了很少的数据(是划分hold-out作为测试集,并非cv)
2.blender可能会过拟合(其实大概率是第一点导致的)
3.stacking使用多次的CV会比较稳健
网友评论