6 模型融合
6.1 偏差和方差
-
分布图
-
公式推导:
-
假设从 y = f ( x ) + ϵ y = f(x) + \epsilon y=f(x)+ϵ采样得到 D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D = \{(x_1,y_1),...,(x_n,y_n)\} D={(x1,y1),...,(xn,yn)}, ϵ 表 示 噪 音 \epsilon表示噪音 ϵ表示噪音
-
在D上最小化MSE,得到 f ^ \hat{f} f^。希望在不同的 D D D上都能生成一个好的 f ^ \hat{f} f^
-
公式:
因 为 f 是 一 个 真 实 的 东 西 , 不 会 随 着 采 样 变 化 而 变 化 , 因 此 E f = f 假 设 噪 音 符 合 一 个 均 值 为 0 , 方 差 为 σ 2 的 正 态 分 布 ϵ 相 较 于 f ^ 时 独 立 的 , 因 此 E ϵ X = E ϵ E X 因为f是一个真实的东西,不会随着采样变化而变化,因此Ef = f \\ 假设噪音符合一个均值为0,方差为\sigma^2的正态分布 \\ \epsilon相较于\hat{f}时独立的,因此E\epsilon X = E\epsilon EX 因为f是一个真实的东西,不会随着采样变化而变化,因此Ef=f假设噪音符合一个均值为0,方差为σ2的正态分布ϵ相较于f^时独立的,因此EϵX=EϵEXKaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ E_D[(y-\hat{f}…
-
-
偏差—方差的均衡
-
降低方差和偏差
- 降低偏差
- 更大的模型
- Boosting
- Stacking
- 降低方差
- 更简单模型
- 正则化
- Bagging
- Stacking
- 降低
σ
2
\sigma^2
σ2
- 提升数据质量
- 降低偏差
6.2 Bagging
-
Bagging - Bootstrap AGGregratING
- 并行训练多个学习器
- 输出综合采用多个学习器,分类(投票法),回归(结果求均值)
- 通过在训练集上bootstrap采样:
- 在m个样本中,有放回的随机采样m个
- 大约 1 − 1 / e ≈ 63 % 1-1/e \approx 63\% 1−1/e≈63%样本会被采样到,未被采样到的作为验证集
- ( 1 − 1 n ) n 当 n 趋 于 正 无 穷 时 等 于 1 / e , 该 式 表 示 一 个 样 本 不 被 采 样 的 概 率 (1-\frac{1}{n})^n当n趋于正无穷时等于1/e,该式表示一个样本不被采样的概率 (1−n1)n当n趋于正无穷时等于1/e,该式表示一个样本不被采样的概率
-
Bagging Code
class Bagging: def __init__(self, base_learner, n_learners): """ base_learner: 基础学习器 n_learners: 学习器个数 """ self.learners = [clone(base_learners) for _ in range(n_learners)] def fit(self, X, y): for learner in self.learners: examples = np.random.choice( np.arrange(len(X)),int(len(X)), replace=True) def predict(self, X): preds = [learner.predict(X) for learner in self.learners] return np.arrary(preds).mean(axis=0)
-
随机森林
- 使用决策树作为基学习器
- 随机选择一些特征
- 降低方差,也不会降低偏差
-
不稳定的学习器
-
Bagging 降低方差,特别是对于不稳定的学习器
-
为什么不稳定的学习器 Bagging后方差更小?
E [ X ] 2 ≤ E [ X 2 ] ( f ( x ) − f ^ ( x ) ) 2 ≤ E [ ( f ( x ) − f ^ D ( x ) ) 2 ] ⇔ f ^ ( x ) 2 ≤ E [ f ^ D ( x ) 2 ] \begin{aligned} &\mathrm{E}[X]^{2} \leq \mathrm{E}\left[X^{2}\right] \\ &(f(x)-\hat{f}(x))^{2} \leq \mathrm{E}\left[\left(f(x)-\hat{f}_{D}(x)\right)^{2}\right] \Leftrightarrow \hat{f}(x)^{2} \leq \mathrm{E}\left[\hat{f}_{D}(x)^{2}\right] \end{aligned} E[X]2≤E[X2](f(x)−f^(x))2≤E[(f(x)−f^D(x))2]⇔f^(x)2≤E[f^D(x)2]
-
6.3 Boosting
-
Boosting
- Boosting结合弱的学习器变成一个强的学习器
- 为了降低偏差,不同于Bagging降低方差
- 顺序地学习
n
n
n个弱分类器
- 在第 i i i步,训练一个弱学习器 h i h_i hi,衡量它的错误 ϵ t \epsilon_t ϵt
- 重新采样,根据 ϵ t \epsilon_t ϵt去关注那些未能正确预测的样本
- 例如:AdaBoost、gradient boosting
- Boosting结合弱的学习器变成一个强的学习器
-
梯度提升树(gradient boost)
- 定义模型在时间 t t t为, H t ( x ) H_t(x) Ht(x), H 1 ( x ) = 0 H_1(x)=0 H1(x)=0
- 训练过程中:
- 在集合 { ( 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上(残差集合上),训练残差模型 h t h_t ht
-
H
t
+
1
(
x
)
=
H
t
(
x
)
+
η
h
t
(
x
)
H_{t+1}(x) = H_t(x) + \eta h_t(x)
Ht+1(x)=Ht(x)+ηht(x)
- 学习率 η \eta η正则化模型通过shrinkage
-
实现
class GraadientBoosting: def __init__(self, base_learner, n_learners, learning_rate): self.learners = [clone(base_learner) for _ in range(n_learners)] self.lr = learning_rate def fit(self, X, y): residual = y.copy() for learner in self.learners: learner.fit(X, residual) residual -= self.lr * learner.predict(X) def predict(self, X): preds = [learner.predict(X) for learner in self.learners] return np.array(preds).sum(axis=0) * self.lr # 对预测结果求和乘以学习率
-
Gradient Boosting Decision Trees (GBDT)
- 使用决策树作为弱学习器
- 通过一个小的最大深度和随机采样特征来正则化
- 序列地建树比较慢
- 加速算法,例如:XGBoost和lightGBM
- 使用决策树作为弱学习器
6.4 stacking
-
stacking
- 结合多个基础学习器降低方差
- 基础学习器可以是不同的模型
- 通过可学习的参数,线性结合基础学习器的输出
- 和bagging的不同点
- bagging使用相同类型的模型
- 使用bootstrap去获得多样性
- 结合多个基础学习器降低方差
-
多层stacking
- 多层stacking可以降低偏差
- 将第一层stacking的输出看成是特征送入下一层的stacking中(第二层的输入是基于上一层的输出,离最后的标号很近了,所以下一层训练起来会比较容易),这样可以把没有训练好的地方重新训练
- 在这里也会将原始的特征直接与第一层的输出一起送入下一层
- 多层stacking很容易过拟合(同一份数据又送进去学了一遍)
-
多层stacking容易过拟合
-
在不同层使用不同的数据进行训练
- 例如:将数据划分为A和B,在A上训练L1学习器,然后通过预测B来生成L2学习器的输入。
-
重复的K-fold bagging
- 像k折交叉验证一样,将数据集分成k份,每一次在k-1份上训练,再用第k份做验证,这样可以训练k个模型
每个模型用这个方法训练了一次 所以每次训练了是k*n个小模型 - 更加昂贵的做法,对上述的做法重复做n次k折交叉验证,这样可以拿到n个预测值,再取平均放入下一层中
- 像k折交叉验证一样,将数据集分成k份,每一次在k-1份上训练,再用第k份做验证,这样可以训练k个模型
-
Reduce | Bias(偏差) | Variance(方差) | 计算量 | 并行度 |
---|---|---|---|---|
Bagging | √ | n | n | |
Boosting | √ | n | 1 | |
stacking | √ | n | n | |
multi-layer stacking | √ | √ | nx/xk | nxk |