集成学习
理解
集成学习是机器学习的一种思想,通过多个模型的组合形成一个精度更高的模型。
这些模型被叫做弱学习器(estimator),在集成学习里的弱学习器,并不像之前提到的预测模型一样会学习全部的样本(指训练)并直接推出最后的公式(指拟合,比如正规方程),而是交叉学习(Bagging),不会使用全部样本,每个弱学习器只学习部分样本,或者多次推导(Boosting)
这里的部分样本不仅是行(比如多少人),也包括列(有什么特征)。
举个Bagging的例子:
| A特征 | B特征 | |
|---|---|---|
| A弱学习器 | 1 | 0 |
| B弱学习器 | 0 | 1 |
| C弱学习器 | 0 | 0 |
强学习器(单个学习器预测)因为需要考虑每个特征,因此拟合出来的函数次数一般较高,容易过拟合。
弱学习器则是分别学习不同的特征,或成为单个领域的专家,最后联合投票,这样避免了过拟合的风险。
Bagging思想
bagging思想有以下几个特征:
- 有放回的随机抽样
- 平权投票
- 可以并行执行
刚刚已经说过交叉学习,这里的弱学习器便是交叉学习不同的样本,最后平权投票,最多票数的预测便是结果,这里的投票类似于KNN算法
比较有代表性的便是:
随机森林算法
这里其实没什么好讲的,说白了就是多课树一起预测,然后选一个票数最多的结果。
为什么要随机抽样训练集?
如果不进行随机抽样的话,每棵树训练集一样,那么最终分类的结果也是一样的。
为什么要有放回的抽样?
如果每棵树训练样本不同,那么没有交集,每棵树可能会被某些数据影响,是”有偏的“,训练出来有很大差异,而随机森林最好的投票结果取决于多棵数。
可能需要用到的包
from sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifier需要注意的是参数里面的Max_depth不要过深,最好便是默认的1,如果到3以上基本已经属于强学习器的范畴,在样本本来就分的不是很多的情况下,2^3=8,已经将样本分为了8类,基本上对于数据影响较大的特征都会被遍历,那么学习器会开始趋同。
Boosting思想
Boosting思想有以下几个特征:
- 每次训练都会使用全部样本
- 加权投票 -> 预测正确:样本权重降低 预测错误:样本权重增加
- 只能串行执行
boosting思想里面的算法就很多了,我们依次讲解。
Adaboost
Adaboost里面的弱学习器的投票是有权重的,权重取决于错误率,错误率越高的模型,投票的权重越低。
这里的at便是模型的权重,我们可以拆解成如下形式:
这里的错误率是怎么来的呢?就是预测错误的/总数吗?
其实也不是,我们在Boosting思想里可以看到,样本是有权重的,这里的错误率,是:
可以比喻为做题,错误的题老师会重点讲解,这就是权重上升,对的题老师都不怎么讲,这就是权重下降。
这里样本的权重是怎么更新的呢?
看着依旧复杂,我们翻译一下:
那怎么开始预测呢?
一开始样本权重是相同的。
假设标签为01,现在有:
| x (特征) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 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,右边为0(需要注意的是左边也可以为0,右边为1,具体取决于错误率)
这里错误率最小分别是在2.5和8.5
根据奥卡姆剃刀原理,我们选择最简分法,也就是2.5
此时模型错误率是0.3,就可以算出模型权重和下一轮样本权重
那么更新了一轮权重,接下来是:
| 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 |
以此类推,最后对于一个未知的标签,预测的结果就是:
继续翻译一下:
<0则代表为-1,>0则代表为1
GBDT梯度提升树
相较于AdaBoost给错误的数提升权重,GBDT则是直接让下一颗树专门去预测上一颗树算错的值,也就是残差.
和梯度下降类似,导数为0的时候,便是损失最小的时候。
可以发现,负残差正好是导数为0的解。
具体的算法便是先用目标值的平均值当作预测值,然后计算残差,然后计算平方损失,取平方损失最小的点,作为下一轮计算的切分点,取残差作为下一轮目标值,计算切分点两侧的平均数作为预测值,计算残差,再取平方损失最小处作为下一轮切分点…以此类推。
未完待续
部分信息可能已经过时




