目录
一、集成模型概述(ensemble learning)
1. 集成学习之个体学习器
2.Boosting和Bagging区别
二、模型融合提升技术(集成学习)
2.1 Boosting
2.2 Bagging
三、各种集成模型
3.1 GBDT模型(boosting,基于残差)
3.1.1 GBDT中的DT
3.1.2 GBDT的基本思想:
3.1.3 为何gbdt可以用用负梯度近似残差呢?
3.1.4 梯度提升和梯度下降的区别和联系是什么?
3.1.5 GBDT的优点和局限性有哪些?
3.1.6 RF(随机森林)与GBDT之间的区别与联系
3.2 AdaBoost模型(boosting,基于权值)
3.3 XGBoost模型(boosting)
3.3.2 XGBoost与GBDT有什么不同
3.3.3 为什么XGBoost要用泰勒展开,优势在哪里?
3.4 LightGBM模型(boosting)
3.4.1 LightGBM在哪些地方进行了优化 (区别XGBoost)?
3.5 随机森林RF模型(bagging)
3.5.1 随机森林生成规则:
3.5.2 随机森林分类效果的影响因素
3.5.3 随机森林有什么优缺点
四、集成学习之结合策略
4.1 Voting投票
4.1.1 绝对多数投票法
4.1.2 相对多数投票法
4.1.3 加权投票法
4.1.4 硬投票
4.1.5 软投票
4.2 Averaging平均法和Ranking
4.2.1 简单平均法(simple averaging)
4.2.2 加权平均法(weighted averaging)
4.3 学习法 - 堆叠法Stacking
4.4 混合法Blending
模型融合是模型的一个优化过程。
在选择一个模型进行训练之后,如何判断模型的优劣及优化模型的性能呢?一般可以从以下几个方面进行优化:
1、研究模型学习曲线 --- 判断是否过拟合或者欠拟合,并做出相应的调整(学习曲线可以判断是否过拟合或欠拟合)
2、分析模型的特征权重参数 --- 对于权重绝对值高或低的特征,可以进行更细化的工作,也可以进行特征组合
3、进行Bad-Case分析 --- 针对错误的例子确定是否还有地方可以修改挖掘
4、进行模型融合 (集成学习)
单个学习器要么容易欠拟合要么容易过拟合,为了获得泛化性能优良的学习器,可以训练多个个体学习器,通过一定的结合策略,最终形成一个强学习器。这种集成多个个体学习器的方法称为集成学习(ensemble learning)。 基本思想如下图所示:
从以上概念可以看出,集成学习主要围绕两个核心问题:
个体学习器:精确率仅高于1/2的学习器。(随机判断一个二分类的精确率为1/2,精确率高于1/2的学习器才有意义,因为这样才有信息获取)
集成学习:结合多个个体学习器(弱学习器)从而获得精确率很高的学习器(强学习器)。
个体学习器(又称为“基学习器”)的选择有两种方式:
目前同质集成的应用最广泛,而基学习器使用最多的模型是CART决策树和神经网络。
按照个体学习器之间是否存在依赖关系可以分为两类:
(1)Boosting方法:个体学习器间存在强依赖关系必须串行生成的序列化方法
(2)Bagging方法和随机森林:个体学习器间不存在强依赖关系,可同时生成的并行化方法
Boosting是集成学习中的一种方法,意为“提升”。提升是一个逐步优化集成学习器的过程,即每个个体学习器都在弥补集成学习器的欠缺,从而达到整体的优化。
Boosting是一种串行的工作机制,即个体学习器的训练存在依赖关系,必须一步一步序列化进行。Boosting是一个序列化的过程,后续模型会矫正之前模型的预测结果。也就是说,之后的模型依赖于之前的模型。
boosting的算法原理如下所示:
boosting算法的工作机制是:
(1)先从初始训练集训练出一个基学习器;
(2)再根据基学习器的表现对样本权重进行调整,增加基学习器误分类样本的权重(又称重采样);
(3)基于调整后的样本分布来训练下一个基学习器;
(4)如此重复进行,直至基学习器数目达到事先指定的个数 T,将这 T 个基学习器通过结合策略进行整合,得到最终的强学习器。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。
Bagging是并行式集成学习方法最著名的代表,它直接基于bootstrap“自助采样法”,也就是有放回的采样。
Bagging能不经修改地用于多分类、回归等任务。
bagging的算法原理如下:
bagging算法的工作机制为:
(1)对包含m个样本的训练集利用自助采样法(有放回的)进行 T 次随机采样,每次采样得到 m 个样本的采样集;(初始训练集中约有63.2%的样本出现在采样集中)
(2)对于这 T 个采样集,我们可以分别独立的训练出 T 个基学习器;
(3)再对这 T 个基学习器通过结合策略来得到最终的强学习器。
bagging对于弱学习器最常用的一般也是决策树和神经网络。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。
参考:
GBDT算法梳理
stacking算法_集成算法总结_weixin_39691055的博客-CSDN博客
GBDT是Gradient Boosting Decision Tree的简写,中文为梯度提升决策树,是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。
GBDT 适用范围
GBDT 可以适用于回归问题(线性和非线性)其实多用于回归;
GBDT 也可用于二分类问题(设定阈值,大于为正,否则为负)和多分类问题
这里的DT我们不要简单理解为广义的决策树,考虑到我们GB算法中需要将多个弱分类器的结果累加起来,然而如果是分类问题,结果是无法相加的,比如“男”+“女”等于什么?所以说GBDT中所有的树都是回归树,而不是分类树,也就是说DT独指Regression Decision Tree。
根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。
回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数,
那此时的负梯度是这样计算的
所以,当损失函数选用均方损失函数是时,每一次拟合的值就是(真实值 - 当前模型预测的值),即残差。此时的变量是
,即“当前预测模型的值”,也就是对它求负梯度。
下表是梯度提升算法和梯度下降算法的对比情况。可以发现,两者都是在每 一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更 新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参 数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函 数空间中,从而大大扩展了可以使用的模型种类。
从思想上看,GBDT分类算法和回归算法没有区别,但是对于分类来说我们的样本输出不是连续的值,而是离散的类别,这也导致我们无法直接从输出类别去拟合类别输出的误差。
解决这个问题的办法主要有两种,一种是利用指数损失函数,此时的GBDT也就退化成了Adaboost算法;另一种就是使用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。(它实际上是将二分类问题当作逻辑斯蒂回归问题来看待的)
剪枝是树模型中常用的防止过拟合的方法
较小的步长意味着需要更多的弱学习器的迭代次数。
这里的子采样和随机森林不一样,随机森林使用的是有放回抽样,而这里是不放回抽样。
取值为1表示全部样本都进行训练,相当于没有使用子采样;取值小于1,则只有一部分样本去拟合,可以减小方差,防止过拟合,但是会增加样本的偏差,因此取值不能太低,一般推荐在[0.5,0.8]。
优点
局限性
相同点:
1、GBDT与RF都是采用多棵树组合作为最终结果;这是两者共同点。
不同点:
1、RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。
2、RF中树是独立的,相互之间不影响,可以并行;而GBDT树之间有依赖,是串行。
3、RF最终的结果是有多棵树表决决定,而GBDT是有多棵树叠加组合最终的结果。
4、RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
5、RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的。
6、RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像adaboost、gbdt、xgboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化。
标准AdaBoost只适用于二分类
优点
实际应用
缺点
终于有人说清楚了--XGBoost算法 - mantch - 博客园
XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。
说到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因为XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。包括前面说过,两者都是boosting方法。
3.3.1 XGBoost的核心算法思想:
跟GBDT乃异曲同工,事实上,如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同就是目标函数的定义。
除了算法上与传统的GBDT有一些不同外,XGBoost还在工程实现上做了大量的优化。总的来说,两者之间的区别和联系可以总结成以下几个方面。
XGBoost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
XGBoost采用的是回归树,所以预测值也必须是回归值,这跟二分类问题有了冲突。
那么XGB如何解决呢?它实际上是将二分类问题当作逻辑斯蒂回归问题来看待的。
这样代入到原XGB的优化式子中,x即为最终的各样本叶子值的和,经过sigmoid函数之后得到概率值。这就解决了回归值与分类之间的问题。
LightGBM在Higgs数据集上LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率也有提升。GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。
LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。
随机森林是Bagging的扩展变体。随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树。
在回归问题中,随机森林输出所有决策树输出的平均值。
在分类问题中,随机森林进行投票选择最优分类。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的。
其实,该缺失值填补过程类似于推荐系统中采用协同过滤进行评分预测,先计算缺失特征与其他特征的相似度,再加权得到缺失值的估计,而随机森林中计算相似度的方法(数据在决策树中一步一步分类的路径)乃其独特之处。
优点:
主要优点:
1、具有极好的准确率
2、能够有效运行在大数据集上
3、能够处理高维特征的输入样本,而且不需要降维
4、能够评估各个特征在分类问题上的重要性
5、在生成过程中,能够获取到内部生成误差的一种无偏估计
6、对于缺省值问题也能获得很好的结果
缺点:
- 随机森林在解决回归问题时,表现较差,这是因为它并不能给出一个连续的输出。
- 随机森林已经被证明在某些噪音较大的分类或者回归问题上会过拟合
- 随机森林就像黑盒子,无法控制模型内部运行(可控性差)
- 对于小数据或者低维数据,可能不能产生很好的分类
- 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
随机森林(Random Forests)现在机器学习中比较火的一个算法,是一种基于Bagging的集成学习方法,能够很好地处理分类和回归的问题。
随机森林有许多优点:
1.准确率极高
2.能够有效地在大数据集上运行
3.引入了随机性,不容易过拟合
4. 随机森林有很好的抗噪声能力,但是在在数据噪音比较大的情况下会过拟合。
5.能处理很高维度的数据,而且不用降维
6. 不仅能处理离散型数据,还能处理连续型数据,而且不需要将数据集规范化
7.训练速度快,能够得到变量重要性排序
8.容易实现并行化
9.即使对于缺省值问题也能够获得很好得结果
10.超参数的数量不是很多,并且都能很直观地了解它们多代表的含义
随机森林的缺点:
虽然随机森林算法已经足够快,但是当遇到随机森林中的决策树个数很多时,训练时所需要的空间和时间会会很大,这将导致模型越慢。因此在实际应用中,如果遇到实时性要求很高的情况,最好选择其他算法。
应用场景
随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。
上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。
在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。
而这样的采样特点就允许我们进行oob估计,它的计算方式如下:
(note:以样本为单位)
1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
2)然后以简单多数投票作为该样本的分类结果;
3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。
预测结果融合策略
参考:模型融合!从加权融合到stacking, boosting
针对分类任务
若某标记得票过半数,则预测为该标记;否则拒绝预测。
预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。
与加权平均法类似。
另外,根据个体学习器可能产生不同类型的输出值,可分为“硬投票”和“软投票”。
使用类标记的投票。(西瓜书的描述)
对多个模型直接进行投票,不区分模型结果的相对重要度,最终投票数最多的类为最终被预测的类。
使用类概率的投票。(西瓜书的描述)
增加了设置权重的功能,可以为不同模型设置不同权重,进而区别模型不同的重要度。
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import VotingClassifier
model1 = LogisticRegression(random_state=2020)
model2 = DecisionTreeClassifier(random_state=2020)
model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard')
model.fit(x_train, y_train)
model.score(x_test, y_test)
对数值型输出,最常见的结合策略是使用平均法。
说明:
加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠。尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合。
因此,加权平均法未必一定优于简单平均法。一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
当训练数据很多时,更强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。
Stacking是学习法的典型代表。平均法和投票法仅是对弱学习器的结果做简单的逻辑处理,而stacking是再加上一层权重学习器(Meta Learner),基学习器(Base learner)的结果作为该权重学习器的输入,得到最终结果。
基本思想:
stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器,初始数据的标记还是被当作新学习器的标记,对不同模型预测的结果再进行建模。
Stacking的工作原理:
在stacking方法中,我们把个体学习器叫做初级学习器,用于结合的学习器叫做次级学习器或元学习器(meta learner),次级学习器用于训练的数据叫做次级训练集。次级训练集是在训练集上用初级学习器得到的。
Stacking算法:
过程1-3 是训练出来个体学习器,也就是初级学习器。
过程5-9是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。
过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。
Stacking的方法讲解:
首先,我们先从一种“不那么正确”但是容易懂的Stacking方法讲起。
Stacking模型本质上是一种分层的结构,这里简单起见,只分析二级Stacking.假设我们有2个基模型 Model1_1、Model1_2 和 一个次级模型Model2
Step 1. 基模型 Model1_1,对训练集train训练,然后用于预测 train 和 test 的标签列,分别是P1,T1
Model1_1 模型训练:
训练后的模型 Model1_1 分别在 train 和 test 上预测,得到预测标签分别是P1,T1
Step 2. 基模型 Model1_2 ,对训练集train训练,然后用于预测train和test的标签列,分别是P2,T2
Model1_2 模型训练:
训练后的模型 Model1_2 分别在 train 和 test 上预测,得到预测标签分别是P2,T2
Step 3. 分别把P1,P2以及T1,T2合并,得到一个新的训练集和测试集train2,test2。
再用 次级模型 Model2 以真实训练集标签为标签训练,以train2为特征进行训练,预测test2,得到最终的测试集预测的标签列 YPreYPre。
这就是我们两层堆叠的一种基本的原始思路想法。在不同模型预测的结果基础上再加一层模型,进行再训练,从而得到模型最终的预测。
Stacking本质上就是这么直接的思路,但是直接这样有时对于如果训练集和测试集分布不那么一致的情况下是有一点问题的,其问题在于用初始模型训练的标签再利用真实标签进行再训练,毫无疑问会导致一定的模型过拟合训练集,这样或许模型在测试集上的泛化能力或者说效果会有一定的下降,因此现在的问题变成了如何降低再训练的过拟合性,这里我们一般有两种方法:
次级模型尽量选择简单的线性模型
利用K折交叉验证
K-折交叉验证: 训练:
预测:
举个栗子:
stacking一般是两层就够了。
stacking使用多折交叉验证,比使用单一留出集更加稳健
基本思想:
Blending采用了和stacking同样的方法,不过只从训练集中选择一个fold的结果,再和原始特征进行concat作为元学习器meta learner的特征,测试集上进行同样的操作。
把原始的训练集先分成两部分,比如70%的数据作为新的训练集,剩下30%的数据作为验证集。
第一层,我们在这70%的数据上训练多个模型,然后去预测那30%数据的label,同时也预测test集的label。
在第二层,我们就直接用这30%数据在第一层预测的结果做为新特征继续训练,然后用test集第一层预测的label做特征,用第二层训练的模型做进一步预测。
Blending训练过程:
整个训练集划分成训练集training sets和验证集validation sets两个部分;
在training sets上训练模型;
在validation sets和test sets上得到预测结果;
将validation sets的原始特征和不同基模型base model预测得到的结果作为新的元学习器meta learner的输入,进行训练 ;
使用训练好的模型meta learner在test sets以及在base model上的预测结果上进行预测,得到最终结果。
Stacking与Blending的对比:
优点在于:
blending比stacking简单,因为不用进行k次的交叉验证来获得stacker feature
blending避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
缺点在于:
blending使用了很少的数据(第二阶段的blender只使用training set10%的量)
blender可能会过拟合
stacking使用多次的交叉验证会比较稳健