stacking做CV的一些用法和理解




kaggle上面讲stacking的CV:

http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/ 

感觉这种方法是可以减少过拟合的


主要的一点是,我们使用基础模型的预测作为堆叠模型的特征(即元特征)。因此,堆叠模型能够辨别每个模型在哪里执行得很好,以及每个模型执行得不好的地方。同样重要的是要注意,train_meta的第i行中的元特征不依赖于第i行中的目标值,因为它们是使用在基本模型的拟合过程中排除了target_i的信息而产生的。


或者,我们可以在适合每个测试折叠后立即使用每个基本模型对测试数据集进行预测。在我们的例子中,这将产生五个K-最近邻模型和五个SVM模型的测试集预测。然后,我们将平均每个模型的预测来生成我们的M1和M2元功能。这样做的一个好处是比第一种方法耗时更少(因为我们不必在整个训练数据集中重新训练每个模型)。这也有助于我们的火车元功能和测试元功能应遵循类似的分布。然而,由于每个基本模型都是在完整的训练数据集上进行训练(而不是80%的训练数据集,在第二种方法中是5次),所以测试元M1和M2在第一种方法中可能更准确。


堆叠模型超参数调整

那么,如何调整堆叠模型的超参数呢?关于基本模型,我们可以使用交叉验证+网格搜索来调整它们的超参数,就像我们之前做的一样。我们使用的折叠并不重要,但是使用我们用于堆叠的折叠通常很方便。调整堆叠模型的超参数是事情变得有趣的地方。在实践中,大多数人(包括我自己)都使用交叉验证+网格搜索,使用与生成元特征相同的精确的CV折叠。这种方法有一个微妙的缺陷 - 你能发现吗?


事实上,我们的堆栈CV程序中存在少量的数据泄漏。考虑堆叠模型的第一轮交叉验证。我们拟合S模型{fold2,fold3,fold4,fold5},对fold1进行预测并评估性能。但是{fold2,fold3,fold4,fold5}中的元功能依赖于fold1中的目标值。所以,我们试图预测的目标值本身嵌入到我们用来模拟我们模型的功能中。这是泄漏,理论上S可以从元特征中推导出关于目标值的信息,从而导致其过度拟合训练数据,而不能很好地概括出包外样本。但是,你必须努力想出一个例子,这个泄漏足以导致堆叠模型过度配合。实际上,每个人都忽略了这个理论漏洞(坦率地说,我认为大多数人都不知道它存在!)。


堆叠模型选择和特征
你怎么知道什么样的模型选择作为堆垛机和元功能包括哪些功能?在我看来,这更像是一门艺术,而不是一门科学。你最好的办法是尝试不同的事情,并熟悉哪些是有效的,哪些不行。另一个问题是,除了元功能之外,还应该包含哪些功能(如果有的话)还包含在堆栈模型中?这又是一种艺术。看看我们的例子,很明显DistFromCenter参与确定哪个模型能够很好的运行。 KNN似乎在中央附近掷飞镖的分类效果更好,而SVM模型在对从中心掷出的飞镖进行分类时效果更好。让我们试着用Logistic回归来叠加我们的模型。我们将使用基本模型预测作为元功能和DistFromCenter作为附加功能。


毫无疑问,堆叠模型比两个基本模型都有更好的表现 - 75%的CV精度和86%的测试精度。现在我们来看看覆盖训练数据的分类区域,就像我们对基本模型做的一样。


这里要说的是,Logistic回归堆叠模型捕捉每个基本模型的最佳方面,这就是为什么它独立地比任一基本模型执行得更好。


实践中堆叠
为了解决这个问题,我们来谈谈在现实世界中如何,何时以及为什么要使用堆栈。就个人而言,我主要在Kaggle的机器学习比赛中使用堆叠。一般来说,堆叠会带来很小的收益,而且会增加很多复杂性 - 对于大多数企业来说不值得。但Stacking几乎总是富有成效,所以它几乎总是用在顶级的Kaggle解决方案中。事实上,当你有一群人试图在模型上合作的时候,堆叠对于Kaggle是非常有效的。同意一套折叠,然后每个团队成员使用这些折叠构建他们自己的模型。然后,每个模型可以使用单个堆栈脚本进行组合。这很好,因为它阻止了团队成员踩到彼此的脚趾,笨拙地试图将他们的想法融入相同的代码库。


最后一点假设我们有(用户,产品)对的数据集,并且我们想要预测用户如果向他/她提供该产品的广告,他们将购买给定产品的概率。使用培训数据,一个有效的特征可能是什么,过去他实际购买的产品的广告百分比是多少?因此,对于训练数据中的样本(user1,productA),我们想要加入像UserPurchasePercentage这样的功能,但是我们必须小心,不要在数据中引入泄漏。我们这样做如下:


将训练数据拆分成折叠
对于每个测试折叠
识别测试折叠中唯一的一组用户
使用剩余的折叠来计算UserPurchasePercentage(每个用户购买的广告产品的百分比)
通过(折叠ID,用户ID)将UserPurchasePercentage映射回训练数据
现在我们可以使用UserPurchasePercentage作为我们渐变增强模型(或任何我们想要的模型)的特征。实际上,我们刚才所做的就是建立一个预测模型,预测user_i将根据他过去购买的广告产品的百分比概率购买product_x,并将这些预测用作我们真实模型的元功能。这是一种微妙而有效的堆叠形式 - 我经常在实践中和在Kaggle上实现。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值