自适应提升
提升方法通过前一个学习器所犯的错误来训练下一个学习器,是一种串行方法。关于提升算法有很多,最具代表性的是AdaBoost算法。
在集成学习-组合多学习器中介绍的Adaboost方法,样本按概率被抽取作为训练子学习器的训练集。而每个子学习器根据前一子学习器的结果误差更新样本抽取概率,使被误分类的实例在后面的训练中得到更多的重视。
分类问题中,Adaboost方法还可以采用全样本数据训练每一个基学习器,根据前一子学习器的结果改变样本数据的权重,来使被误分类的实例得到更多重视。具体流程如下:
训练数据集,其中,。
1)初始化训练数据权值分布
2)对
(a)使用具有权值的训练集学习,得到基分类器
(b)计算在训练集上的分类误差率
(c)计算的系数
(d)更新训练集的权重分布
是规范化因子
3)构建基本分类器的线性组合
得到最终分类器
回归问题情况下,则对上一个学习器拟合结果的残差进行学习,得到后面的学习器。
基学习器根据具体问题选定。一般常见的是提升树算法,adaboost的最决策树一般被认为是最好的机器学习算法之一。
而针对不同问题的提升树,主要区别在于使用的损失函数,包括回归问题的平方误差,分类问题的指数误差,或一般决策问题的一般损失函数。
梯度提升
提升树在学习过程中,当损失函数是平方损失和指数损失时,计算相对简单。但对一般损失函数,往往每一步优化不那么容易。基于此,梯度提升方法,通过学习前一个子学习器残差的负梯度,得到后面的学习器。典型的就是GBDT算法(回归树)。
训练数据集,其中,,损失函数,为回归树。
1)初始化
2)对
(a)对,计算
(b)对拟合一个回归树,得到第m棵树,共有个叶子结点,其叶子结点区域为,。
(c)对,计算
(d)更新。
3)得到最终回归树
对比
推荐GBDT树的深度一般为6,对比DecisionTree/RandomForest需要把树的深度调到15或更高。原因在于Bagging主要关注降低方差,并行地训练很多不同的分类器的目的就是降低这个方差。因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差,所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。