【ML小结10】集成学习

1. 集成学习的思想

对于训练集数据,我们通过训练若干个个体学习器,通过一定的结合策略,就可以最终形成一个强学习器,以达到博采众长的目的。
集成学习(Ensemble learning)可以用于分类问题集成,回归问题集成,特征选取集成,异常点检测集成等等。
Q1:如何获得若干个个体学习器
Q2:采用什么样的结合策略

2. 集成学习-个体学习器

不稳定的学习器更适合作为基学习器,因为不稳定的学习器容易受到样本分布的影响(方差大),很好的引入了随机性,这有助于在集成学习中提升模型的泛化能力

2.1 同质学习器(常用)

比如都是决策树个体学习器,或者都是神经网络个体学习器。

  • 强依赖同质学习器
    个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法,Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;

  • 无依赖同质学习器
    个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging随机森林系列算法,Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。

2.2 异质学习器

对训练集采用支持向量机个体学习器,逻辑回归个体学习器和朴素贝叶斯个体学习器来学习,再通过某种结合策略(如stacking)来确定最终的分类强学习器。

3. 集成学习-结合策略

  • 平均法
    对于若干个弱学习器的输出进行平均得到最终的预测输出。
  • 投票法
    相对多数投票法、绝对多数投票法、加权多数投票法
  • 学习法
    代表方法是stacking(常用于异质集成),当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器

4. 集成学习算法

4.1 boosting

Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。

4.1.1 boosting原理

在这里插入图片描述

  • 先从初始训练集训练出一个基学习器
  • 再根据基学习器的表现对训练样本分布进行调整(数据加权),使得先前基学习器做错的训练样本在后续受到更多关注
  • 基于调整后的样本分布来训练下一个基学习器;
  • 重复进行上述步骤,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合

Q1:如何计算第k个弱分类器在训练集上的学习误差率 e k e_k
Q2:如何由学习误差率 e k e_k 更新第k个弱分类器的权重系数 α k \alpha_k
Q3:如何更新训练集上的样本权重D
Q4:使用何种结合策略

4.1.2 boosting基分类器

对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差小,所以对于每个基分类器来说,问题就在于如何选择方差更小的分类器(即更简单的分类器),所以我们选择了深度很浅的决策树。

为什么使用决策树作为基学习器/ 基学习器有什么特点

(1). 决策树的表达能力和泛化能力,可以通过剪枝快速调整;
(2). 决策树可以方便地将样本的权重整合到训练过程中;
(3). 决策树是一种不稳定的学习器;

为什么不稳定的学习器更适合作为基学习器?
  • 所谓不稳定,指的是数据样本的扰动会对学习器的结果产生较大的影响;
  • 不稳定的学习器容易受到样本分布的影响(方差大),很好的引入了随机性;这有助于在集成学习(特别是采用 Bagging 策略)中提升模型的泛化能力
  • 为了更好的引入随机性,有时会随机选择一个属性子集中的最优分裂属性,而不是全局最优(随机森林
还有哪些模型也适合作为基学习器?

神经网络也属于不稳定的学习器,通过调整神经元的数量、网络层数,连接方式初始权重也能很好的引入随机性和改变模型的表达能力和泛化能力。

4.1.3 boosting系列算法之AdaBoost算法

Adaboost算法的特点是通过迭代每次学习一个基分类器,在每次迭代中,提高那些被前一轮分类器错误分类的样本权值,降低那些被正确分类的样本权值。最后,将这些基分类器的线性组合作为强分类器,其中给分类误差率小的基分类器以大的权值,给分类误差率大的基分类器以小的权值

一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。在这里插入图片描述
Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。上述公式均可由其损失函数推导得出,详情见参考教程

Adaboost的主要优点

1)Adaboost作为分类器时,分类精度很高

2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。

3)作为简单的二元分类器时,构造简单,结果可理解。

4)不容易发生过拟合

Adaboost的主要缺点

对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。

4.1.4 boosting系列算法之提升树

提升树是以决策树(分类树或回归树)为基分类器,采用加法模型与前向分布算法的提升方法。由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。

提升树模型可以表示为决策树的加法模型: f m ( x ) = m = 1 M T ( x ; θ m ) f_m(x)=\sum_{m=1}^MT(x;\theta_m) 其中, T ( x ; θ m ) T(x;\theta_m) 表示决策树; θ m \theta_m 为决策树的参数;M为树的个数。

回归问题提升树使用以下前向分步算法:
f 0 ( x ) = 0 f_0(x)=0 f m ( x ) = f m 1 ( x ) + T ( x ; θ m ) m = 1 , . . . M f_m(x)=f_{m-1}(x)+T(x;\theta_m)\quad m=1,...M f M ( x ) = m = 1 M T ( x ; θ m ) f_M(x)=\sum_{m=1}^MT(x;\theta_m) 在前向分步算法的第m步,给定当前模型 f m 1 ( x ) f_{m-1}(x) ,需求解 θ ^ m = a r g m i n θ m i = 1 N L ( y i , f m 1 ( x i ) + T ( x i ; θ m ) ) \hat\theta_m=argmin_{\theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\theta_m)) 得到 θ ^ m \hat\theta_m ,即第m棵树的参数。

常用损失函数
  • 分类问题
    • 指数损失 L ( y , f ( x ) ) = e x p ( y f ( x ) ) L(y,f(x))=exp(-yf(x))
    • 对数损失 L ( y , f ( x ) = k = 1 K y k l o g p k ( x ) L(y,f(x)=-\sum_{k=1}^Ky_klogp_k(x) K是类别数
  • 回归问题
    • 均方损失 L ( y , f ( x ) ) = ( y f ( x ) ) 2 L(y,f(x))=(y-f(x))^2
    • 绝对损失 L ( y , f ( x ) ) = y f ( x ) L(y,f(x))=|y-f(x)|

以均方损失为例, L ( y i , f m 1 ( x i ) + T ( x i ; θ m ) ) = [ y f m 1 ( x ) T ( x ; θ m ) ] 2 = [ r T ( x ; θ m ) ] 2 L(y_i,f_{m-1}(x_i)+T(x_i;\theta_m))=[y-f_{m-1}(x)-T(x;\theta_m)]^2=[r-T(x;\theta_m)]^2 其中, r m = y f m 1 ( x ) r_m=y-f_{m-1}(x) 表示当前模型拟合数据的残差,通过拟合残差 r m i ( i = 1 , 2 , . . . , N ) r_{mi}(i=1,2,...,N) 学习一个回归树,得到 T ( x ; θ m ) T(x;\theta_m) ,从而可以更新 f m ( x ) f_m(x)

梯度提升GBDT

当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对于一般损失函数而言,每一步的优化并不容易。
于是就有了梯度提升算法,这是利用最速下降法的近似方法,关键在于利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树。 [ L ( y , f ( x i ) ) f ( x i ) ] f ( x ) = f m 1 ( x ) -[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}

xgboost:GBDT的C++实现

xgboost 是GBDT的一个c++实现,在计算速度和准确率上,较GBDT有明显的提升

XGBoost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。

xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear), 传统GBDT以CART作为基分类器,xgboost支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)

ThunderGBM:快成一道闪电的梯度提升决策树

尽管 XGBoost 等库已经支持 GPU 了,但毕竟不是一开始就为 GPU 而设计的,因此在优化和加速上会有一些瑕疵。而 ThunderGBM 旨在帮助用户轻松高效地应用 GBDT 和随机森林来解决问题,它可以利用 GPU 完成高效训练

ThunderGBM 的主要特征如下:
通常是其它库的 10 倍。
支持 Python(scikit-learn)接口。
支持操作系统 Linux。
支持分类、回归和排序。

4.2 bagging

Bagging是引导聚合的意思。 通过对 n 个独立不相关的模型预测结果取平均,来减少估计方差(方差是原来的1/n)

对于Bagging需要注意的是,每次训练集可以取全部的特征进行训练,也可以随机选取部分特征训练,例如随机森林就是每次随机选取部分特征。
在这里插入图片描述
bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的随机采样,我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。通常分类任务使用投票的方式集成,而回归任务通过平均的方式集成。

随机采样:
一般采用的是自助采样法(bootstrap),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。m次采样都没有被采集中的概率: ( 1 1 m ) m 1 e = 36.8 % (1-\frac{1}{m})^m\to\frac{1}{e}=36.8\% 这36.8%的数据称为袋外数据,它们没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。

4.3 随机森林

随机森林就是通过集成学习的思想将多棵决策树集成的一种算法,是bagging的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。

RF的算法思路
  1. 样本的随机:从样本集中用自助采样法随机选取n个样本

  2. 特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)

  3. 重复以上两步m次,即建立了m棵CART决策树

  4. 这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)

在随机森林中,每个树模型都是随机采样训练的。另外,特征也是随机选择的,最后对于训练好的树也是随机选择的。这种处理的结果是随机森林的偏差增加的很少,而由于弱相关树模型的平均,方差也得以降低,最终得到一个方差小,偏差也小的模型。

RF的主要优点

1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。

2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。

3) 在训练后,可以给出各个特征对于输出的重要性

4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。

5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单

6) 对部分特征缺失不敏感。

RF的主要缺点

1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合

2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

4.4 stacking

在这里插入图片描述
Stacking是指训练一个模型用于组合(combine)其他各个模型,即首先我们先训练多个不同的基础模型(基础模型利用整个训练集做训练),然后再以之前训练的各个基础模型的输出为输入来训练一个元模型(元模型将基础模型的特征作为特征进行训练),以得到一个最终的输出。在实际应用中,我们通常使用单层logistic回归作为组合模型。通过一个元分类器或者元回归器来整合多个分类模型或回归模型的集成学习技术。由于基础模型通常包含不同的学习算法,因此stacking通常是异质集成。

Stacking被Kaggle竞赛获奖者广泛使用。例如,Otto Group Product分类挑战赛的第一名通过对30个模型做stacking赢得了冠军。他将30个模型的输出作为特征,继续在三个模型中训练,这三个模型XGBoost,Neural Network和Adaboost,最后再加权平均。详见文章

参考教程

猜你喜欢

转载自blog.csdn.net/weixin_38493025/article/details/88249596
今日推荐