更多机器学习方法总结请到我这个博客链接
弱分类器的错误,就是偏差和方差的和。
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
集成学习在各个规模的数据集上都有很好的策略。
集成学习主要分两种::Boosting和Bagging.都是减少泛化误差的学习框架,不是具体的算法。
(1)模型之间彼此存在依赖关系,按一定的次序搭建多个分类模型,一般后一个模型的加入都需要对现有的集成模型有一定贡献,进而不断提高更新过后的集成模型性能,并借助多个弱分类器搭建出强分类器。代表有Boosting(AdaBoost)算法。该算法与第一种的随机森林主要区别在于每一颗决策树在生成的过程中都会尽可能降低模型在训练集上的拟合或训练误差
(2)模型之间彼此不存在依赖关系,彼此独立。利用相同的训练数据同时搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则做出最终的分类决策。例如:Bagging和随机森林(Random Forest).
集成学习可以分为三类:
逐步聚焦于基分类器的分错样本,减小集成分类器的偏差。
1、Adaboost的提出
2、Adaboost基本思路
Adaboost如何解决两个问题?
每一轮如何改变训练数据的权值和概率分布
Adaboost:提高前一轮被弱分类器分类错误样本的权值,降低那些被分类正确样本的权值
如何将弱分类器组合成强分类器
加权多数表决,加大分类误差率小的弱分类器的取值,使其在表决中其较大的作用。
3、Adaboost算法流程
输入:二分类的训练数据集
输出:最终分类器G(x)
1 初始化训练数据的初始权重
D 1 = ( w 11 , ⋯ , w 1 i , ⋯ , w 1 N ) w 1 i = 1 N , i = 1 , 2 , ⋯ , N D_{1}=\left(w_{11}, \cdots, w_{1 i}, \cdots, w_{1 N}\right) \quad w_{1 i}=\frac{1}{N}, \quad i=1,2, \cdots, N D1=(w11,⋯,w1i,⋯,w1N)w1i=N1,i=1,2,⋯,N
2 对于m个弱分类器
在权重Dm下训练数据,得到弱分类器
G m ( x ) : X → { − 1 , + 1 } G_{m}(x): \mathcal{X} \rightarrow\{-1,+1\} Gm(x):X→{−1,+1}
计算Gm的训练误差
e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) e_{m}=P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} w_{m i} I\left(G_{m}\left(x_{i}\right) \neq y_{i}\right) em=P(Gm(xi)=yi)=i=1∑NwmiI(Gm(xi)=yi)
计算Gm的系数
α m = 1 2 log 1 − e m e m \alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}} αm=21logem1−em
更新训练数据的权重分布
D m + 1 = ( w m + 1 , 1 , ⋯ , w m + 1 , i , . . . , w m + 1 , N ) D_{m+1}=\left(w_{m+1,1}, \cdots, w_{m+1, i},..., w_{m+1, N}\right) Dm+1=(wm+1,1,⋯,wm+1,i,...,wm+1,N) w m + 1 , i = w m i Z m exp ( − α m y i G m ( x i ) ) w_{m+1, i}=\frac{w_{m i}}{Z_{m}} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right) wm+1,i=Zmwmiexp(−αmyiGm(xi))
其中Zm是规范因子
Z m = ∑ i = 1 N w m i exp ( − α m y i G m ( x i ) ) Z_{m}=\sum_{i=1}^{N} w_{m i} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right) Zm=i=1∑Nwmiexp(−αmyiGm(xi))
得到最终的分类器
G ( x ) = sign ( f ( x ) ) = sign ( ∑ m = 1 M α m G m ( x ) ) G(x)=\operatorname{sign}(f(x))=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} G_{m}(x)\right) G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
4、 Adaboost的训练误差分析
定理:(Adaboost的训练误差界)最终的分类误差为:
1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ⩽ 1 N ∑ i exp ( − y i f ( x i ) ) = ∏ m Z m \frac{1}{N} \sum_{i=1}^{N} I\left(G\left(x_{i}\right) \neq y_{i}\right) \leqslant \frac{1}{N} \sum_{i} \exp \left(-y_{i} f\left(x_{i}\right)\right)=\prod_{m} Z_{m} N1i=1∑NI(G(xi)=yi)⩽N1i∑exp(−yif(xi))=m∏Zm
如果存在r>0,对所有的rm>r。都有:
1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ⩽ exp ( − 2 M γ 2 ) \frac{1}{N} \sum_{i=1}^{N} I\left(G\left(x_{i}\right) \neq y_{i}\right) \leqslant \exp \left(-2 M \gamma^{2}\right) N1i=1∑NI(G(xi)=yi)⩽exp(−2Mγ2)
结论:这表明在此条件下AdaBoost的训练误差是以指数速率下降的
5、 Adaboost算法的解释
可以将Adaboost看作是一个加法模型,损失函数为指数函数,使用前向分步学习算法。
前向分步算法
对于加法模型: f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=m=1∑Mβmb(x;γm)
其中, b ( x ; γ m ) \mathrm{b}(\mathrm{x;\gamma_m}) b(x;γm) 为基函数, γ m \gamma_\mathrm{~m} γ m 为基函数的参数, β m \beta \mathrm{m} βm 为基函数的系数。
损失函数为:
min β m , y m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min _{\beta_{m}, y_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right) βm,ymmini=1∑NL(yi,m=1∑Mβmb(xi;γm))
对于这类问题,直接进行求解很复杂,优化的思想就是:因为学习的是加法模型,所以每次从前到后只学习一个基函数,逐步逼近目标的函数表达式,就可以简化优化复杂度。
具体的, 每步只需优化如下损失函数: min β , γ ∑ i = 1 N L ( y i , β b ( x i ; γ ) ) \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, \beta b\left(x_{i} ; \gamma\right)\right) β,γmini=1∑NL(yi,βb(xi;γ))
逐步得到: min β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right) βm,γmmini=1∑NL(yi,m=1∑Mβmb(xi;γm))
算法流程如下:
提升树是以分类树或回归树为基本分类器的提升方法;提升树被认为是统计学习中性能最好的方法之一。
1、提升树模型
提升方法实际上就是采用加法模型(各种基函数的线性组合)和前向分步算法。以决策树模型为基函数的提升方法称为提升树(boosting tree)。对于分类问题,决策树就采用二叉分类树;对于回归问题,决策树就采用回归二叉树。提升树模型可以表示为:
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) fM(x)=m=1∑MT(x;Θm)
其中,T(x;Θm)表示决策树;Θm为决策树的参数;M为树的个数。
2、 提升树算法
提升树采用的是前向分步算法,流程如下:
针对不同问题的提升树算法,使用的损失函数也有所不同。
对于二分类问题:提升树算法只需将AdaBoost算法8.1中的基本分类器限制为二类分类树即可,可以说这时的提升树算法是AdaBoost算法的特殊情况。
对于回归问题提升树:
提升树通过加法模型和前线分步算法实现学习得优化过程,当损失函数是平方损失和指数损失函数时,每一步的优化都是很简单的,但对于一般损失函数而言,往往每一步的优化并不那么容易,针对这一问题,freidman提出了梯度提升算法。
这是利用最速下降法的近似算法。关键是利用损失函的负梯度在当前模型的值作为回归问题的提升树算法中的残差的近似值,拟合出一个回归树。
GBDT与上述算法有所不同,可见:GB和GBDT
GBDT全称为梯度下降树,既可以做分类也可以做回归,使用CART决策树。通加法模型,不断减少训练过程中的残差来优化模型。
基本训练原理:
剩下的就是GB原理里面的。
一些问题:
1、 GBDT怎样设置单棵树的停止生长条件?
2、GBDT的优缺点
优点:
缺点:
Bagging也称为自举汇聚法(Boostrap aggregation)
Bagging基本流程:通过自助采样(有放回),采出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,在将这些基学习器进行组合。
模型的评估方法中有简单交叉验证(将数据集划分为两个互不相交的集合,一个做测试集,一个做训练集)和K折-交叉验证方法(将数据分成k个大小相似互不相交的子集,每次使用k-1个子集做训练集,剩下的一个子集做测试集,以此循环进行k次的训练和测试,最后返回k次测试结果的均值)
但是上述两种方法中都保留了一部分样本用于测试,所以实际模型所使用的训练集比源数据都要小,因此就会引入一些因训练样本规模不同而导致的估计偏差。另外一方面留一法受训练样本影响较小,但是计算复杂度又太高。因此为了解决减少训练样本规模不同造成的影响,同时还能比较高效地进行测试集的评估。自助法就是很好的解决方案。
boostrap抽样
随机森林就是建立很多决策树,组成一个决策树的“森林”,通过多棵树投票来进行决策。这种方法能够有效地提高对新样本的分类准确度。
随机森林在以决策树为基学习器构建Bagging集成(样本的随机选取)的基础上,进一步在决策树的训练过程中引入随机属性选择。具体来说,传统决策树在选择划分属性时是在当前节点的属性集合(假设有d个属性)中选择一个最优属性;而在RF随机森林中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含K个属性的子集,然后在从这个子集中选择一个最优属性用于划分。K=d就是传统决策树,K=1则是随机选取一个属性用于划分,一般情况。
随机森林算法流程
1、对样本数据进行有放回的抽样,得到多个样本集。具体来讲就是每次从原来的N个训练样本中有放回地随机抽取N个样本(包括可能重复样本)。
2、从候选的特征中随机抽取m个特征,作为当前节点下决策的备选特征,从这些特征中选择最好地划分训练样本的特征。用每个样本集作为训练样本构造决策树。单个决策树在产生样本集和确定特征后,使用CART算法计算,不剪枝。
3、得到所需数目的决策树后,随机森林方法对这些树的输出进行投票,以得票最多的类作为随机森林的决策。
说明:
(1) 随机森林的方法即对训练样本进行了采样,又对特征进行了采样,充分保证了所构建的每个树之间的独立性,使得投票结果更准确。
(2)随机森林的随机性体现在每棵树的训练样本是随机的,树中每个节点的分裂属性也是随机选择的。有了这2个随机因素,即使每棵决策树没有进行剪枝,随机森林也不会产生过拟合的现象。
随机森林中有两个可控制参数:
森林中树的数量(一般选取值较大)
抽取的属性值m的大小。
随机森林的优点
随机森林简单、容易实现、计算开销小,被誉为“代表集成学习计数水平的方法”。可以看出随机森林只是对Bagging做了很小的改动。Bagging的多样性只是体现在样本的随机性,随机森林的基学习器的多样性不仅来自于样本的随机性,还来自于属性的随机性。随机森林随着学习器数目的增加,随机森林通常会收敛到更低的泛化误差。
(1)分类结果更加准确
(2)可以处理高维度的属性,并且不用做特征选择
(3)即使有很大部分数据遗失,仍可以维持高准确度**
(4)训练效率优于Bagging
(5)随机性只需要考虑一个属性子集,Bagging需要考察所有属性。
(6)容易实现并行化计算
(7)在训练过程中,能够检测到属性之间的相互影响
随机森林的缺点
(1)随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上回过拟合)。
(2)对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。
先训练多个模型(在每一个模型的训练中用到k-交叉验证),再用多个模型预测的结果作为组合模型(新模型)的输入,在训练模型,得到最终预测输入。实际上,常常使用LR作为最终的组合模型。
以上图讲解stacking的过程:
对于一个数据集,其Traindata有10000个,Testdata有2500个.在10000个Traindata数据中,使用5-折交叉验证,train_data:test_data=4:1.。得到五个model1,提取5个输出结果(2000*5)合并为10000个数据,记作A1。
同时,对原始2500个Testdata,使用这5个model1进行预测,得到5组输出结果(2500*5),平均得到2500个数据,记作B1。
同样的,使用其他模型,得到多组A2,A3,A4,A5.和B2,B3,B4,B5。
在最终的融合模型中,采用将A…作为Train,B作为Test,得到最终的预测输出结果。
在维度上,对应到初始2500个testdata的预测输出值。
完整的过程:
优点:
不足:
参考:代码