8.1 个体和集成
集成学习 (ensemble learning) 通过构建并结合多个学习器形成一个精度更高的学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system) 、基于委员会的学习(committee-based learning) 等。
图8.1 显示出集成学习的一般结构:先产生一组"个体学习器" (individual learner) ,再用某种策略将它们结合起来.个体学习器通常由一个现有的学习算法从训练数据产生,例如 C4.5 决策树算法、 BP 神经网络算法等,此时集成中只包含同种类型的个体学习器,例如"决策树集成"中全是决策树,"神经网络集成"中全是神经网络,这样的集成是"同质"(homogeneous) 。同质集成中的个体学习器亦称"基学习器" (base learner),相应的学习算法称为"基学习算法" (base learning algorithm). 集成也可包含不同类型的个体学习器,例如同时包含决策树和神经网络,这样的集成是"异质"的 (heterogenous) 。异质集成中的个体学习器由不同的学习算法生成,这时就不再有基学习算法;相应的,个体学习器一般不称为基学习器,常称为"组件学习器" (component learner) 或直接称为个体学习器。
在一般的经验中,如果把好坏不等的东西掺到一起,那么通常结果会是比最坏的要好一些,比最好的要坏一些。集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能,这对“弱学习器”尤为明显。例如,在二分类任务中,假定三个分类器在三个测试样本上的表现如图 8.2 所示,其中表示分类正确,X 表示分类错误,集成学习的结果通过投票法(voting) 产生,即"少数服从多数“。
- 在图 a 中,每个分类器都只有 66.6% 的精度,但集成学习却达到了 100%;
- 在图 b 中,三个分类器没有差别,集成之后性能没有提高;
- 在图 c 中,每个分类器的精度都只有33.3% ,集成学习的结果变得更糟。
这个简单的例子显示出:要获得好的集成,个体学习器应"好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”(diversity),即学习器具有差异。事实上,个体学习器的"准确性"和"多样性"本身就存在冲突。一般的,准确性很高之后,要增加多样性就需牺牲准确性。事实上,如何产生并结合"好而不同"的个体学习器,恰是集成学习研究的核心。
根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:
- Boosting
- 个体学习器问存在强依赖关系、必须串行生成的序列化方法
- Adaboost、GBDT、XGBoost、LightGBM
- Bagging
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法
- "随机森林" (Random Forest)
- 自举采样:给定包含 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过次随机采样操作,我们得到含 个样本的采样集,初始训练集中有的样本在采个样集里多次出现,有的则从未出现。初始采样集中约有63.2%的样本出现在采样集中
- 聚合:照这样,我们可采样出 个含 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
- 结果投票:在对预测输出进行结合时, Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则通常是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。
- sklearn.ensemble.RandomForestClassifier()
- n_estimators:决策树数量,(default = 10)
- Criterion: entropy、或者 gini,(default = gini)
- max depth:指定树的最大深度,(defaut = None 表示树会尽可能的生长)
- max features="auto”决策树构建时使用的最大特征数量
- lf "auto",then max features=sqrt(n_features).
- lf "sqrt", then max features=sqrt(n features)(same as "auto").
- lf "og2",then max features=log2(n_features)
- lf None,then max features=n features
- bootstrap:是否采用有放回抽样,如果为 False 将会使用全部训练样本,(default = True)
- min_samples_split: 结点分裂所需最小样本数,(default = 2)
- 如果节点样本数少于min_samples_split,则不会再进行划分
- 如果样本量不大,不需要设置这个值.
- 如果样本量数量级非常大,则推荐增大这个值.
- min_samples_leaf: 叶子节点的最小样本数,(default = 1)
- 如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝.
- 较小的叶子结点样本数量使模型更容易捕捉训练数据中的噪声
- min impurity_split: 节点划分最小不纯度
- 如果某节点的不纯度(基尼系数,均方差)小于这个闻值,则该节点不再生成子节点,并变为叶子节点
- 一般不推荐改动默认值1e-7。
8.2 Bagging
顾名思义,bagging算法由自举采样(bootstrap sampling)和聚合两部分组成。
1、样本为被采集到的概率 假设数据集的大小为,每次从中有放回的采出了允许重复的有放回采样。那么某个样本没有被采样到的概率为:2、包外样本 自举采样过程中剩下未被采样的36.8%的样本可用作验证集来对泛化性能进行"包外估计" (out-oιbag estimate)。为此需记录每个基学习器所使用的训练样本。另外,包外样本还有许多其他用途。例如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险。
8.2.1 随机森林算法
随机森林(Random Forest ,简称 ) Bagging的一个扩展变体。在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有 个属性)中选择一个最优属性;而在 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含个属性的子集,然后再从这个子集中选择一个最优属性用于划分,这里的参数控制了随机性的引入程度:若令,则基决策树的构建与传统决策树相同;若令,则是随机选择一个属性用于划分;一般情况下,推荐值。
随机森林简单、容易实现、计算开销小,令人惊是,它在很多现实任务中展现出强大的性能,被誉为"代表集成学习技术水平的方法",可以看出,随机森林对Bagging只做了小改动,但是与 Bagging 基学习器的"多样性"仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
随机森林的收敛性与 Bagging 相似。如下图所示 ,随机森林的起始性能往往相对较差, 特别是在集成中只包含一个基学习器时这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低然而,随着个体学习器数目增加,随机森林通常会收敛到更低的泛化误差。值得一提的是,随着随机森林的训练效率常优于 Bagging,因为在个体决策树的构建过程中 Bagging使用的是“确定型” 决策树,在选择划分属性时要对结点的所有属性进行考察,而随森林使用的" 随机型"决策树则只需考察属性子集。
1、随机森林API
2、随机森林案例-泰坦尼克号
8.3 Boosting
Boosting 是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值,最终将这个基学习器进行加权结合。
8.3.1 AdaBoosting
优点:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。 缺点:对离群点敏感。 适用数据类型:数值型和标称型数据。
AdaBoost是adaptive boosting(自适应boosting)的缩写,其运行过程如下:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量
- 初始化训练数据权重相等,然后训练出一个弱分类器
- 对样本的特征值进行排序后根据不同的分裂点计算错误率,并将最小错误率对应分裂点为最优分裂点。错误率为:
- 计算分类器的的权重:
- 计算分类器中各样本的权重:
其中为归一化值(所有样本权重之和)
- 在分类器的第二次训练当中(依据最优分裂点),将会重新调整每个样本的权重,其中第一次分对的样本的权重将会降低,而第一次分错的样本的权重将会提高。然后再次重复上述步骤,训练分类器。
- 训练出个弱分类器后进行集成:
其中,为分类器权重,输出结果大于0则归为正类,小于0则归为父类。
1、 Adaboot算法构建过程
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
1.1 初始工作:初始化10个样本的权重,每个样本的权重为:0.1
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
w | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
1.2 构建第一个学习器:
1.2.1 寻找最优分裂点
对特征x进行排序,确定分裂点为:0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5,计算错误率最小的分裂点,并依次点分裂。
分裂点 | 0.5 | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 |
分类错误样本数 | 4 | 4 | 3 | 4 | 4 | 4 | 4 | 4 | 3 |
错误率 | 0.4 | 0.4 | 0.3 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.3 |
以分裂点为切分,计算标记1或者-1为错误样本的标准为,1或者-1在该类别中的权重和,权重和小的即为预测错的样本数。这里,最终选择以2.5作为分裂点。
1.2.2 计算模型权重
1.2.3 更新样本权重
- 分类正确样本为:1、2、3、4、5、6、10共7个,其计算公式为:et,则正确样本权重变化系数为:e-0.4236 =06547
- 分类错误样本为:7、8、9共3个,其计算公式为:e,则错误样本权重变化系数为e0.4236 = 1.5275
- 样本1、2、3、4、5、6、10 权重值为: 0.06547
- 样本7、8、9的样本权重值为: 0.15275
- 归一化Zt 值为: 0.06547 * 7 + 0.15275 * 3 = 0.9165
- 样本1、2、3、4、5、6、10 最终权重值为:0.07143
- 样本7、8、9的样本权重值为: 0.1667
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
w | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.07143 | 0.16667 | 0.16667 | 0.16667 | 0.07143 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
1.3 构建第2个学习器
1.3.1 计算获得最优分裂点为8.5, 错误率为0.21429
1.3.2 计算模型权重:1/2 * np.log((1-0.21429)/0.21429)=0.64963
1.3.3 分类正确的样本:1、2、3、7、8、9、10,其权重调整系数为: 0.5222
1.3.4 分类错误的样本:4、5、6,其权重调整系数为: 1.9148
1.3.5 分类正确样本权重值:
1.样本0、1、2、9为: 0.0373
2.样本6、7、8为:0.087
1.3.6 分类错误样本权重值: 0.1368
1.3.7 归一化值为: 0.0373 * 4 + 0.087 *3 + 0.1368 * 3 = 0.8206
1.3.8 最终权重
- 样本0、1、2、9为:0.0455
- 样本6、7、8为:0.1060
- 样本3、4、5为:0.1667
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
w | 0.0455 | 0.0455 | 0.0455 | 0.16667 | 0.16667 | 0.16667 | 0.1060 | 0.1060 | 0.1060 | 0.0455 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
1.4 构建构建第三个弱学习器
最优分裂点为5.5 错误率为0.1820 模型权重为0.7514
1.5 最终强学习器
若的值大于则归于正类;的值小于归于负类
带入公式为 :负类
2、 使用场景
- Adaboost算法一般用来做二分类,特别在视觉领域应用较多
- AdaBoost算法使用的树深度不要过深,否则容易过拟合
3、 案例-葡萄酒好坏预测
数据准备:
- 需求:已知葡萄酒数据,根据数据进行葡萄酒分类
- 分析思路
- 读数据到内存
- 特征处理
- 修改列名
- Adaboost一般做二分类 去掉一类(1,2,3)
- 类别转化 (2,3)=>(0,1)
- 划分数据
- 实例化单决策树 实例化Adaboost-由500颗树组成
- 单决策树训练和评估
- AdaBoost训练和评估
- 代码:
8.3.2 梯度提升树(Gradient Boosting Decision Tree)
提升树: 通过拟合残差的思想来进行提升(残差:真实值 - 预测值)
梯度提升树,顾名思义,是利用损失函数的负梯度在当前模型的值作为残差的一个近似值,进行拟合回归树,这样只要可以求梯度的函数,我们都可以进行求解。
假设:
- 前一轮迭代得到的强学习器是:
- 损失函数为平方损失是:
- 本轮迭代的目标是找到一个弱学习器:
- 当前迭代的模型
- 那么即为在本轮的模型残差
- 当前轮的损失函数
- 对损失函数进行泰勒展开:
令:,则可以保证,上式后面的部分减去的一定是正数,,所以这样取负梯度,可以使得一步步的降低,理论上这种方法是有效的。