集成学习基础
集成学习分类
- Boosting
- 采用串行的方式,各个基学习器之间有依赖
- 基本思路:将基学习器层层叠加,每一层训练时,对前一层分错的样本,给予更高的权重。测试时,根据各层学习器的结果加权融合
- AdaBoost
- Bagging
- 各基学习器之间无强依赖,可以并行训练
- 基于决策树基学习器的Random Forest
- 将训练集分为若干子集(训练集较小时可能有交集)训练基学习器
偏差和方差
- 定量描述模型的性能(欠拟合和过拟合)
- 偏差:
- 由所有采样得到的大小为\(m\)的训练数据集训练出来的所有模型的输出的平均值和真实模型输出之间的偏差
- 通常是由于对学习算法做了错误的假设导致,如真实模型是二次函数,我们假设是一次函数
- 偏差带来的误差通常在训练误差上体现出来
- 方差:
- 由所有采样得到大小为\(m\)的训练数据集训练出来的所有模型的输出的方差
- 通常是由于模型复杂度相对于训练样本数\(m\)过高导致的
- 方差带来的误差通常表现在测试误差相对于训练误差的增量上
- 二者矛盾统一,不能完全独立
集成学习偏差方差分析
- 基学习器的错误
- 偏差(欠拟合):由于分类器表达能力有限导致的系统性错误,表现为训练误差不收敛
- 方差(过拟合):由于分类器对于样本分布过于敏感,导致在训练样本较少时,产生过拟合
- Boosting方法:通过逐步聚焦于基学习器分错的样本,减小集成学习器的偏差
- 各弱分类器之间是强相关的,缺乏独立性,所以对降低方差无作用
- Bagging方法:对训练样本多次采样,综合多个模型,减小集成学习器的方差
- (Bootstrap Aggregating)再抽样,然后在每个样本上训练出来的模型取平均
基学习器
- 最常用的基分类器是决策树,原因有:
- 方便地将样本权重整合到训练过程中,而不需要使用过采样来调整样本权重
- 决策树的表达能力和泛化能力,可以通过调节树的层数实现
- 决策树节点分裂可以很好地引入“随机性”
- 神经网络模型也适合做基分类器
- 可以通过调整神经元数量、连接方式、网络层数、初始权值引入随机性
- 随机森林的基分类器
- Bagging的基分类器最好是本身对样本分布较为敏感(即所谓不稳定的分类器)
- 不能使用线性分类器或K-近邻
- 较为稳定方差不大,无法减小方差
- 甚至因为采样,导致训练中无法收敛,增大了集成分类器偏差
- 合并基分类器:
- voting:投票方式
- stacking:串行方式,所有基分类器结果相加或者融合
AdaBoost
算法
- 输入:数据集\(T=\{ (x_1,y_1),\cdots,(x_N,y_N) \}\),其中\(y_i \in \{-1,+1\};弱学习算法\)
- 输出:最终分类器\(G(x)\)
- 初始化训练数据的权值分布
\[D_1=(w_{11},\cdots,w_{1N}),\quad w_{1i}=\dfrac{1}{N}\] - 对于\(m=1,2,\cdots,M\):
- 使用具有权值分布\(D_m\)的训练数据集学习,得到基分类器
\[G_m(x): \mathcal{X} \rightarrow \{-1,+1\} \] - 计算\(G_m(x)\)在训练集上的分类误差率
\[e_m=\sum \limits_{i=1}^N P(G_m(x_i)\neq y_i)=\sum \limits_{i=1}^Nw_{mi} I(G_m(x) \neq y_i) \] - 计算\(G_m(x)\)的系数
\[\alpha_m=\dfrac{1}{2}\log \frac{1-e_m}{e_m}\] - 更新训练集的权值分布
\[D_{m+1}=(w_{m+1,1},\cdots,w_{m+1,N}) \]
\[w_{m+1,i}=\dfrac{w_{mi}}{Z_m}\exp(-\alpha_m y_i G_m(x_i)) \]
\(Z_m\)是规范化因子,使得\(D_{m+1}\)成为一个概率分布 - 构建基分类器的线性组合
\[f(x)=\sum \limits_{m=1}^M \alpha_m G_m(x) \]
- 最终的分类器
\[G(x)=sign(f(x))=sign\left( \sum \limits_{m=1}^M \alpha_mG_m(x) \right) \]
其中,\(\alpha\)之和不并为1
随机森林
特点
- 在当前所有算法中,具有极好的准确率
- 能够有效地运行在大数据集上
- 能够处理具有高维特征的输入样本,而且不需要降维
- 能够评估各个特征在分类问题上的重要性
- 在生成过程中,能够获取到内部生成误差的一种无偏估计
- 对于缺省值问题也能够获得很好得结果
生成规则
- 如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
- 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要
- 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的
- 如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的
- 每棵树都尽最大程度的生长,并且没有剪枝过程
两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
分类效果因素
- 森林中任意两棵树的相关性:相关性越大,错误率越大
- 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低
- 减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数
袋外错误率(oob error)
- 选择m的主要依据是计算袋外错误率oob error(out-of-bag error)
- 没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计
- oob error计算:
- 在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。
- 对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树)
- 然后以简单多数投票作为该样本的分类结果
- 最后用误分个数占样本总数的比率作为随机森林的oob误分率