转自:https://www.kaggle.com/c/mdd-cup-2018/discussion/63944
基本是 数据分析、数据清洗、特征工程、模型训练、验证调参与优化 这样一些基本环节,下面再细说。
特别说明一下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吧,以便得到更好的泛化能力。
对数据的分析和理解可以提升大家后续工作的效率,确定合适的方向,下面有一些点大家可以参考:
数据清洗是指对提供的原始数据进行一定的加工,排除异常值等,使得其方便后续的特征抽取。
特征决定了效果的上限,而不同模型只是以不同的方式或不同的程度来逼近这个上限。这样来看,好的特征输入对于模型的效果至关重要,正所谓”Garbage in, garbage out”。毕竟,“特征做不好,调参调到老,效果还不好”。 特征工程是一个和场景还有数据极度相关的过程。因此可能没有一些固定的方法或者模式,要结合数据特性做相应的处理。下面列一些常见的通用操作。
针对一些长尾分布的数据特征,可以做幂变换或者对数变换,使得模型(LR或者DNN)能更好的优化。当然,大家都知道的是,树模型(Random Forest、GBDT、xgboost等)模型对特征数值幅度不敏感。
对于离散的类别特征,往往需要进行必要的特征转换/编码才能将其作为特征输入到模型中。常用的编码方式有 LabelEncoder,OneHotEncoder(sklearn里面的接口)。譬如对于”性别”这个特征(取值为男性和女性),使用这两种方式可以分别编码为{0,1}和{[1,0], [0,1]}。
对于取值较多(如几十万)的类别特征(ID特征),直接进行OneHotEncoder编码会导致特征矩阵非常巨大,影响模型效果。可以使用如下的方式进行处理:
在处理好特征后,我们可以直接怼一把进行模型的训练和验证,下面是选模型的一般建议(大家可根据实际场景调整)。
其实比赛中大家看到某些大神只需要少数的提交次数就可以取得好的结果,而不需要通过反复提交结果去实验,通常是因为他们有比较好的offline的validation set,对于比赛而言,validation set也是至关重要的。一般对数据的划分方式有以下几种:
下面说一下调参方式: 基于大家喜闻乐见的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!