第六章——模型融合

6 模型融合

6.1 偏差和方差

  • 分布图

    第六章——模型融合

  • 公式推导:

    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表示噪音 ϵ表示噪音

    2. 在D上最小化MSE,得到 f ^ \hat{f} f^​。希望在不同的 D D D上都能生成一个好的 f ^ \hat{f} f^​

    3. 公式:
      因 为 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ϵEX

      KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ E_D[(y-\hat{f}…

  • 偏差—方差的均衡

    第六章——模型融合

  • 降低方差和偏差

    1. 降低偏差
      • 更大的模型
      • Boosting
      • Stacking
    2. 降低方差
      • 更简单模型
      • 正则化
      • Bagging
      • Stacking
    3. 降低 σ 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
  • 梯度提升树(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个预测值,再取平均放入下一层中
Reduce Bias(偏差) Variance(方差) 计算量 并行度
Bagging n n
Boosting n 1
stacking n n
multi-layer stacking nx/xk nxk

上一篇:ZooKeeper 工作流程


下一篇:机器学习算法系列(5)模型融合