集成学习
集成思想
Bagging
- 随机深林(RF)
Boosting
代表算法
-
Adaboost
-
GBDT(Greadient boosting decision tree)
代表实现:
-
XGBoost
-
LightGBM
-
CatBoost
-
Stacking
Blending
集成学习概述:
通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system)。集成学习可以用于分类问题集成,回归问题集成,特征选取集成,异常点检测集成等等,可以说所有的机器学习领域都可以看到集成学习的身影。
需要解决的问题:
- 如何得到若干个个体学习器(生成方式)
- 如何选择结合策略(结合方式)
概念:
个体学习器(件学习器):个体学习器通常由一个现有的学习算法从训练数据产生
同质学习器(基学习器):此时集成中只包含同种类型的个体学习器
异质学习器:集成也可包含不同类型的个体学习器组
弱学习器:指泛化性能略优于随机猜测的学习器。例如二分类问题精度略高于50%的分类器。
生成方式
Boosting
个体学习器问存在强依赖关系、必须串行生成的序列化方法
工作机制:
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T , 最终将这T 个基学习器进行加权结合.
特点:
- 串行生成
- 倾向于错误数据学习,增大放错样本的加权
- 从偏差-方差分解的角度看,Boosting主要关注降低偏差。因此Boosting能基于泛化性能相当弱的学习器构造出很强的集成。
Boosting训练(生成)过程:
- 基于原始数据集构造子集
- 初始的时候,所有的数据点都给相同的权重
- 基于这个子集创建一个基模型
- 使用这个模型在整个数据集上进行预测
- 基于真实值和预测值计算误差
- 被预测错的观测值会赋予更大的权重
(重赋权法re-weighting)/(重采样法 re-sampling——对于无法接受带权重的及学习算法,则可使用) - 再构造一个模型基于之前预测的误差进行预测,这个模型会尝试矫正之前的模型
- 类似地,构造多个模型,每一个都会矫正之前的误差
- 最终的模型(strong learner)是所有弱学习器的加权融合
代表模型:
adaBoost((adaptive boost))
GBDT(Greadient boosting decision tree)
是一种迭代的决策树算法,该算法由多棵决策树组,所有树的结论累加起来做最终答案
损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树
三个概念组成:
Regression Decistion Tree(DT、RT)
Gradient Boosting(GB)
梯度提升决策树模型
对比Gradient Desend
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZR70jVnP-1638804631707)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206221835771.png)] Shrinkage(步长)人工设置
残差学习:预测值 + 残差 = 实际值
GBDT模型F定义为加法模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xd6sq9id-1638804631707)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206221704986.png)]
其中, x为输入样本, h为分类回归树, w是分类回归树的参数, a是每棵树的权重
我们知道,求最优模型目标是小化损失函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02lc0aqL-1638804631708)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206221813708.png)]
算法步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGsEJ6X3-1638804631708)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206221721457.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtGUyWDT-1638804631709)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206221725088.png)]
Bagging
个体学习器间不存在强依赖关系、可同时生成的并行化方法。
自助采样法(bootstrap sampling):给定包含m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机采样操作,我们得到含m 个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。
工作机制:基于自助采样法,可采样出T 个含m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
Bagging 在对预测输出进行结合时,通常方式:
对分类任务使用简单投票法
(若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者.)
对回归任务使用简单平均法.
特点:
- 并行生成并且相互独立
- 训练子集的大小和原始数据集的大小相同
- 最终的预测结果取决于多个模型的预测结果
- 从偏差方差分解的角度看, Bagging 主要关注降低方差,因此它在不剪枝
决策树、神经网络等易受样本扰动的学习器上效用更为明显
生成过程:
- 基于m原始数据集构造T个包含m个样本集
- 每个采样集训练出一个基学习器(base model)。
- 使用这个模型在整个数据集上进行预测
- 最终的模型(strong learner)是所有弱学习器的投票或者平均结果。
代表模型:
随机深林((Random Forest Rf)
(1)数据采样
(2)特征采样
属于bagging的扩展体。在训练的过程中增加随机性。
正常决策树:划分属性时,是在当前结合点的属性集合(假设有d个属性)中选择一个最优属性;
而在rf中,对基决策树的每个节点,从该节点的属性集合中随机选择k个属性的子集,然后再从这个子集中选择一个最优属性用于划分. 这里的参数k 控制了随机性的引入程度;
若令k = d , 则基决策树的构建与传统决策树相同;
若令k = 1 , 则是随机选择一个属性用于划分;
一般情况下,推荐值k = log2 d
随机深林优缺点
优点:
训练速度快、容易实现并行
训练完成后,反馈那些事重要特征
抗过拟合能力强
可解决分类、回归问题
不平衡数据集、rf是平衡误差优有效方法
缺点:
取值比较多的属性,影响大
噪音大的分类、回归问题会过拟合
只能尝试参数和种子的选择,无法洞悉内部
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPRRuVLR-1638804631709)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206225852450.png)]
结合策略
学习器结合好处:
- 从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能? 此时若使用单学习器可能因误选而导致泛化性能不佳,结合多
个学习器则会减小这一风险; - 从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很糟糕, 而通过多次运行之后进行结合, 可降低陷入糟糕局部极小点的风险;
- 从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器, 由于相应的假设空间有所扩大,有可能学得更好的近似;
平均法(averaging)
对数值型(回归)输出,最常见的结合策略是使用平均法
-
简单平均法
Averaging方法就多个模型预测的结果进行平均。这种方法既可以用于回归问题,也可以用于对分类问题的概率进行平均
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2WfBheD-1638804631710)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230342597.png)]
-
加权平均法
这种方法是平均法的扩展。考虑不同模型的能力不同,对最终结果的贡献也有差异,需要用权重来表征不同模型的重要性importance
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrhXu6gb-1638804631710)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230351134.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBeutWM1-1638804631711)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230401184.png)]
投票法(voting)
对分类任务来说,学习器hi 将从类别标记集合{Cl ,C2… , CN} 中预测出一
个标记,最常见的结合策略是使用投票法(voting)
-
绝对多数投票法
最终结果必须在投票中占一半以上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xh92pVKJ-1638804631712)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230605789.png)]
-
相对多少投票法
最终结果在投票中票数最多
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YU7t9SF-1638804631713)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230643445.png)]
-
加权投票法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sxl5YwW7-1638804631713)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230711988.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZrWZ0w2-1638804631714)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206230716443.png)]
个体学习器输出值的类型分类:
类标记: h; (x) ε{0 , 1},若仇将样本z 预测为类别Cj 则取值为1 ,否则为
O. 使用类标记的投票亦称硬投票 (hard voting).
类概率: h; (x) ε[0 , 1],相当于对后验概率P(Cj | x) 的一个估计.使用类
概率的投票亦称软投票(soft voting).
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 分两层,一层基础学习器。二层学习结合策略
概念:
生成训练集的个体学习器叫做初级学习器
用于结合的学习器叫做次级学习器或元学习器(metalearner)
次级学习器用于训练的数据叫做次级训练集,次级训练集是在训练集上用初级学习器得到的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FpUmdrih-1638804631714)(C:\Users\76437\AppData\Roaming\Typora\typora-user-images\image-20211206231627656.png)]
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,得到最终的测试集预测的标签列 。
这就是我们两层堆叠的一种基本的原始思路想法。在不同模型预测的结果基础上再加一层模型,进行再训练,从而得到模型最终的预测。
Stacking本质上就是这么直接的思路,但是直接这样有时对于如果训练集和测试集分布不那么一致的情况下是有一点问题的,其问题在于用初始模型训练的标签再利用真实标签进行再训练,毫无疑问会导致一定的模型过拟合训练集,这样或许模型在测试集上的泛化能力或者说效果会有一定的下降,因此现在的问题变成了如何降低再训练的过拟合性,这里我们一般有两种方法:
次级模型尽量选择简单的线性模型
利用K折交叉验证
训练:
预测:
#这里只实现了针对一个基模型做K折交叉验证,因为P1和T1都是多行一列的结构,这里是先存储为一行多列,最后进行转置。
def get_oof(clf, x_train, y_train, x_test):
oof_train = np.zeros((ntrain,))
oof_test = np.zeros((ntest,))
oof_test_skf = np.empty((NFOLDS, ntest)) #NFOLDS行,ntest列的二维array
for i, (train_index, test_index) in enumerate(kf):
#循环NFOLDS次
x_tr = x_train[train_index]
y_tr = y_train[train_index]
x_te = x_train[test_index]
clf.fit(x_tr, y_tr)
oof_train[test_index] = clf.predict(x_te)
oof_test_skf[i, :] = clf.predict(x_test)
#固定行填充,循环一次,填充一行
oof_test[:] = oof_test_skf.mean(axis=0)
#axis=0,按列求平均,最后保留一行
return oof_train.reshape(-1, 1),oof_test.reshape(-1, 1) #转置,从一行变为
转置,从一行变为
学习器的多样性
误差-分歧分解
多样性度量
- 不合度量(disagreement measure)
- 相关系数(correlation coefficient)
- Q-统计量(Q-statistic )
- κ-统计量(κ-statistic)
多样性增强
- 输入属性扰动
- 输出表示扰动
- 算法参数扰葫
bagging 与 boosting采用的都是采样-学习-组合的方式。
Bagging中每个训练集互不相关,也就是每个基分类器互不相关,而bagging中训练集要在上一轮的结果上进行调整,也使得其不能并行计算。Bagging中预测函数是均匀平等的,但是boosting中预测函数是加权的。
Xgboost light gbm catboost
算法结构差异
每个算法的分类变量时的处理
如何理解参数算法在数据集上的实现
每个算法的表现
衡量指标
特征重要性
SHAP值
可视化树
调参以及其优劣势
优势势:训练样本有限,所需训练时间较短,缺乏调参知识的场景中。
Xgboost并行计算
Tree粒度上还是串行,在特征粒度上进行。预先计算。
偏差、方差
偏差 Bias - 准确度
方差 Variance - 稳定度