目录
五、模型集成
5.1 学习目标
- 学习模型集成与模型融合策略
5.2 内容简介
模型融合是比赛后期一个重要的环节,整体上存在如下几种方式:
1. 简单加权融合
- 回归 (分类概率):算术平均融合 (Arithmetic mean),几何平均融合 (Geometric mean);
- 分类:投票 (Voting)
- 综合:排序融合 (Rank averaging),log 融合
2. Stacking / Blending
- 构建多层模型,并利用预测结果再拟合预测。
3. Boosting / Bagging(在 XGBoost, Adaboost, GBDT 中已经用到):
- 多树的提升方法
相关资料:
5.3 集成学习
集成学习 (Ensemble Learning),即分类器集成,构建多个学习器并通过某种集成方法组合它们来完成最终的学习任务,有时也被称为多分类器系统 (multi-classifier system)、基于委员会的学习 (committee-based learning) 等。一般结构是:先产生一组 “个体学习器”,再用某种策略将它们组合起来。组合策略主要有平均法、投票法和学习法等。集成学习主要用来提高模型(分类,预测,函数估计等)的性能,或用来降低模型选择不当的可能性。集成算法本身是一种监督学习算法,因为它可以被训练然后进行预测,组合的多个模型作为整体代表一个假设 (hypothesis)。
sklearn 官方文档 中,可以很容易找到各类集成算法 API 及其实现。
集成方法 本身并不是某种具体的方法或者是算法,只是一种训练机器学习模型的思路。它的含义只有一点,就是训练多个模型,然后将它们的结果汇聚在一起。集成方法将几种机器学习技术组合成一个预测模型的元算法,以达到 减小方差 (Bagging)、偏差 (Boosting) 或 改进预测 (Stacking) 的效果。当然,也有说法 将多个分类器组合的方法 称为 集成方法 或 元算法。
理论上,学习器的集成会带来 三个方面的好处:
- 首先,从 统计 的方面看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到相同的性能,此时若使用单学习器,可能因误选而导致 泛化性能不佳,结合多个学习器则会减少这一风险;
- 其次,从 计算 的方面看,学习算法往往会陷入 局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险;
- 最后,从 表示 的方面看,某些学习任务的 真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。
常见集成学习方法 有:
- Bagging 又称 自助聚合法 (Bootstrap Aggregating),通常考虑的是 同质弱学习器,相互独立地并行学习 这些弱学习器,并按照某种 确定性的平均过程 将它们组合起来。
更具体地,Bagging 通过 自助采样法 —— 有放回随机采样 的方式创建 K 个新数据集,因此每个新数据集都可能存在重复样本,也可能总有些样本不出现。但整体而言,各样本出现概率相同。之后,K 个新数据集分别同时并行训练 K 个任意可用模型。K 个模型得到的 K 个结果可采用 公平投票 (voting) 等方式聚合。例如,典型的 随机森林 (Random Forest, RF) 就采用了 少数服从多数的 投票原则。
- Boosting 又称 提升法,通常考虑的也是 同质弱学习器。它以一种高度自适应的方法 串行、顺序地学习 这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种 确定性的策略 将它们组合起来。
更具体地,Boosting 与 Bagging 的样本采样逻辑一致,但其 K 个模型是串行而非并行训练的。每个模型在训练时都会基于先前模型的结果,并更加关注/重视被先前模型误判的样本。即各样本具有权值,错误判断率越高的样本拥有越大的权值。同时,每个模型依其分类能力的强弱会被赋予不同的权重,最后,对所有模型的结果进行 加权求和而非公平投票。该方法的机制使得模型存在训练效率的差异。一方面,Bagging 的各模型间完全独立,可采用分布式训练;另一方面,Boosting 中每个模型则依赖或受先前模型结果的影响,故通常采用串行训练。
- Stacking 又称 堆叠法,通常考虑的是 异质弱学习器,并行地学习 这些弱学习器,并通过训练一个 元模型 将它们组合起来,根据不同的各个弱模型的预测结果,组合输出一个最终的预测结果。
更具体地,Stacking 作为比赛中常用的方法,其选择 K 种不同的分类器,通过 交叉验证 在训练集上训练和预测。保证各分类器模型都对所有训练样本预测出一个结果。那么,对于每一个训练样本,都能得到来自 K 种分类器模型的 K 个结果。之后,再创建第二层次的模型,其训练特征就是这 K 个结果。也就是说 Stacking 方法当中会用到 多层模型的结构,最后一层模型的训练特征是上层模型预测的结果。由模型自己去训练究竟哪一个模型的结果更值得采纳,以及如何组合模型之间的特长。
简言之,Bagging 旨在 获得一个方差比其组成部分更小的集成模型,而 Boosting 和 Stacking 则致力于 生成偏差比其组成部分更低的强模型(即使方差也可以被减小)。
5.3.1 Stacking 理论概述
Stacking 学习几个不同的弱学习器,并通过训练一个元模型来组合这些弱模型的输出,作为最终的预测结果。
Stacking 与 Bagging、Boosting 相比,主要 差异 如下:
- Stacking 主要使用 异质弱学习器(不同模型),而 Bagging 和 Boosting 主要使用 同质弱学习器
- Stacking 训练一个 元模型 来组合基础模型,而 Bagging 和 Boosting 则 根据 确定性算法 组合弱学习器
因此,为构建 Stacking 模型,需定义至少两部分(通常是 2 层)模型,分别是:
- 多个需要拟合的 弱学习器模型
- 一个用于组合各弱学习器模型的 元模型
例如,对于分类问题,可选 KNN、Logistic Regression、SVM 等作为弱分类器,并采用学习神经网络 NN 作为元模型。然后,神经网络将会把三个弱学习器的输出作为输入,并返回基于该输入的最终预测。所以,假设要拟合由 L 个弱学习器组成的 Stacking 集成模型,须遵循以下 步骤:
- 将训练数据分为两组;