关于集成算法的参考
集成算法Python实现包:ML-Ensemble
- 集成学习框架可分为三种:
Bagging和Boosting都是由基函数线性组合而成。Bagging中的基函数最好是强学习器(多次有放回抽样,总体方差是基函数方差的1/N),否则可能导致整体模型的准确度低。Boosting可以是弱学习器。
- Bagging从训练集中通过随机采样形成每个基模型所需要的子训练集,各模型之间没有关系,对所有基模型预测的结果进行综合(平均或者投票,有hard votiong和soft voting之分)产生最终的预测结果。
- Boosting训练过程为阶梯状,基模型按次序一一进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次都进行一定的转化。对所有基模型预测的结果进行线性综合产生最终的预测结果。
-
- Adaboosting:对同样数据集,每次训练模型后,根据预测结果对样本权重进行调整(提高错误样本权重,降低正确样本权重),然后继续对该批数据进行模型训练;最后将各模型的结果进行综合就是最终结果。
-
- Gradient Boosting:对一批数据进行训练后,对残差再进行训练建立新模型,以此类推,最终结果是各基模型的和。
- Gradient Boosting:对一批数据进行训练后,对残差再进行训练建立新模型,以此类推,最终结果是各基模型的和。
- Stacking:将训练好的所有基模型对训练集进行预测,第 j j j个基模型以第 i i i个训练样本的预测值将作为其训练集中的第 i i i个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测
- 偏差和方差
偏差是预测值和真实值之间的差异,体现在训练集的准确度上;方差是预测值作为随机变量时预测结果的离散程度,体现在测试集的准确度上,方差大时容易过拟合。通过集合众多弱学习器来解决高偏差问题,基函数最好是低方差高偏差的。
一、Bagging
Bagging集成算法是Bootstrap Aggregating的缩写,对数据集通过有放回的随机采样建多个模型,各模型之间没有关系;对所有基模型预测的结果进行综合产生最终的预测结果,常用算数平均或最多票数的种类。对弱学习器没有限制,但常用的是决策树和神经网络。
随机采样(bootsrap)是从训练集里用有放回的方式抽取固定个数的样本,之前采集到的样本在放回后仍可能被抽到。
通常随机抽样后的形成的新样本集合大小和原数据集大小相同。若有 m m m个样本,则每次抽中概率为 1 m \frac{1}{m} m1,在 m m m次采样中都为被抽取到的概率是 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m,从而有 ( 1 − 1 m ) m → 1 e ≃ 0.368 (1-\frac{1}{m})^m \to \frac{1}{e} \simeq 0.368 (1−m1)m→e1≃0.368,即有约36.8%的样本会始终无法被采集。这部分样本成为袋外样本(Out Of Bag,OOB),通常用于检测模型泛化能力。
Bagging算法由于每次都用随机抽样来训练模型,因此泛化能力强,方差小,但由于未使用全部数据,偏差会大。
随机森林(Random Forest,RF)
随机森林建立在Bagging的基础上,用CART决策树作为弱学习器,对样本进行有放回的随机抽样(同原数据集大小),大小和元数据集相同;再对每个决策树的特征进行随机筛选(是在根节点,不再是全部特征;也可以理解为在节点划分上随机从特征中抽取选择最优划分特征);建每颗树时的有放回样本抽样会有约1/3样本无法被抽到,可用于做袋外估计(OOB,outofbag)来评估性能;最终一个样本的预测结果由各树进行投票或平均。
RandomForest只能接受数值型变量,对于分类变量,需要进行如One-Hot编码的转换。
【重点参数】各树间的相关性与决策树所用特征量有关,特征越多,相关性可能越强;减少使用的特征个数,树的相关性和分类能力都会降低。
【有放回抽样原因】每颗决策树都用完全不同的数据来构建,则每棵树都是“片面”的,缺少共性,对最终的汇总结果没有帮助。
【袋外估计】效果与K折交叉验证相似。
【优点】:可以给出各特征对于输出的重要性矩阵;产生的模型方差小,泛化能力强;采用袋外估计,无需进行K折交叉验证;可以并行计算,速度快;对缺失值不敏感。
【缺点】:对噪音较大的样本集容易过拟合;值比较多的特征容易对模型产生影响。
【特征重要性】判断每个特征在随机森林的每颗树上做了多大的贡献,然后取平均值即可。其中关于贡献的计算方式有:
- 基于基尼指数变化量:该特征在所有树中的变化和 V I M j = ∑ j _ t r e e ( ∑ i _ n o d e ( G b e f o r e _ s p l i t − G l e f t _ n o d e − G r i g h t _ n o d e ) ) VIM_j=\sum_{j\_tree}(\sum_{i\_node}(G_{before\_split}-G_{left\_node}-G_{right\_node})) VIMj=∑j_tree(∑i_node(Gbefore_split−Gleft_node−Gright_node)),之后再做归一化即可 V I M j ∑ V I M j \frac{VIM_j}{\sum VIM_j} ∑VIMjVIMj
- 基于袋外数据错误率:对于一树用OOB样本得到误差 e 1 e_1 e1;然后随机改变OOB中的第 j j j列中样本的顺序,并保持其他列不变,得到新的误差 e 2 e_2 e2。通过 e 1 − e 2 e_1-e_2 e1−e2 来刻画特征 j j j的重要性。依据是,如果一个特征很重要,那么其变动后会非常影响测试误差,如果测试误差没有怎么改变,则说明特征 j j j不重要。
打乱特征j的样本顺序由两种方法:
1)是使用均匀分布或者正态分布随机值来抽样替换原特征;
2)是通过permutation test(随机排序测试、置换检验)将原来的所有N个样本的第 j j j个特征值重新打乱分布(相当于重新洗牌),保证了特征替代值与原特征的分布是近似的(只是重新洗牌而已)。参考
- 经过结点的数目等指。可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的标准。随机森林基于不纯度的排序结果非常鲜明,在得分最高的几个特征之后的特征,得分急剧的下降。参考
随机森林的变种还有Extra Trees(每个决策树都用原始训练集,不抽样;选用随机特征值划分决策树)
随机森林的基评估器都拥有较低的偏差和较高的方差,因为决策树本身是预测比较”准“,比较容易过拟合的模型,装袋法本身也要求基分类器的准确率必须要有50%以上。所以以随机森林为代表的装袋法的训练过程旨在降低方差,即降低模型复杂度。
Extra Trees
Extra trees是基于随机森林,但样本使用原始训练集,在特征划分时随机选择特征并随机选择划分阈值进行划分(不再使用具体准则)。
极大的抑制了过拟合,但增加了拟合的偏差
Totally Random Trees Embedding
简称TRTE,是一种无监督的将低维的数据集映射到高维的方法,从而让映射到高维的数据可以更好的用于分类或回归。
TRTE在数据转化的过程用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕后,数据集里的每个数据在T个决策树中叶节点的位置也定下来了。从而将样本在每颗决策树中用one-hot(在对应节点为1,不在为0)编码表示的结果按树的顺序合在一起,映射结果维度 n o u t ≤ N o d e ∗ T r e e n_out \le Node*Tree nout≤Node∗Tree。实际上是实现了高维离散化。
示例:有3颗决策树,每个决策树有5个叶子节点,某个数据特征x划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1),有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。
Isolation Forest
简称IForest,是一种异常点监测方法。
随机采样时,所采子样本量远远小于原始训练集个数(通过部分数据来区分异常点)。每次建立决策树时,随机选择一个划分特征,并随机选择划分阈值。通过较小的决策树深度进行建模(少量异常点检测一般不用大规模树)。
对于异常点的判断是,将测试样本点 x x x用T颗树进行拟合,计算每颗决策树上该样本点所在的叶节点对应的深度 h t ( x ) h_t(x) ht(x),从而可计算平均高度 h ‾ t ( x ) \overline h_t(x) ht(x)。
样本点 x x x对应的异常概率为: s ( x , m ) = 2 − h ‾ ( x ) c ( m ) s(x,m)=2^{-\frac{\overline h(x)}{c(m)}} s(x,m)=2−c(m)h(x),其中 m m m是训练样本个数, c ( m ) = 2 l n ( m − 1 ) + ξ − 2 m − 1 m c(m)=2ln(m-1)+\xi -2\frac{m-1}{m} c(m)=2ln(m−1)+ξ−2mm−1, ξ \xi ξ是欧拉常数。
s ( x , m ) s(x,m) s(x,m)的取值范围是[0,1],取值越接近1,则 x x x是异常点的概率越大。
多输出任务
多输出任务是对一个输入样本会输出多个目标值(多个y,不是y的多个值)。以回归为例,对单输出任务是求解 θ \theta θ使得 X θ = Y X\theta=Y Xθ=Y,二多输出任务是求解 θ = ( θ 1 , θ 2 ) \theta=(\theta_1,\theta_2) θ=(θ1,θ2)使得 X ( θ 1 , θ 2 ) = ( Y 1 , Y 2 ) X(\theta_1,\theta_2)=(Y_1,Y_2) X(θ1,θ2)=(Y1,Y2)。对多输出任务,若各输出间相互独立,则多输出效果同多个单输出任务效果相似;但若各输出间有关联,则结果会不同与单输出任务的组合。
参考:https://www.cnblogs.com/pinard/p/6156009.html
二、Boosting(提升)
【工作机制】首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重。使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2。如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。 内部用的是加法模型将各弱学习器线性相加。AdaBoost、GDBT、XGBoost、LightGBM都是boosting算法关于弱学习器的组合。
Boosting面临四个问题:
- 如何计算学习误差率 e e e?
- 如何得到弱学习器权重系数 α \alpha α?
- 如何更新样本权重向量 D D D?
- 使用何种结合策略?
AdaBoost算法
AdaBoost非常好的参考
AdaBoost算法(Adaptive Boost)可用于分类数据(二分类),对多分类任务,需要将任务通过OvR(一对多)转换成二分类任务;也可以用于回归。
AdaBoost每次都用全部数据,主要通过调整样本权重来建立各次迭代时的弱学习器。能够在学习过程中不断减少训练误差,且训练误差是以指数速度下降的。由于重视误分类样本的权重,因此对异常样本敏感,影响最终的强学习器的预测准确性。
AdaBoost算法可以认为是加法模型(弱学习器的线性组合)、损失函数为指数函数、学习算法为前向分布算法时的学习方法。
AdaBoost分类算法(自适应提升算法)
【思路】初始化时给数据集每个样本一个权重,用带权重的数据集来训练弱学习器。训练出模型后,针对这个模型中预测错误的样本,增加其权重值;对预测正确的样本,减少其权重。再根据计算出的误差给弱学习器一个权重。然后用新的样本权重调整后的样本继续训练新的弱学习器,重复得到B个模型。最后将B个弱学习器用对应的权重加总作为整体的强学习器。各弱学习器间相互依赖(样本权重受上一模型影响)。整个学习过程中使用的都是同一批样本,只是调整样本权重。
【过程】输入:训练集 T = { ( x , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} T={
(x,y1),(x2,y2),...(xm,ym)};分类y={-1,+1}
- 初始化训练集的权值分布: D ( 1 ) = ( w 1 , 1 , w 1 , 2 , . . . w 1 , m ) ; w 1 , i = 1 m ; i = 1 , 2... m D(1) = (w_{1,1}, w_{1,2}, ...w_{1,m}) ;\;\; w_{1,i}=\frac{1}{m};\;\; i =1,2...m D(1)=(w1,1,w1,2,...w1,m);w1,i=m1;i=1,2...m
- 对 k = 1 、 2 、 … M k=1、2、…M k=1、2、…M
a) 使用有权值分布 D ( k ) D(k) D(k)的训练集学习得到分类器 G k ( x ) G_k(x) Gk(x)(输出0/1)
b) 计算 G k ( x ) G_k(x) Gk(x)在训练集上的分类误差率: e k = ∑ P ( G k ( x i ) ≠ y i ) = ∑ w k , i I ( G k ( x i ) ≠ y i ) e_k=\sum{P(G_k(x_i)≠y_i)}=\sum{w_{k,i}I(G_k(x_i)≠y_i)} ek=∑P(Gk(xi)=yi)=∑wk,iI(Gk(xi)=yi)( I ( G k ( x i ) ≠ y i ) I(G_k(x_i)≠y_i) I(Gk(xi)=yi)是指示函数,与实际类不相同时取1,相同时取0。分类误差率是与实际类别不同的样本的权值和)
c) 计算 G k ( x ) G_k(x) Gk(x)的系数 α m = 1 2 l o g 1 − e k e k \alpha_m=\frac{1}{2}log\frac{1-e_k}{e_k} αm=21logek1−ek,表示基本分类器 G m ( x ) G_m(x) Gm(x)的重要性。误差越小 α \alpha α值越大: e k > 0.5 时 α < 0 e_k>0.5时\alpha <0 ek>0.5时α<0; e k < 0.5 时 α > 0 e_k<0.5时\alpha >0 ek<0.5时α>0。
d) 更新数据集的权值分布: D ( k + 1 ) = ( w k + 1 , 1 , w k + 1 , 2 , . . . w k + 1 , m ) D(k+1)= (w_{k+1,1}, w_{k+1,2}, ...w_{k+1,m}) D(k+1)=(wk+1,1,wk+1,2,...wk+1,m),
其中 w k + 1 , i = w k , i Z k e − α k y i G k ( x i ) w_{k+1,i}=\frac{w_{k,i}}{Z_k}e^{-\alpha_ky_iG_k(x_i)} wk+1,i=Zkwk,ie−αkyiGk(xi), Z k = ∑ w k , i e − α k y i G k ( x i ) Z_k=\sum{w_{k,i}e^{-\alpha_ky_iG_k(x_i)}} Zk=∑wk,ie−αkyiGk(xi)
实际就是分别改变误分类样本和正确分类样本的权重,使正确分类的权值减小,错误分类的权值变大。 - 构建基本分类器的线性组合: f ( x ) = ∑ α k G k ( x ) = f k − 1 ( x ) + α k G k ( x ) f(x)=\sum{\alpha_kG_k(x)}= f_{k-1}(x) + \alpha_kG_k(x) f(x)=∑αkGk(x)=fk−1(x)+αkGk(x)。 f ( x ) > 0 时 y ^ = 1 f(x)>0时\hat y=1 f(x)>0时y^=1; f ( x ) < 0 时 y ^ = 0 f(x)<0时\hat y=0 f(x)<0时y^=0。 f ( x ) f(x) f(x)值大小反映对应类的预测置信度。
也可以对弱学习器添加正则项(学习步长): f k ( x ) = f k − 1 ( x ) + ν α k G k ( x ) f_{k}(x) = f_{k-1}(x) + \nu\alpha_kG_k(x) fk(x)=fk−1(x)+ναkGk(x), 0 < ν ≤ 1 0 < \nu \leq 1 0<ν≤1。 - 到达指定迭代次数(还可以对树进行限制)或分类误差率达到一定值后停止迭代,得到最终的分类器: G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ α k G k ( x ) ) G(x)=sign(f(x))=sign(\sum{\alpha_kG_k(x)}) G(x)=sign(f(x))=sign(∑αkGk(x))
【Adaboost是前向分步学习算法】对第k轮迭代: f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x) fk(x)=fk−1(x)+αkGk(x)
【损失函数为指数函数】定义总体损失函数 a r g m i n ⏟ α , G ∑ i = 1 m e x p ( − y i f k ( x ) ) \underbrace{arg\;min\;}_{\alpha, G} \sum\limits_{i=1}^{m}exp(-y_if_{k}(x)) α,G
argmini=1∑mexp(−yifk(x))
利用前向分步学习算法的关系可以得到损失函数为 ( α k , G k ( x ) ) = a r g m i n ⏟ α , G ∑ i = 1 m e x p [ ( − y i ) ( f k − 1 ( x ) + α k G k ( x ) ) ] (\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}exp[(-y_i) (f_{k-1}(x) + \alpha_kG_k(x))] (αk,Gk(x))=α,G
a