funmore233

随机森林

之前所述的集成学习方法中的 boosting 方法迭代地学习一系列弱学习算法, 并且当前弱学习算法依赖于上一轮学习器的学习过程, 然后组合这些弱学习器, 构成一个强学习器, boosting 方法是串行的. 另一种集成学习方法是 bagging 方法, bagging 是并行集成学习方法最著名的代表, 它从训练样本集中有放回抽样得到若干个采样集, 基于每个采样集独立地学习到对应的弱学习算法, 最后将这些弱学习算法进行结合.

自助采样法 (Bootstrap sampling)

Bagging 的随机采样使用的是自助法 (bootstrapping), 它直接以自助采样法 (bootstrap sampling) 为基础. 给定包含 \(N\) 个样本的数据集 \(D\), 每次随机从 \(D\) 中挑选一个样本, 将其拷贝放入 \(D^{\prime}\), 然后再将该样本放回初始数据集 \(D\) 中, 使得该样本在下次采样时仍有可能被采到. 这个过程重复执行 \(N\) 次后, 就得到了包含 \(N\) 个样本的数据集 \(D^{\prime}\), 这就是自助采样的结果. 显然, \(D\) 中有一部分样本会在 \(D^{\prime}\) 中多次出现, 而另一部分样本不出现. 可以估计某样本在 \(N\) 次采样中始终不被采到的概率是 \((1-\frac{1}{N})^N\), 取极限得到

\[\lim_{N \rightarrow \infty} (1-\frac{1}{N})^N = \frac{1}{e} \approx 0.368 \]

即通过自助采样初始数据集 \(D\) 中约有 \(36.8\%\) 的样本未出现在采样数据集 \(D^{\prime}\) 中. 于是可将 \(D^{\prime}\) 用作训练集, \(D \setminus D^{\prime}\) 用作测试集. 这样实际评估的模型与期望评估的模型都使用 \(N\) 个训练样本, 而我们仍有数据总量约 \(1/3\) 的没在训练集中出现的样本用于测试. 这样的测试结果, 也称包外估计 (out-of bag estimate). 自助法在数据集较小, 难以有效划分训练集和测试集时很有用. 此外, 自助法能从初始数据集中产生多个不同的训练集, 这对集成学习等方法有很大的好处. 然而, 自助法产生的数据集改变了初始数据集的分布, 这会引入估计偏差.

bagging 算法流程

下面对 bagging 算法进行总结, 输入训练集 \(D = \{ (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \cdots, (\mathbf{x}_N, y_N) \}\) 和弱学习算法, 指定训练轮数 \(T\), 输出最终的强学习算法 \(f(\mathbf{x})\).

  • 对每一轮 \(m = 1,2,\cdots,M\), 依次执行
    1. 对训练数据集 \(D\) 进行第 \(m\) 次随机采样, 共采集 \(N\) 次, 得到包含 \(N\) 个样本的采样集 \(D_m\).
    2. 用采样集 \(D_m\) 训练第 \(m\) 个弱学习算法 \(G_m(\mathbf{x})\).
  • 如果是分类算法预测, 则 \(M\) 个弱学习器投出最多票数的类别或者类别之一为最终类别. 如果是回归算法, \(M\) 个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出.

随机森林算法

随机森林 (Random Forest, RF)是 Bagging 算法的一个扩展变体. RF 在以 CART 决策树为基学习器构建 Bagging 集成的基础上, 进一步在决策树的训练过程中引入了随机属性选择. 具体来说, 传统决策树在选择划分属性时是在当前结点的属性集合 (假定有 \(d\) 个属性) 中选择一个最优属性. 而在 RF 中, 对基决策树的每个结点, 先从该结点的属性集合中随机选择一个包含 \(k\ (k \leq d)\) 个属性的子集, 然后再从这个子集中选择一个最优属性用于划分, 这样进一步增强了模型的泛化能力. 这里的参数 \(k\) 控制了随机性的引入程度, 若 \(k=d\), 则基决策树的构建与传统决策树相同, \(k\) 越小, 模型的方差 (variance) 会减少, 但是偏差 (bias) 会增大, 在实际案例中,一般会通过交叉验证调参获取一个合适的 \(k\) 值.

下面对随机森林算法进行总结, 输入训练集 \(D = \{ (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \cdots, (\mathbf{x}_N, y_N) \}\) 和弱学习算法迭代次数 \(T\), 输出为最终的强学习算法 \(f(\mathbf{x})\).

  • 对每一轮 \(m = 1,2,\cdots,M\), 依次执行
    1. 对训练数据集 \(D\) 进行第 \(m\) 次随机采样, 共采集 \(N\) 次, 得到包含 \(N\) 个样本的采样集 \(D_m\).
    2. 用采样集 \(D_m\) 训练第 \(m\) 个决策树模型 \(G_m(\mathbf{x})\), 在训练决策树模型的节点的时候, 在节点上所有的样本特征中随机选择一部分样本特征, 再从这些样本特征中选择一个最优的特征来对决策树左右子树进行划分.
  • 如果是分类算法预测, 则 \(M\) 个弱学习器投出最多票数的类别或者类别之一为最终类别. 如果是回归算法, \(M\) 个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出.

偏差与方差

学习算法的预测误差, 或者说泛化误差 (generalization error) 可以分解为三个部分: 偏差 (bias), 方差 (variance) 和噪声 (noise). 在估计学习算法性能的过程中, 主要关注偏差与方差, 因为噪声属于不可约减的误差 (irreducible error).

random_forest_bias_var
偏差与方差图示

偏差-方差分解 (bias-variance decomposition) 是解释学习算法泛化性能的一种重要工具. 对测试样本 \(\mathbf{x}\), 令 \(y_D\)\(\mathbf{x}\) 在数据集中的标记, \(y\)\(\mathbf{x}\) 的真实标记, \(f(\mathbf{x};D)\) 为在训练集 \(D\) (这里的训练集 \(D\) 是随机变量,因为总是从样本总体采集到的部分样本, 因此 \(f(\mathbf{x};D)\) 也是随机变量) 上学到的模型 \(f\) 在给定测试样本 \(\mathbf{x}\) 上的预测输出. 以回归任务为例, 学习算法的期望预测 (不同的训练集 \(D\) 会学习到不同的模型 \(f\), 这里是指学习到的所有模型预测的期望) 为:

\[\overline{f}(\mathbf{x}) = \mathbb{E}_D[f(\mathbf{x};D)] \]

样本数相同的不同训练集产生的方差 (variance, 对于不同的训练集, 预测值在期望预测附近波动的情况):

\[\text{var} = \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] \]

噪声为 (噪声指的是数据集中的标记 \(y_D\) 可能与真实标记 \(y\) 不一致, 例如人工标记错误):

\[\varepsilon^2 = \mathbb{E}_D \left[ (y_D-y)^2 \right] \]

期望输出与真实标记的差别称为偏差 (bias), 即:

\[\text{bias}^2 = (\overline{f}(\mathbf{x}) - y)^2 \]

为了便于讨论, 假定噪声期望为 \(0\), 即 \(\mathbb{E}_D \left[ y_D-y \right]=0\). 通过简单的多项式展开与合并, 模型期望泛化误差分解如下:

\[\begin{aligned} E(f;D) &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - y_D)^2 \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}) + \overline{f}(\mathbf{x}) - y_D)^2 \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] + \mathbb{E}_D \left[ (\overline{f}(\mathbf{x}) - y_D)^2 \right] + \mathbb{E}_D \left[ 2(f(\mathbf{x};D) - \overline{f}(\mathbf{x}))(\overline{f}(\mathbf{x}) - y_D) \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] + \mathbb{E}_D \left[ (\overline{f}(\mathbf{x}) - y_D)^2 \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] + \mathbb{E}_D \left[ (\overline{f}(\mathbf{x}) -y + y - y_D)^2 \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] + \mathbb{E}_D \left[ (\overline{f}(\mathbf{x}) -y)^2 \right] + \mathbb{E}_D \left[ (y - y_D)^2 \right] + \mathbb{E}_D \left[ 2(\overline{f}(\mathbf{x}) -y)(y - y_D) \right]\\ &= \mathbb{E}_D \left[ (f(\mathbf{x};D) - \overline{f}(\mathbf{x}))^2 \right] + \mathbb{E}_D \left[ (\overline{f}(\mathbf{x}) -y)^2 \right] + \mathbb{E}_D \left[ (y - y_D)^2 \right] \end{aligned} \]

也就是:

\[E(f;D) = \text{bias}^2 + \text{var} + \varepsilon^2 \]

也就是说, 泛化误差可以分解为偏差 (bias), 方差 (variance) 与噪声 (error) 之和. 其中偏差度量了学习算法的期望预测与真实结果的偏离程度, 即刻画了学习算法本身的拟合能力. 方差度量了同样大小的训练集的变动所导致的学习性能的变化, 即刻画了数据扰动所造成的影响, 也就是学习算法的稳定性. 噪声表达了当前任务上任何模型所能达到的期望泛化误差的下界, 刻画了学习问题本身的难度.

偏差-方差分解说明, 泛化性能是由学习算法的能力, 数据的充分性以及学习任务本身的难度所共同决定的. 给定学习任务, 为了取得好的泛化性能, 则需使偏差较小, 即能够充分拟合数据, 并且使方差较小, 即使得数据扰动产生的影响小. 一般来说, 偏差与方差是有冲突的, 这称为偏差-方差窘境 (bias-variance dilemma),下给出了一个示意图. 给定学习任务, 假定我们能控制学习算法的训练程度, 则在训练不足时, 学习器的拟合能力不够强, 训练数据的扰动不足以使学习器产生显著变化, 此时偏差主导了泛化错误率; 随着训练程度的加深, 学习器的拟合能力逐渐增强, 训练数据发生的扰动渐渐能被学习器学到, 方差逐渐主导了泛化错误率; 在训练程度充足后, 学习器的拟合能力已非常强, 训练数据发生的轻微扰动都会导致学习器发生显著变化, 若训练数据自身的, 非全局的特性被学习器学到了, 则将发生过拟合.

random_forest_err_decomposition
泛化误差与偏差, 方差的关系示意图

Bagging 与 Boosting 比较

Bagging 减少方差

一般来说, Bagging 减少 variance, 而 Boosting 减少 bias.

Bagging对样本重采样, 对每一个重采样得到的子样本集训练一个模型, 最后取平均. 由于子样本集的相似性以及使用的是同种模型, 因此各模型有近似相等的 bias 和 variance (事实上, 各模型的分布也近似相同, 但不独立). 由于

\[\mathbb{E}_D\left[ \frac{\sum^M_{i=1}f_i(\mathbf{x};D)}{M} \right] = \mathbb{E}_D[f_i(\mathbf{x};D)] \]

所以 Bagging 后的偏差与单个子模型接近, 一般来说不能显著降低偏差. 另一方面, 若各子模型独立, 则有

\[\text{var} \left[ \frac{\sum^M_{i=1}f_i(\mathbf{x};D)}{M} \right] = \frac{\text{var} [f_i(\mathbf{x};D)]}{M} \]

此时可以显著降低方差, 若各子模型完全相同, 则

\[\text{var} \left[ \frac{\sum^M_{i=1}f_i(\mathbf{x};D)}{M} \right] = \text{var} [f_i(\mathbf{x};D)] \]

此时不会降低方差. Bagging 方法得到的各子模型是有一定相关性的 (有放回重采样得到的训练集可能有重叠, 因此训练得到的子模型不会相互独立), 属于上面两个状态的中间态, 因此可以在一定程度上降低方差. 同时为了进一步降低方差, 随机森林通过随机选取特征向量的子集进行学习, 进一步减弱了子模型间的相关性.

更准确地来说 (见 ESL P588 equation 15.1), 假设随机变量 \(X_i\) 是等分布的 (i.d., 但不一定是相互独立的, i.i.d.) 并且相互之间有正相关系数 \(\rho\), 那么它们的平均值的方差为:

\[\text{var}(\frac{1}{M}\sum^M_{i=1}X_i) = \rho \sigma^2 + \frac{1-\rho}{M} \sigma^2 \]

Boosting 减少偏差

Boosting 方法使用前向分步算法实现学习的优化过程, 采用贪婪的方式在每一步给定当前模型 \(f_{m-1}(\mathbf{x})\) 前提下, 找到 \(T(\mathbf{x}_i; \Theta_m)\) 极小化损失函数 \(L(y_i, f_{m-1}(\mathbf{x}_i) + T(\mathbf{x}_i; \Theta_m))\), 迭代地学习一系列弱学习算法, 通过组合这些弱学习器构成一个强学习器. Boosting 方法是迭代式的最小化损失函数, 因此偏差是逐步下降的, 但由于它所采用的迭代式和自适应 (adaptive) 策略, 各子模型之间是强相关的, 因此子模型之和不能显著降低方差.

随机森林的推广

由于随机森林在实际应用中的良好特性, 基于随机森林有很多变种算法, 应用也很广泛, 不光可以用于分类回归, 还可以用于特征转换, 异常点检测等, 下面对于这些随机森林家族的算法中有代表性的做一个总结.

extra trees

extra trees 是随机森林的一个变种, 原理几乎和随机森林一样, 仅有的区别有:

  1. 对于每个决策树的训练集, 随机森林采用的是随机采样 bootstrap 来选择采样集作为每个决策树的训练集, 而 extra trees 一般不采用随机采样, 即每个决策树采用原始训练集.

  2. 在选定了划分特征后, 随机森林的决策树会基于基尼系数 (分类树), 均方差 (回归树) 等选择一个最优的特征值划分点, 这和传统的决策树相同. 但是 extra trees 比较的激进, 他会随机的选择一个特征值来划分决策树.

从第 2 点可以看出, 由于随机选择了特征值的划分点位, 而不是最优点位, 这样会导致生成的决策树的规模一般会大于随机森林所生成的决策树. 也就是说模型的方差相对于随机森林进一步减少, 但是偏差相对于随机森林进一步增大, 在某些时候, extra trees 的泛化能力比随机森林更好.

Totally Random Trees Embedding

Isolation Forest

分类:

技术点:

相关文章: