一、集成学习
1. 统计学习中的衡量模型指标
1.1 偏差:学习到的模型和真实模型之间的位移
1.2 方差:学习到的东西差别有多大
1.3 示意图
1.4 偏差-方差公式
- 泛化误差: E d [ ( y − f ^ ( x ) 2 ) ] = B i a s [ f ^ ] 2 + V a r [ f ^ ] + σ 2 E_d[(y-\hat{f}(x)^2)] = Bias[\hat{f}]^2 + Var[\hat{f}]+\sigma^2 Ed[(y−f^(x)2)]=Bias[f^]2+Var[f^]+σ2(偏差平方+方差+误差)
1.5 模型-方差的权衡
- 一开始模型简单的时候,偏差比较大,模型变复杂,偏差下降
- 假设数据不变化,模型相对于数据更复杂,过多的关注数据的噪音,方差越来越大,导致过拟合
- 泛化误差是偏差和方差共同作用的结果
1.6 降低偏差和方差
1.6.1 降低偏差
- 说明模型不够复杂,使用复杂的模型
- Eg:增加神经网络的隐藏层个数、宽度
- Boosting、Stacking
1.6.2 降低方差
- 说明模型特别复杂,需要一个简单的模型
- 正则化,使用L1/L2正则化,限制范围
- Bagging、Stacking
1.6.3 降低噪音 σ \sigma σ
- 提升数据质量
1.6.4 集成学习:使用多个模型结合起来提升预测性能
包含Boosting、Bagging、Stacking
2. Bagging
-
每一次并行训练n个模型(base learner)
-
目的:降低方差
-
输出:回归问题(做平均值),分类问题(投票)
-
每个模型通过在训练集上进行boostrap采样出一个新数据集来进行训练得到
- 假设训练集有m个样本,在样本里面随机放回的采样m个样本
- 平均每次会有大约$1-\frac{1}{e} $的样本被采样到,剩下的样本(out of bag)用作验证集
2.1 随机森林
- 使用决策树作为模型(base learner)
- 通常还会随机采样一些特征列(30%、50%),不会选取所有的列(避免过拟合,增大树之间的差异性)
- 随着树个数n的增加,训练误差、验证误差都下降,误差不会上升
- 原因:降低了方差
2.2 不稳定模型(方差比较大的模型)
-
Bagging取平均会降低方差,尤其是对不那么稳定的模型(base learner)效果更好
-
决策树不稳定,线性回归稳定
3. Boosting
- 将多个弱一点的模型组合在一起变成强的模型
- 目的:降低偏差
- 顺序的训练n个弱模型
- 每次训练一个弱模型 h i h_i hi,评估他的误差 ϵ t \epsilon_t ϵt
- 根据误差 ϵ t \epsilon_t ϵt重新采样,关注那些预测的不正确的样本
- 知名算法AdaBoost、Gradient Boosting
3.1 Gradient Boosting
- 假设在时间t我的模型是 H t ( x ) H_t(x) Ht(x)初始值为0
- 当t=1
- 在参差数据上 ( x i , y i − H t ( x i ) i = 1 , . . . , m {(x_i,y_i-H_t(x_i)}_{i=1,...,m} (xi,yi−Ht(xi)i=1,...,m,训练一个新的小一点、弱一些的模型 F t ( x ) F_t(x) Ft(x)
- 下一个时刻t+1的模型
H
t
+
1
(
x
)
=
H
t
(
x
)
+
η
F
t
(
x
)
H_{t+1}(x) = H_t(x) + \eta F_t(x)
Ht+1(x)=Ht(x)+ηFt(x)
- η \eta η是学习率,用于正则化我的模型(收缩),防止过拟合
- 如果采用MSE作为损失函数,那么参差数据 ( x i , y i − H t ( x i ) i = 1 , . . . , m = − ∂ L ∂ H {(x_i,y_i-H_t(x_i)}_{i=1,...,m} = -\frac{\partial{L}}{\partial{H}} (xi,yi−Ht(xi)i=1,...,m=−∂H∂L
3.2 Gradient Boosting Decision Trees(GBDT)
- 使用决策树作为弱模型
- 用正则化来使得模型变弱,使用一个较小的max_depth、随机采样特征列
- 顺序训练比较慢,常见的库使用加速算法更快XGBoost、lightGBM
4. Stacking
- 使用多个不同的模型(base learner)来降低方差
- 把每个learner连接起来,然后做一个线性的组合(可以学习权重参数)
- 常用于竞赛中
- 和Bagging区别
- 模型种类不一样。Bagging在不同的数据上训练同样的模型,Stacking在同样的数据上训练不同的模型
- Bagging使用Boostrap采样得到多样性
- 只加入可以提升模型精度的模型进行stacking,模型不好的不需要加入
4.1 多层Stacking
- 使用多层来降低偏差
- 每一层可以使用不同的模型(base learner)
- 上面的层都是的输入都是根据下面层的输出结果进行训练的
- 也可以把原始数据也合并进去
- 多层数据很 容易过拟合
4.2 减轻多层Stacking导致的过拟合
-
训练不同层模型的数据不应该是同一份数据
-
解决办法:把训练集氛围A和B,在L1上用A训练用B做预测,第二层的输入(训练集)就是L1的输出+B
-
重复K折Bagging
-
和K折交叉验证一样把数据集分成k份,训练k个模型
-
把每一个模型在验证集上的输出保留下来,把所有的输出并起来,输入到下一层进行训练
-
进一步降低我的过拟合:把1、2重复n次,把并起来的三个值进行平均,进一步降低方差,再输入到下一层
-
4. 集成学习总结
- 目的是为了降低方差、偏差
- 模型对比