【转载】Kaggle 比赛的一些小套路

此篇为转载博文,原文链接:https://www.kaggle.com/c/mdd-cup-2018/discussion/63944

关于比赛流程和 leaderboard

基本是 数据分析、数据清洗、特征工程、模型训练、验证调参与优化 这样一些基本环节,下面再细说。

特别说明一下 Kaggle 在计算得分的时候,有 Public Leaderboard (LB) 和 Private LB 之分。具体而言,参赛选手提交整个测试集的预测结果, Kaggle 使用测试集的一部分计算得分和排名,实时显示在 Public LB 上,用于给选手提供及时的反馈和动态展示比赛的进行情况;测试集的剩余部分用于计算参赛选手的最终得分和排名,此即为 Private LB,在比赛结束后会揭晓。用于计算 Public LB 和 Private LB 的数据有不同的划分方式,具体视比赛和数据的类型而定,一般有随机划分,按时间划分或者按一定规则划分。大家可以合理利用 Public Leaderboard 的排名和反馈来适当调整自己的策略,但是不要太过依赖Public Leaderboard,有些时候它的数据分布和Private Leaderboard会有差异,不要在 Public Leaderboard 上过拟合哦,还是好好利用你的 validation set 吧,以便得到更好的泛化能力。

比赛与数据挖掘流程

数据分析

对数据的分析和理解可以提升大家后续工作的效率,确定合适的方向,下面有一些点大家可以参考:

分析特征变量的分布

  • 特征变量为连续值:如果为长尾分布并且考虑使用线性模型,可以对变量进行幂变换或者对数变换。
  • 特征变量为离散值:观察每个离散值的频率分布,对于频次较低的特征,可以考虑统一编码为“其他”类别。

分析目标变量的分布

  • 目标变量为连续值:查看其值域范围是否较大,如果较大,可以考虑对其进行对数变换,并以变换后的值作为新的目标变量进行建模(在这种情况下,需要对预测结果进行逆变换),有一些其他的变换比如Box-Cox也可以尝试。
  • 目标变量为离散值:如果数据分布不平衡,考虑是否需要上采样/下采样;如果目标变量在某个ID上面分布不平衡,在划分本地训练集和验证集的时候,需要考虑分层采样(Stratified Sampling)。

分析变量之间两两的分布和相关度

  • 可以用于发现高相关和共线性的特征。
    通过对数据进行探索性分析(甚至有些情况下需要肉眼观察样本),还可以有助于启发数据清洗和特征抽取,譬如缺失值和异常值的处理,文本数据是否需要进行拼写纠正等。

数据清洗

数据清洗是指对提供的原始数据进行一定的加工,排除异常值等,使得其方便后续的特征抽取。

  • 数据表的合并
    • 提供的数据分散在多个文件,需要根据相应的键值进行数据的合并拼接。
  • 特征缺失值的处理
    • 特征值为连续值:按不同的分布类型对缺失值进行补全:偏正态分布,使用均值代替,可以保持数据的均值;偏长尾分布,使用中值代替,避免受 outlier 的影响;
    • 特征值为离散值:使用众数等代替。
  • 异常值的处理
    • 对于在分布边缘很极端的一些样本,可以考虑直接剔除,防止拉偏模型

特征工程

特征决定了效果的上限,而不同模型只是以不同的方式或不同的程度来逼近这个上限。这样来看,好的特征输入对于模型的效果至关重要,正所谓”Garbage in, garbage out”。毕竟,“特征做不好,调参调到老,效果还不好”。
特征工程是一个和场景还有数据极度相关的过程。因此可能没有一些固定的方法或者模式,要结合数据特性做相应的处理。下面列一些常见的通用操作。

特征变换

针对一些长尾分布的数据特征,可以做幂变换或者对数变换,使得模型(LR或者DNN)能更好的优化。当然,大家都知道的是,树模型(Random Forest、GBDT、xgboost等)模型对特征数值幅度不敏感。

特征编码

对于离散的类别特征,往往需要进行必要的特征转换/编码才能将其作为特征输入到模型中。常用的编码方式有 LabelEncoder,OneHotEncoder(sklearn里面的接口)。譬如对于”性别”这个特征(取值为男性和女性),使用这两种方式可以分别编码为{0,1}和{[1,0], [0,1]}。

对于取值较多(如几十万)的类别特征(ID特征),直接进行OneHotEncoder编码会导致特征矩阵非常巨大,影响模型效果。可以使用如下的方式进行处理:

  • 统计每个取值在样本中出现的频率,取 Top N 的取值进行 One-hot 编码,剩下的类别分到“其他“类目下,其中 N 需要根据模型效果进行调优;
  • 统计每个 ID 特征的一些统计量(譬如历史平均点击率,历史平均浏览率)等代替该 ID 取值作为特征;
  • 在深度学习中考虑使用embedding

模型训练和验证

模型选择

在处理好特征后,我们可以直接怼一把进行模型的训练和验证,下面是选模型的一般建议(大家可根据实际场景调整)。

  • 对于稀疏型特征(如文本特征,One-hot的ID类特征),我们一般使用线性模型,比如 Linear Regression 或者 Logistic Regression。Random Forest 和 GBDT 等树模型不太适用于稀疏的特征,但可以先对特征进行降维(如PCA,SVD/LSA等),再使用这些特征。稀疏特征直接输入 DNN 会导致网络 weight 较多,不利于优化,也可以考虑先降维,或者对 ID 类特征使用 Embedding 的方式;
  • 对于稠密型特征,推荐使用 XGBoost 进行建模,简单易用效果好;
  • 数据中既有稀疏特征,又有稠密特征,可以考虑使用线性模型对稀疏特征进行建模,将其输出与稠密特征一起再输入 XGBoost/DNN 建模。

调参和模型验证

其实比赛中大家看到某些大神只需要少数的提交次数就可以取得好的结果,而不需要通过反复提交结果去实验,通常是因为他们有比较好的offline的validation set,对于比赛而言,validation set也是至关重要的。一般对数据的划分方式有以下几种:

  • 随机划分:比如随机采样 70% 作为训练集,剩余的 30% 作为验证集。可以采用 KFold 或者 Stratified KFold 的方法来构造训练集和验证集。
  • 按时间划分:一般对应于时序序列数据(比如MDD cup 2017),可以取前一个时间窗(比如前 7 天)数据作为训练集,后 k 天数据作为测试集。这种情况下,划分本地训练集和验证集也需要按时间先后划分。常见的错误方式是随机划分,这种划分方式可能会带来穿越信息,模型严重overfitting。

下面说一下调参方式:
基于大家喜闻乐见的xgboost和LightGBM,大家都是知道常用的调参方式为:

① GridSearchCV:结合交叉验证的网格搜索,可以尽量把所有数据用上,可能的问题是慢,以及网格候选参数不一定选得准。

② EarlyStopping:大概是参赛宝宝里用得比较多的,好处是快,而且基于验证集早停,树的数量比较准确;可能的问题是你的validation set切分可能影响比较大。

其他的一些优化算法,可能包括 Random Search 和 贝叶斯优化调参 等,大家也可以结合具体情况自行选择。

模型集成

这大概是大家最津津乐道的一个话题,一般情况下,怼单模型很容易到达上限,这个时候大家就陷入到,我新加特征效果反而下降等问题里。其实单个模型多多少少会有某种程度的overfitting,所以差异化大的多模型集成往往对最后的结果是有帮助的,而这两届的MDD cup比赛也很好地验证了这一点。

先关于模型多说两句,差异化的模型集成一般才有比较显著的效果,而差异化可以来源于几个方面:

① 特征、数据的差异。这也就是你在各种模型里看到的采样会有用的原因之一。

② 模型的差异,LightGBM和xgboost的集成也许效果不会那么明显(当然一个是leaf-wise的生长方式,一个是level-wise的生长方式,多多少少还是有些差别),但是你用树模型和深度学习融合,效果通常就非常明显了,笔者在MDD cup 2017看到的情况是,top3的team(包括我自己)无一例外地都用了树模型和深度学习模型融合,而效果也是非常显著的。

再模型集成方式做一个简单的说明:
一般情况下,大家对模型做集成,通常的方式无外乎下面几种:

① bagging:类似于直接投票或者求加权平均

② blending:第一层训练基模型,后续的层训练集成模型,注意后面的层用的数据,一定要不同于前面的层,不然很容易overfitting

③ stacking:很有意思又有点难把控的集成方式,关于stacking大佬们说过很多,我就不细说了,可以参考coursera上关于stacking的一节内容https://www.coursera.org/lecture/competitive-data-science/stacking-Qdtt6,也可以在kaggle上找到很多stacking的案例。

结语

以上就是一个简单的关于比赛的一点点小小的分享,祝大家好运!

比赛的结果可能并没有那么重要,很高兴能和大家一起去玩这个比赛,以及交流。希望美团点评的各业务线中,算法能发挥更大的作用,基于海量数据去help people eat better, Live better!

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2023 Leamx's Blog All Rights Reserved.

UV : | PV :