查看: 1490|回复: 0

正经机器学习之stacking的介绍

[复制链接]

166

主题

616

帖子

1万

积分

xdtech

Rank: 5Rank: 5

积分
10721
发表于 2019-10-25 00:38:01 | 显示全部楼层 |阅读模式
stakcing常常在各大数据挖掘竞赛中被广泛使用,号称“大杀器”。是数据挖掘竞赛高端玩家必备技能,本篇文章就对stakcing的一些基本原理进行介绍。
首先,在我看来stacking 严格来说不能称为一种算法,我理解的是一种非常精美而复杂的对模型的集成策略。大家都知道,在给定了数据集的情况下,数据内部的空间结构和数据之间的关系是非常复杂的。而不同的模型,其实很重要的一点就是在不同的角度去观测我们的数据集。比如说,KNN 可能更加关注样本点之间的距离关系(包括欧几里得距离(Euclidean Distance)、明可夫斯基距离(Minkowski Distance 等等),当样本距离相对较近, KNN 就把他们分为一类;而决策树,可能更加关注分裂节点时候的不纯度变化,有点像我们自己找的规则,在满足某个条件且满足某个条件的情况下,决策树把样本分为一类等等。也就是说,不同的算法模型,其实是在不同的数据空间角度和数据结构角度来观测数据,然后再依据它自己的观测,结合自己的算法原理,来建立一个模型,在新的数据集上再进行预测。这样大家就会有个疑问了,俗话说:三人行必有我师。既然是不同的算法对数据有不同的观测,那么我们能不能相互取长补短,我看看你的观测角度,你看看我的观测角度,咱俩结合一下,是不是可以得到一个更加全面更加优秀的结果呢?答案是肯定的。在我当初学基础算法的时候就有这么一个疑问,但是不知道怎么结合,直到有一天看到了 stacking的框架,瞬间感觉找到了一片新天地~~~~下面我从以下几个方面介绍 stacking。
一、stacking 的框架结构与运行过程:
刚开始看 stacking 好像是交叉检验的既视感,其实并不是这样。假设是五折的stacking,我们有一个train 数据集和一个test 数据集,那么一个基本的stacking 框架会进行如下几个操作:
1、选择基模型。我们可以有 xgboost,lightGMB,RandomForest,SVM,ANN,KNN, LR 等等你能想到的各种基本算法模型。
2、把训练集分为不交叉的五份。我们标记为 train1 到 train5。
3、从 train1 开始作为预测集,使用 train2 到 train5 建模,然后预测 train1,并保留结果;然后,以 train2 作为预测集,使用 train1,train3 到 train5 建模,预测 train2,并保留结果;如此进行下去,直到把 train1 到 train5 各预测一遍;
4、在上述建立的五个模型过程中,每个模型分别对 test 数据集进行预测,并最终保留这五列结果,然后对这五列取平均,作为第一个基模型对 test 数据的一个 stacking 转换。
5、把预测的结果按照 train1 到 trian5 的位置对应填补上,得到对 train 整个数据集在第一个基模型的一个 stacking 转换。
6、选择第二个基模型,重复以上 2-5 操作,再次得到 train 整个数据集在第二个基模型的一个 stacking 转换。
7、以此类推。有几个基模型,就会对整个train 数据集生成几列新的特征表达。同样,也会对test 有几列新的特征表达。
8、一般使用LR 作为第二层的模型进行建模预测。
大家看到这里可能有些不清楚,下面我画个图直观解释一下:
上面这个框架说明的是:对训练数据进行无重复的五次划分之后,分别对其中每一部分进行一次预测,而预测的模型就是由其余四部分训练的;并且在预测了预测集之后,还需要对我们的 test 数据集也进行一次预测,这这样就会得到 5 个 N/5 行、1 列的对 train 数据集的特征转换,和 5 个 M 行、1 列的对 test 数据集的特征转换,由此进入下一个图。
这个图说明的是对五部分的 train 分别预测之后再组成对 train 的新的表达,由 5 个5/N 行一列的预测组成一个 N 行 1 列预测结果,从而得到对 train 的新表达;同时,对test 的结果也进行处理,由于是 5 个模型对 test 的预测,所以要取平均,使得五列平均为一列,从而得到对 test 的新表达。
至此,整个 stacking 的框架和运作流程介绍完毕,希望大家通过上面这一部分,能对 stacking 的整个框架和运作流程有个比较清晰的认识。
二、使用stacking 的一些注意事项:
经过上一部分的介绍,想必大家感觉到 stacking 的威力可能很大,事实上也是这样的。但是仍然有一些需要注意的地方,简单介绍几点:
1、stacking 的框架设计比较复杂,对于一个基模型要训练 5 次,如果你的一个 xgb 模型要训练 2 个小时,即使在进行 stacking 的时候每折减少了五分之一的数据量,你的计算时间仍然是很可观的,加起来应该还是 8-9 小时,所以耗费时间很长(想像一下一个 stacking 框
架跑一个基模型要大半天,简直太可怕)。所以建议大家在使用的时候要计算时间的耗费,
或者可以改为 3 折,4 折等等;
2、我们前面讲过了,stacking 框架是集成了不同的算法,充分利用不同算法从不同的数据空间角度和数据结构角度的对数据的不同观测,来取长补短,优化结果。所以,我们的基
模型除了是不同参数的相同模型之外,比如不同参数的 xgboost,或者不同 K 值的 KNN 等等;更重要的是要尽可能的多加一些不同种类的基模型进去,也就是说所谓的模型要“跨越空间” 的概念。这样的话我们的集成结果会更加稳健,更加精确。
三、stacking 的一些基本变种改进:
在变种改进方面,我们可以不仅对模型进行融合,还可以对特征级进行一些变化,比如选部分特征做 stacking;或者对 stacking 的结果进行再次的 stacking,我们上面介绍的是两层的 stacking,可以有 3 层,或者更多。但是时间复杂度很高,效果并不一定明显。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表