一、集成学习
将若干弱分类器组合生成一个强分类器;弱分类器:指分类准确率只稍好于随机猜测的分类器(错误率<50%);
分为两大流派:bagging和boosting;
核心:如何实现数据多样性,从而实现弱分类器的多样性;
特点:
(1)将多个分类方法聚集在一起,以提高分类的准确率(这些算法可以是不同的算法,也可以是相同的算法。);
(2)集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类;
(3)严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法;
(4)通常一个集成分类器的分类性能会好于单个分类器;
(5)如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。
二、bagging=bootstrap aggregation
思想:让学习算法训练多轮,每轮的训练集由初始的训练集中随机取出的n个训练样本组成,是有放回抽样,分别训练后可得到一个预测函数序列h_1,h_2,...,h_n,最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法。
特点:
(1) Bagging通过降低基分类器的方差,改善了泛化误差;
(2)其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起;关注偏差;
(3)由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例(对样本的一个无偏性)。
【Random Forest算法】参考:https://www.cnblogs.com/maybe2030/p/4585705.html
bagging思想:分类投票;回归取平均;
两个随机性:随机抽样训练集;随机抽取特征子集;
·RF和GBDT关系:
---相同点:
1.都是由多棵树组成
2.最终结果由多棵树一起决定
---不同点:
1.RF的基分类器可以是分类树也可以是回归树;GBDT只能是回归树;
2.RF可并行生成;GBDT只能串行生成;
3.RF是投票;GBDT是累加机制;
三、boosting=Adaptive boosting
迭代算法,每轮迭代中会在训练集上产生一个新的分类器,使用该分类器对所有样本进行分类。
具体:算法为每个训练样本赋予一个权值,每次用新分类器标注样本,如果某个样本点已被分类正确,降低其权值,减少下次数据抽样时抽中该样本的概率;反之增大错误样本下次抽中的概率,即越难区分的样本在训练过程中会越来越重要。
要素:(1)函数模型(叠加性);(2)目标函数;(3)优化算法
问题:(1)如何调整训练集,更新样本权重;(2)如何将弱分类器组合成强分类器;
【Adaboost算法】
损失函数:指数函数;
分类:CART分类树;
回归:CART回归树;
解决问题策略:(1)样本权值对错分样本加大权重,降低正分样本权重;(2)弱分类器权值加权投票机制:加权分类效果好的分类器,减小分类效果差的分类器的权重;
适用:二分类或多分类;可做分类任务的baseline;
优点:二元分类精度高;不易发生过拟合;
缺点:更关注错分类,会对异常样本敏感,影响最终的强分类器的预测准确性;
算法过程: https://www.cnblogs.com/willnote/p/6801496.html
(待补)
【Gradient Boosting梯度提升算法】
损失函数:对数损失函数或指数损失函数
模型:CART回归树模型;
——为什么使用回归树而不是分类树?因为是累加机制,分类输出是类别,累加没有意义;回归输出是预测数值,累加仍有意义;
——分类树和回归树的区别是什么?
分类树使用信息增益/信息增益率/基尼指数来划分节点, 中间会穷举所有特征的所有阈值, 最后选择一个合适的划分特征,最后根据叶子节点的投票确定预测样本的类别;回归树使用最小化均方差划分节点, 中间会穷举所有特征的所有划分点, 最后根据叶子节点的样本均值作为预测样本的回归预测值.
解决问题策略:(1)将残差(实际值-预测值)作为下一个弱分类器的训练数据,每个新的弱分类器都是为了让残差往梯度方向减少;(2)累加机制代替平均投票机制;(树的值累加,见下图,出处:https://www.cnblogs.com/peizhe123/p/5086128.html)
优点:灵活处理连续值和离散值;对异常值的鲁棒性很强;
缺点:弱学习器之间存在依赖关系,难以并行;
适用:回归、二分类;
算法过程:
(待补)
【GBDT】:
类似提升树算法,用损失函数的负梯度代替残差,即每一轮拟合的是上一轮损失函数的负梯度;
两者(GBDT和提升树):每一轮的树都是两层的(根节点+叶子节点);
常见问题: 参考https://www.cnblogs.com/ModifyRong/p/7744987.html
gbdt 的算法的流程,gbdt如何选择特征,如何产生特征的组合,以及gbdt 如何用于分类;
【XGBoost算法】:
特点:计算速度快、模型表现好;
与GBDT区别:
1.基分类器:GBDT(CART回归树);XGB(还支持线性分类器);
2.目标函数:GBDT(一阶导数);XGB(对代价函数进行二阶泰勒展开,同时用到一阶和二阶;并在代价函数中加正则项,控制模型复杂度);
3.支持列抽样(特征采样):降低过拟合;
4.对缺失值处理:可自动学习出分裂方向,选择特征增益大的方向;
5.特征并行:训练前对数据进行排序(预排序算法:对所有特征按照特征的数值进行预排序),保存为block结构,之后迭代重复使用这个block,各个特征增益计算可以多线程进行;近似直方图算法,高效生成候选分割点;
6.内置交叉验证;
缺点:每轮迭代,都需要遍历整个训练数据多次;预排序方法时间空间消耗很大;
调参经验:
1.确定线性模型还是树模型;
2.确定学习目标:线性分类、二分类、多分类
3.调节参数:基分类器的数目;树深;叶子节点最小样本数量;学习率;使用的特征数量、样本数量;
调参skill: grid search 先大范围再小范围
推导: https://blog.csdn.net/a819825294/article/details/51206410 or https://blog.csdn.net/u013714645/article/details/79962529
【LightGBM 算法】
优点:更快的训练效率;低内存使用;更高准确率;支持并行化学习(特征并行、数据并行);可处理大规模数据;直方图作差加速(叶子的直方图=父亲节点直方图-兄弟直方图,避免构造直方图的大代价,用微小代价得到兄弟叶子的直方图);带深度限制的leaf-wise叶子生成策略(从当前叶子中,找到分裂增益最大的一个叶子);直接支持类别特征(不需要one-hot编码);
直方图算法:先把连续的特征值离散化为K个整数,同时构造一个宽度为k的直方图,遍历数据时在直方图中累计离散值的统计量,之后根据离散值寻最优分割点;
与XGBoost区别:
1.XGB(level-wise);
2.XGB(评价指标最后一项作为停止标准);LGBM(受所有评价指标的影响)
3.GOSS(基于梯度的单边采样)——参考:https://baijiahao.baidu.com/s?id=1595285625542671386&wfr=spider&for=pc
调参顺序:
学习率、迭代次数;叶子数、最大深度;分箱最大值、叶子节点最小样本数量;特征采样、数据采样;正则化系数;降低学习率、增加迭代次数,进行模型验证;
对应问题:解决问题如何调整参数
过拟合:叶子节点最小样本数目(UP);叶子数目(DOWN);使用特征采样;增加训练数据;加上正则化;最大深度(DOWN);
加速:特征采样;数据采样;分箱(DOWN);设置早停;
提升准确率:分箱(UP);增加迭代次数;设置小一些的学习率;叶子数(UP,可能会过拟合);
四、bagging和boosting算法的区别
训练集独立性、预测函数是否带权重、可否并行化;
(1) bagging的训练集是随机的,各训练集是独立的;而boosting训练集的选择不是独立的,每一次选择的训练集都依赖于上一次学习的结果,每一轮训练都会改变样本权重分布;
(2) bagging的每个预测函数都没有权重;而boosting根据每一次训练的训练误差得到该次预测函数的权重(分类器的权重设置原则与训练样本的权重设置原则相反,加大正分权重,减小错分权重);
(3) bagging的各个预测函数可以并行生成;而boosting只能顺序生成(个体学习器之间强依赖,必须串行生成)。(对于神经网络这样极为耗时的学习方法,bagging可通过并行训练节省大量时间开销)。
相关问题:
(1)
为什么Bagging模型使用强模型?
整体模型的期望近似等于基模型的期望,也就是说整体模型的最后偏差和每棵树的偏差相等.整体模型的方差小于基模型的方差(关注降低方差),随着模型数量的增多,整体模型的方差减小. 但是当基模型的数量增加到一定程度的时候方差是无法继续减小了.
为什么Boosting 使用弱模型?
Boosting模型都针对分错的样本进行优化,所以每个基分类器的准确率是能够得到保证的(因此主要关注降低偏差). 如果就需要考虑方差. 如果是强模型的话,基分类器的个数越多,方差越大. 但是弱分类的方差会稍微比强基分类器的方差小一点.
(2)
比如为什么在RF上需要深度很大,但是在GBDT上或者XGBOOST上不需要那么大的深度,就可以达到不错的准确率?
https://www.zhihu.com/question/45487317
从偏差和方差的角度来说比较好理解。要想精度高,泛化误差必须低,就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。我们尽可能地让方差和偏差小一点,想一下,决策树的深度就决定了模型的偏差(越深,偏差越小,但是太深,会导致过拟合,也就是方差会大),而随机森林中多棵树的组合就是为了降低偏差。这就是为什么随机森林的树深度会很高的原因。而GBDT的每一棵树是拟合的上一棵树的偏差,本身就保证了偏差,所以问题就在于怎么选择使方差更小的分类器,故决策树的深度都很浅。
参考:
集成学习框架概念梳理: https://blog.csdn.net/Chenyukuai6625/article/details/73692347