文章目录
一、什么是集成学习
综合多方面的意见来做出决策。
比如:买东西推荐、专家会诊疾病。
根据各种算法做出决策:KNN,逻辑回归,SVM,决策树,神经网络,贝叶斯;
sklearn 中提供的方法称为 Voting Classifier 。
集成学习的思路:
- Voting
- Bagging
- 随机森林 - Boosting
- Stacking
二、算法介绍
1、Hard & Soft Voting
Hard 模式即 (分类)少数服从多数;(回归)取平均值。
Soft:有权值。要求集合的每一个模型 都能估计概率。
SVC 没有直接计算概率;如果把参数 probability 设置为 true,就会去计算(消耗更多计算资源)。
创建更多子模型
虽然有很多机器学习方法,但从投票的角度来看,仍然不够多。
需要创建更多的子模型,集成更多的子模型的意见;子模型之间不能一致,需要有差异性。
如何创建差异性?每个子模型只看样本数据的一部分。
例如:一共有 500 个样本数据,每个子模型只看 100个样本数据。
每个子模型并不需要太高的准确率,但至少要比平均水平高。为什么?
如果每个子模型只有 51%的准确率,只有一个子模型时,整体准确率 50%;
有3个子模型,整体准确率:
0.5
1
3
+
C
3
2
⋅
0.5
1
2
⋅
0.49
0.51^3 + C_3^2 \cdot 0.51^2 \cdot 0.49
0.513+C32⋅0.512⋅0.49 --> 51.5%;虽然提高不多,但是有提高。
如果有 500 子模型,整体准确率
∑
5
0
0
i
=
251
C
5
0
0
i
⋅
0.5
1
I
⋅
0.4
9
500
−
i
\sum^500_{i=251} C_500^i \cdot 0.51^I \cdot 0.49^{500-i}
∑500i=251C500i⋅0.51I⋅0.49500−i --> 65.6%
如果每个子模型准确率达到 60%,500个模型的整体准确率达到 99.999%
2、Bagging 和 Pasting
怎么看样本数据的一部分?两种方式:
- 放回取样(更常用): Bagging;统计学中叫做 boostrap;
- 不放回取样 Pasting;
为什么放回取样更常用?
- 放回取样可以分成更多类别。
- Pasting 不放回,那么500个样本分为5个时,非常依赖于 如何划分样本。相比之下,Bagging 没有那么依赖随机。
OOB
OOB : Out-of-Bag
放回取样导致一部分样本很可能没取到(平均大约有 37% 的样本没有取到),没有取到的样本也称为 OOB。‘
所以在使用 Bagging 的过程中,就不需要 train_test_split 了,而使用这部分 从没有被取过的样本
来做 测试/验证。
sklearn 中的属性 oob_score_
可以看到用 oob 作为测试数据集,得到的结果。
并行计算
Bagging 的思路极易进行并行化处理,sklearn 中对于可以并行的算法,一般传入 n_jobs
属性。
差异化
之前让子模型产生差异化的方式,是去看更小的样本数据集。其实还有其他方式,如:
- 针对特征进行随机采样 Random Subspaces
一般应用在样本特征非常多的情况下,比如图像识别领域,图片上每一个像素点都是一个特征,这样每一个样本相应的特征量就比较大。
所有特征构成特征空间,对特征 来随机采样;可以说是在子空间(Subspaces)中进行取样。
在特征空间上进行采样,又可以称为 bootstrap_features。
- 既针对样本,又针对特征进行随机采样 Random Patches
既在行(样本)的维度上随机采样,又在列(特征)的维度上随机采样;看起来就像是一块布上的补丁(Patches)
以上这样的集成方式,有个非常形象的名字,叫做 随机森林。
在这个 BaggingClassifier 中有五百棵树,每棵树看到的样本都是不同的,所以每棵树都有一定的随机性。由多个这样的树组成的森林,也叫随机森林。
随机森林
在 Bagging 中,基础评估算法(Base Estimator) 都是 决策树(Decision Tree);
整个集成学习相当于集成了成百上千个决策树;对于这样的集成学习,一般形象称为 随机森林
。
sklearn 专门封装了一个类 来更方便的创建一个 随机森林的学习模型。
每一个决策树,实际上都是在某一个节点上进行划分。sklearn 的随机森林模型,决策树在节点划分上,在随机的特征子集上,寻找最优划分特征。而不是在每一个节点上,都在所有的特征上去寻找最优划分。
创造差异的方式是增加随机性,sklearn 这样的封装方式,进一步增加了随机性。
Extra-Trees
全称为 extreme random trees,极其随机的森林。
极其随机表现在:决策树在节点的划分上,使用随机的特征 和 随机的阈值 进行划分。
每一颗树的形状和差异会非常大。
优点:提供额外的随机性,抑制过拟合,但增大了 bias。比随机深林 有更快的训练速度。
3、Boosting
集成多个模型,和 Bagging 不同的是,每个模型都在尝试增强(Boosting)整体的效果,而非模型之间独立的关系。
下面以 Ada Boosting 为例说明。
Ada Boosting
浅色的点是被预测成功的,深色是和模型差距比较远的样本点。
让数据和数据之间产生了权重的差别,提高上一次没被学习到的点的权值,已学习的权值减少些;以形成新的样本数据 再使用某种算法进行学习。
每一次生成的子模型,都在想办法弥补 上一次没有被有被成功预测的样本点。
如何赋权值?可以转化为求极值的问题。
Gradient Boosting
- 针对整体数据集训练一个模型 m1,产生错误 e1;
- 针对 e1 训练第二个模型 m2,产生错误 e2;
(m2 的作用就是能预测出 模型m1 犯的错误是什么;就是说 m2 样本的输出值 是 m1 所犯的错误; m2 拟合 e1 也会犯错误,称为 e2) - 针对 e2 训练第三个模型 m3,产生错误 e3;
- 最终预测结果是: m1 + m2 + m3 + …
m1,m2,m3 这每一个模型都是对前一个模型所犯错误的补偿;
4、Stacking
在三个模型的预测结果,再添加一层算法,用新模型的训练结果作为最终输出。
如何训练 Stacking
以上述为例,将数据分为两部分;一份用来训练三个模型,第二份数据 给训练好的三个模型中输出结果;这个输出结果,和第二份数据中的真值形成新的数据集,用心的数据集来训练 第四个模型;最终形成 Stacking 集成学习模型。
还可以构建更复杂的 stacking 模型,比如:
有多少层,分多少分数据。层数是一个超参数。
由于复杂性,非常容易过拟合。
这样非常像神经网络,只是对于神经网络,每一个神经元不是全新算法,只是计算函数的值而已。
神经网络的层数增多,就是深度学习;会产生很多问题,需要在深度学习中探讨如何解决过拟合的问题。
sklearn 中没有提供接口来实现 stacking 算法。