参考:https://github.com/datawhalechina/daily-interview/blob/master/AI%E7%AE%97%E6%B3%95/machine-learning/EnsembleLearning.md
集成学习由训练基学习器 + 基学习器结合 两步组成。基学习器的训练可以是提升算法,层层递进调整样本再训练下一个学习器,从而一步步减小偏差;也可以是重复放回的自助抽样方法,基于每部分样本来训练学习器。而结合的方法选择是基于要解决的问题类型,回归用平均法(包含加权平均),分类用投票法,也可以采用stacking来分层结合。
注:模型融合的方法很多就是根据RMSE来做加权平均。
一、认识集成学习
1.集成怎样被个体影响?
个体分类器的数目越多,集成的错误率越低。
2.目标:
找到尽可能多的“好而不同”的个体学习器。
- 多:随着个体分类器的数目增多,集成的错误率将指数级下降。
- 好:学习器的泛化性能尽可能强,具有“准确性”。
- 不同:学习器之间具有差异,“多样性”。
【准确性与多样性的冲突】:个体学习器的准确性很高之后,要增加多样性就要牺牲其准确性。因为现实任务中,个体学习器都是基于同一个问题训练出来的,它们显然你不可能相互独立。
二、集成学习的类型
boosting和bagging的差异:前者串行训练,各基分类器之间有强依赖。后者分行训练,各基分类器之间无强依赖。前者的基分类器层层叠加,后面学习器是基于前面的分类器来调整样本分布,对分错的样本给予更多的关注,然后训练下一个学习器。
1.Boosting(强依赖)提升算法
【以AdaBoost为例】
(1)思路:
指定基学习器个数T,迭代计算指数损失函数,每一步都更新一个个体学习器的权重和样本分布,最终最小化指数损失函数。
- 强依赖的原因:下一个个体学习器的样本分布是基于上一个个体学习器的训练结果(对上一个个体学习器分错的样本给予更高的权重),因此T个学习器之间依赖性很强。
(2)侧重点:
通过计算损失函数,来降低偏差。
(3)典型方法:
Adaboost、GBDT、XGBoost
2.Bagging(非强依赖)
Bootstrap aggregating,通过样本扰动(by bootstrap)增加学习器的多样性,减小方差,增强泛化性能
(1)思路:
自助采样(bootstrap sampling),基于每个采样集训练出一个学习器,再结合。其中,bootstrap sampling是用小样本采样的非参方法,是一种有放回的抽样。
- 弱依赖的原因:自助采样能够保证样本之间的随机性,因此学习器之间的依赖性不强。
(2)侧重点:
自助抽样保证了样本的随机性,以降低方差。
(3)典型算法:Random Forest(RF)
通过样本扰动和属性扰动(by 从属性子集中随机选择最优属性)增加学习器的多样性,减小方差,增强泛化性能。多样性、效率和泛化能力都更优。
- 样本扰动:袋装算法
- 属性扰动:随即子空间算法
三、结合策略
- 平均法:数值型个体学习器,回归问题
- 投票法:分类型个体学习器,分类问题
- 学习法:Stacking
- 适用情况:训练数据多的情况下
- 思想:分层模型集成,如果是两层模型。第一层选择几个合适的基学习器,分别对样本进行训练,采用交叉验证或留一法,将每个基学习器得到的预测结果作为特征,加入训练集。然后进入第二层的训练,此时为了防止过拟合,倾向采用简单的模型。
- 参考:https://blog.csdn.net/wstcjf/article/details/77989963
四、多样性
个体学习器的准确性越高,多样性越大,则集成越好。
1.多样性度量
个体分类器的两两相似性/不相似性:不合度量、相关系数、Q统计量、k统计量
2.多样性增强
再学习过程中引入随机性,以减小方差。
(1)数据样本扰动
- 方法:采样法
- 适用:不稳定基学习器(样本稍加变化就会导致学习器有显著变化),如决策树、神经网络。
(2)输入属性扰动
- 方法:抽取属性子集,基于每个属性自己训练一个基学习器
- 适用:稳定基学习器(样本变化对学习器没有显著影响,如线性学习器、SVM、朴素贝叶斯、k近邻学习器),有大量属性且冗余属性多
(3)输出表示扰动
(4)算法参数扰动
五、辨证看待集成学习
集成包含多个个体学习器,虽然个体学习器有较好的可解释性,但是集成仍然是黑箱模型(无法确保模型准确定,并且无法解释结果中每一个节点的功能)。可以尝试将集成转化为单模型、从集成中抽取符号规则等。