一份完整的数据科学竞赛指南!

2020-12-08 15:12:59 浏览数 (1)

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍“听过很多道理,却依然过不好一生;看过很多分享,却依然做不好比赛。”

如今,数据科学竞赛(大数据竞赛,机器学习竞赛,人工智能算法竞赛)已经成为各大知名互联网企业征集解决方案和选拔人才的第一选择,很多同学为了拿到大厂offer,纷纷加入了数据竞赛的浪潮之中。遗憾的是,大部分同学都在激烈的竞争中成为炮灰,许多人不停地上网浏览各类竞赛开源分享,却依旧感到困惑迷茫。

在过去几年时间内,笔者靠着个人天赋和不懈努力,从0到1地走通了数据科学竞赛方法论,培养了一直数据科学竞赛的团队,并作为队长率多名选手参与了近20次数据科学竞赛,获得前5名5次,前10名8次,赛题方向包括金融、交通、信息安全、广告推荐、运筹优化等。考虑到近几年在数据科学竞赛里取得的丰厚的成果,我将自己的独门秘笈进行了详细总结并开源之,希望可以帮助更多同学快速上手相关比赛。

我认为这份竞赛秘笈与市面上流传的各种竞赛分享相比,更real,更direct,更cunning。如果你想快速成为竞赛高手,这份文档是你必须要认真研究的参考资料。

下面,我将从三个方面来详细介绍数据科学竞赛,然后在结尾处谈一点个人的感悟。建议不熟悉机器学习建模套路的同学先搞清楚流程,熟悉建模套路的同学,直接看经验干货即可。

目录

一、数据科学家竞赛是什么?

二、为什么要做数据科学竞赛?

三、怎样做数据科学竞赛?

  • 3.1 武器库
  • 3.2 赛题分析
  • 3.3 数据探索
    • 3.3.1 数据整体认知
    • 3.3.2 数据质量分析
    • 3.3.3 数据统计量分析
    • 3.3.4 数据分布分析
    • 3.3.5 数据探索小结
  • 3.4 特征工程
    • 3.4.1 数据预处理
    • 3.4.2 特征构造
      • 3.4.2.1 思想方法
      • 3.4.2.2 特征构造举例
      • 3.4.2.3 特征构造 注意事项
    • 3.4.3 特征选择
    • 3.4.4 特征工程总结
  • 3.5 模型选择
  • 3.6 模型优化
    • 3.6.1 评估方法
    • 3.6.2 性能度量
    • 3.6.3 参数调整
  • 3.7 模型融合
  • 3.8 迭代策略
  • 3.9 其他

四、总结

一、数据科学竞赛是什么?

数据科学竞赛是由企业或者研究机构通过竞赛平台发布商业和科研难题,通过高额奖金的悬赏,吸引全球的数据科学家参与,利用众包方式解决建模问题的一种游戏。这个游戏本质上就是一种打擂台的玩法,符合各种有限游戏的规则设计,不过你同时要与成百上千的人PK。

数据科学竞赛一般通过各类数据竞赛平台进行发布,最著名的数据科学竞赛平台是Kaggle和天池,Kaggle的背后是Google,天池的背后是阿里巴巴。当然,还有很多公司自己组织的比赛和顶级学术会议筹办的比赛。如果你想做比赛的话,去下面这些平台上寻找适合自己的比赛即可:

  1. Kaggle,天池
  2. 京东智汇平台,DataFountain,DataCastle,科赛网,创新工场AIChallenger等
  3. 腾讯,滴滴出行,第四范式,中国平安,融360,中国农业银行等
  4. SIGKDD,ICDM,CIKM,IJCAI等

二、为什么要做数据科学竞赛?

第一,让你100%清楚哪些算法在实际应用中更有效。解释一下,这里的“有效”包括算法的性能和效率。现在很多人往往是看过了周志华的西瓜书,就觉得自己懂机器学习了,这是很可笑的。最典型的例子就是很多人觉得SVM是最好用的分类器。包括很多发过会议论文的同学,其实也是停留在理论的乌托邦,而且论文的results部分有多real也很难判断。做比赛你可以拿到工业界的数据,而且这些数据都是头部互联网大厂的实际业务数据,所以在实战的过程中,我们可以逐渐井底之蛙蜕变为翱翔在天空的雄鹰,很清楚地知道哪些算法好用,哪些方法靠谱,哪些人在吹逼和忽悠。

第二,结识朋友,提升人脉。做比赛时如果你运气比较好,可以和优秀的同学组队,当然前提是你自己足够牛逼。另外,如果你拿到了某个竞赛top5或top10,你的team有可能被邀请去参加线下的答辩,这绝对是认识技术大牛,提升人脉的好机会。比如笔者就去过像阿里云、京东、滴滴、马上金融,中国平安、中国农业银行这样的单位参与线下答辩,在紧张的答辩之余,利用吃吃喝喝的时间进行social,运气好的话,你还能加到某些公司中高级管理者的微信。截止目前,国内竞赛圈一半以上的头部大佬都是我的朋友,有些还在一起玩比赛、做课题。

第三,训练和提高自己快速写代码的能力。要知道每场比赛你要在短时间内实现很多很多的idea,有时候一天之内你要想出三到四个上分的办法。这个过程讲究的是速战速决,不仅可以训练自己快速写代码和实现idea的能力,也可以很好地训练你的判断力和决策能力。

第四,实习机会 & 高薪工作。像我之前就拿到过多家大厂的直通终面机会。统计了一下跟我做过比赛的学弟学妹的工作情况,目前大部分就职于知名国企和互联网企业,比如阿里、腾讯、京东、滴滴、美团、中国农业银行、中国交通建设股份有限公司、中国人寿资产管理有限公司、一汽大众等等。

第五,奖金。一般的比赛都会有奖金,不给钱的比赛就别做了,那种比赛除了练手,没有任何价值可言。钱是体现赛题困难程度的重要指标。具体的钱数,最少1万起,多则税前30万到50万。但悲哀的是,奖金一般人是拿不到的,因为任何一个圈子都是1%的人赚走了99%的利润,小白们只能跟着长点见识,苦逼陪跑。

三、怎样做数据科学竞赛?

3.1 武器库

俗话说,台上一分钟、台下十年功。虽然参加数据科学竞赛不需要十年的修炼,但还是需要一些基础的知识技能作为支撑的,我讲以下几个方面。

基础知识

  • 数学基础:微积分、线性代数、概率论与数理统计、优化理论
  • 机器学习理论:周志华《机器学习》、李航《统计机器学习》、Ian Goodfellow和Youshua Bengo《Deep Learning》、Bishop的PRML
    • 目前国内大大小小的课程和博客都在讲周志华的西瓜书和李航的书,但这里我想补充一点个人的看法:
      • 我认为我看过的最好的讲传统机器学习理论的书籍是K. P. Murphy的《Machine learning: A Probabilistic Perspective》,其次是Bishop的PRML
      • 另外,台大李宏毅老师的网课,真的是十分良心,建议大家去B站学习
  • Python:《Python基础教程》《利用Python进行数据分析》《机器学习实战》

文献资料

  • Paper
    • 主要关注CCF A里的顶级会议论文
    • arxiv要好好利用
  • Csdn、知乎、GitHub等开源知识分享平台
  • Kaggle、天池里的各种kernel

软件配置

  • 开发环境
    • Anaconda
    • Jupyter Notebook
    • Pycharm
      • 虽然Jupyter Notebook的交互性更好,但个人更喜欢用Pycharm
  • 开源库
    • 数据处理包:Numpy Scipy Matplotlib Pandas等
    • 机器学习包:Sklearn XGBoost LightGBM Keras TensorFlow Pytorch等

硬件配置

  • 高性能PC:
    • 强推Macbook Pro,资金不足的话可以自己搭Linux。这个时代Windows也可以了其实,但用起来总有些地方让你不爽。
    • 早年很多关键的包比如lightgbm不支持Windows,笔者也是画了一两个月的时间才熟悉了Linux,用熟了还是很顺滑的
  • 服务器
    • 注:现在越来越多的比赛平台提供运算资源了,但除非是必须,能不用就不用,因为大家一起抢资源导致写了代码不能跑的滋味真的很酸爽

关于以上这些知识技术储备,我建议大家不要一直看书,计算机科学和机器学习的相关应用都是实践性很强的项目。任何一门有关编程语言的教材,看一周的时间足够了。关键在于动手实践,做项目做比赛,也就是任务驱动型学习。关于编程我还想说一个原则,就是“天下文章一大抄,看你会抄不会抄”。在做一个任务时,你的代码能复制粘贴就不要自己敲。这些年我见过很多喜欢耍小聪明的同学,试图通过自主实现一些算法来证明自己的智商。这其实是一种十分幼稚的心理,编程本质上是一个结果导向十分明显的活动,解决问题远比证明你自己有多么优秀更重要。

除了以上这些武器之外,你还需要知道做比赛的流程。参与一个数据科学竞赛,大致需要这么几个步骤:赛题分析,数据探索,数据预处理,特征构造,特征选择,模型选择,模型优化,模型融合,预测提交。其中数据预处理、特征构造、特征选择合起来可以称之为特征工程。然后,还需要一个有效的迭代策略来管理你的idea和代码。做比赛之前一定要将此流程牢记于心并一步一步地进行,下面就让我为大家介绍图中的每一步具体是如何操作的。

3.2 赛题分析

在我看来啊,赛题分析其实是在解决战略层面的问题,这一块其实是非常重要的,但市面上的很多开源的经验分享往往有意回避这一块内容,只谈各种具体的方法和技巧。殊不知,真正做成一件事,不仅需要“术”,还需要“道”,但可惜的是,懂“道”的人实在是不多。为了让大家更好地理解数据科学竞赛中的“道”,我将赛题分析部分总结为以下这些内容,包括对赛题背景的理解,对重要时间的把握,组队的规则,评测机会的多少,以及对赛方提供训练数据的理解。

关于赛题背景。你需要仔细阅读官方给出的赛题背景,然后查阅相关资料,对问题场景做深入的理解。因为对于我们这些学生来讲,我们可能对机器学习和数据挖掘的理论知识掌握的很好,但缺乏对具体的问题场景理解。这就好比你只会做算术题却不会做应用题。希望大家记住一句话,解决问题的第一步是认识问题。你只有把问题背景认识清楚,看清出题者的动机,才有可能在比赛中取得好成绩。

关于重要时间。一个数据科学竞赛一般要持续两到三个月甚至更长的时间,你在这么长的时间内肯定还会有其他的事情要做,所以时间管理是很重要的。所以要根据赛方给出的重要时间节点(包括初赛开始时间、组队完成时间、复赛开始时间、复赛结束时间、线下答辩时间),规划好比赛与其他工作的时间安排。这里要插一句,其实并行工作是很难的,也是很扯淡的。如果你想取的好成绩,还是需要专注在一件事上。

关于组队规则。你一定要想清楚和什么样的人组队。我真心想告诉大家的一句话是,不怕神一样的对手,就怕猪一样的队友。这句话什么意思大家应该很清楚了。希望大家不拒绝猪队友,也不要当猪队友坑别人。还有一点就是,搞清楚这个比赛能不能利用小号。每多一个小号,意味着多一倍的评测机会。你的评测机会越多,你上分的可能性越大。因此,每场比赛都会有很多人拿不同的手机号去注册竞赛平台的账号以求增加自己的评测机会,排行榜上也存在大量的小号。有时候你虽然线上测评的分数在提高,但名次依然再下降,这时候不要灰心,说不定是前排大佬的小号把你踢了下来。

关于评测机会。搞清楚每天有几次评测机会、几点开始评测。较大的比赛受限于计算资源,每天只有一次评测机会,这种情况下还是得好好做线下的测试,珍惜每一次提交的机会。同时,基于评测次数,设计每天的模型迭代策略。另外要注意的是,评测次数多不一定是好事,因为次数多了之后对自己有利,但对手也有利。所以在同样的游戏规则下,如何充分利用各方面的条件提高自己的排名,的确是个需要你认真琢磨的事情。

关于赛题数据。你需要搞清楚,赛方提供了什么数据?要解决的问题:分类问题 or 回归问题?用什么软件工具:个人PC or 官方计算平台?提交什么样的结果?也就是结果的数据格式要求。我在刚刚做比赛的时候经常出现因为提交数据文件格式不正确而浪费评测机会。

3.3 数据探索

主要包括四个方面:数据整体认知、数据质量分析、数据统计量分析、数据分布分析

3.3.1 数据整体认知

所谓的整体认知就是,研究训练集、测试集、表数、记录数、用户数、变量数、变量类型、变量属性值、标签等内容,然后绘制实体-关系图。实体-关系图(E-R图)包括三个组成部分:实体、属性、关系。学过数据库的同学应该熟悉E-R图这个概念。

比如我在做IJCAI2018阿里妈妈国际广告算法大赛时,就绘制了如下图的实体关系图来帮助我们理解数据。

把这个图画出来之后,对每个属性变量,施以哲学中的三大灵魂拷问:

  • 你是谁?
  • 你从哪儿来?
  • 你要到哪里去?

也就是搞清楚每一个变量包含了什么信息,搞清楚它的来龙去脉,搞清楚变量和变量之间的关系。通过这个过程,让你对整个问题背景和原始数据有一个深入地了解,为后续工作做准备。

3.3.2 数据质量分析

所谓数据质量分析,就是分析数据的缺失值、重复值、异常值、歧义值、正负样本比例(样本不平衡)等特性。由于这些东西都会影响到模型的学习效果,所以在后面做数据预处理时需要做相应的工作。

图片来自网络

3.3.3 数据统计量分析

数据统计量分析主要分为三块:

第一,对单个变量的统计分析。比如考察单个变量的均值、中位数、众数、分位数、方差、变异系数等。常用的工具有:直方图、箱线图、小提琴图等。

第二,对两个变量的统计分析。这里主要考察的是两个变量统计分布之间的关系。常用的工具包括散点图、相关性分析图、热力图等。

第三,对多个变量的统计分析。可以使用彩色的散点图,或者RadViz(详见scikit-yb.org/en/latest)。

图片来自网络

3.3.4 数据分布分析

数据分布分析指的是考察某个字段或某些字段的统计分布。包括频数、时间、空间三个方面。

频数统计。用概率论的语言讲叫累积分布函数CDF。比如在IJCAI2018阿里妈妈国际广告算法大赛中,我们就统计了不同点击次数下各有多少用户。基于类似的累积分布函数图我们就可以知道用户行为的分布情况,进而可以帮助我们充分理解数据。

时间维度上的统计分布。我们可以观察事件发生的趋势和周期性,这里会涉及不少时间序列的知识。比如下图所示的“每天的点击数趋势”,就是在时间维度上考察点击数的变化情况。

空间维度上的统计分布,我们可以寻找某个变量在地理位置上的相关关系。比如2020年以来我们十分熟悉的疫情地图,就是一种空间上的分布分析。

另外,以上三种分析常常结合分组or聚类方法,对细分的业务场景进行考察,为后面的数据建模做铺垫。

3.3.5 数据探索小结

对于数据探索,我总结了几个需要牢记在心的关键点,分别是:对比,分组,频数,抓大放小和可视化。

所谓对比,指的是在做数据探索时,考虑对比训练集不同样本之间的特征分布,还要考虑对比训练集和测试集中每一个特征的分布。

所谓分组,就是在做数据探索时,常常用到按类别标签、某个离散变量的不同取值groupby后的sum、unique。

所谓频数,就是要注意考察并自行计算某些变量的概率累积分布。诸如“事件发生次数”这样的的统计量需要自己计算;有时还要关注“同id下某个事件多次发生”的统计。

所谓抓大放小,就是对于那些特征重要性较高的变量,要做重点分析。因为这些变量对你模型预测能力的影响是较大的。

所谓可视化,就是建议大家在做数据探索的时候多画图(尤其是各种趋势图、分布图),图形给人的冲击力往往是要大于数字本身的。

3.4 特征工程

下面我们来讲特征工程。这也是做数据竞赛时最重要的一项内容。

首先说一下为什么要做特征工程。

在我们解决一个机器学习问题时,输入机器学习模型的数据必须是标准的向量形式。但当我们处理现实世界的数据时,数据并不会以格式规范的特征向量的形式呈现在我们面前。相反,呈现给我们的数据是数据库记录、时间序列、图像、音频、文字等形式,同时还存着在大量的噪声数据。所以我们需要一定的方法把非结构化的数据转化为结构化的数据。

结合维基百科,我给特征和特征工程做了如下定义:

特征:An variable useful for your modeling task,which describe/represent our data

特征工程:A process of using domain knowledge, techniques, experiences or even tricks to create features that make machine learning algorithms work well.

为了说明特征工程的重要性,这里聚一个小例子。下图中有一些蓝色的点和一些绿色的点,在直角坐标系下它们的分布如左图所示,肉眼看上去,它们显然是属于两个类别,但是如果你想用一个机器学习的线性分类器去做分类的话是很困难的。但是你把这些点转移到极坐标系下,它们就可以很容易用一个线性分类器做分类了。从这个地方我们就能看出数据的表示方式对机器学习模型的效果的影响还是很大的。

图片来自Yoshua Bengio《Deep Learning》

我希望大家记住一点,就是在解决一个机器学习问题时,最关键的就是去研究如何表示你的样本,而特征工程解决的就是representation的问题,Feature engineering is a representation problem。这里把传统的软件开发和机器学习项目做一个简单的比较:在编程开发项目中,很关键的地方在于如何优化你的代码;而在机器学习项目中,关注点变成了表示。也就是说,开发者通过添加和改善特征来调整模型。

所以,这也是我们圈内经常说的,“数据和特征决定了机器学习的上限,而模型和算法只能去逼近这个上限”。我希望大家应该牢牢地记住这句话。不管是做机器学习的比赛还是实际的项目,特征工程都是最最重要的一部分。这里引用了两句英文来进一步证明这个道理:

Coming up with features is difficult, time-consuming, requires expert knowledge. "Applied machine learning" is basically feature engineering. — 吴恩达Andrew Ng, Machine Learning and AI via Brain simulations “...some machine learning projects succeed and some fail. What makes thedifference? Easily the most important factor is the features used.” —《终极算法:机器学习和人工智能如何重塑世界》作者 Pedro Domingos

我将特征工程分为三个部分,分别是数据预处理、特征构造和特征选择。下面分别介绍这些内容。

3.4.1 数据预处理

首先来说一下为什么要做数据预处理。首先,考虑到海量原始数据中存在大量信息缺失、不一致、冗余值、异常值等,会影响我们模型的学习效果。另外,在用各种模型算法时也要牢记监督学习的假设,即正负样本要平衡且训练集和测试集样本是独立同分布的。第三,在模型训练时,数据规范化的操作可以让梯度下降算法收敛得更快,也就是更快地找到最优超参数。

传统意义上的数据预处理一般包括数据清洗、数据集成、数据重采样、数据变换(特征编码)和数据规范化(特征缩放),这一块的内容也是网络上流传最广、介绍最多的数据分析技巧,因此我不做具体的解释,仅仅把各自常用的处理技巧罗列一下。

数据清洗

  • 缺失值插补
    • 均值、中位数、众数插补
    • 固定值插补
    • 最近邻插补
  • 离群值
    • 直接删除
    • 替换法
  • 异常、冗余值
    • 直接删除
  • 小技巧:用训练集数据学习一个模型,然后用它预测训练集的标签,删除预测结果偏差较大的样本

数据集成

  • 多表数据整合
    • 一对一
    • 一对多
    • 多对一
    • 多对多

数据重采样

  • 滑窗法:
    • 对于时间序列数据,选取不同的时间窗间隔,可以得到多份训练数据集
    • 该方法可以增加训练样本,也方便做交叉验证实验
  • 非平衡重采样:调整正负样本量
    • 欠采样
    • 过采样
    • 组合采样

数据变换

  • 连续变量离散化(分箱)
    • 等频
    • 等宽
    • 聚类
  • 离散变量编码
    • One-hot Encoding
    • Label Encoding
  • 长尾分布
    • Ln、Log

数据规范化

  • Min-Max
  • Z-score
  • MaxAbs

网络上罗列的这些方法,如何更高效地使用,详见t.zsxq.com/IMfe2vB。

3.4.2 特征构造

在一个机器学习比赛中,很多的有效特征都不是直接给出的,需要自己去挖掘。不要以为实际中的训练数据都像UCI开源的数据集那样简单直接好用。

我把基于对原始数据的数据探索,不断构造新特征的过程定义为特征构造(Feature Construction)。在这个过程中,你需要深入了解场景知识,并做大量开脑洞的工作。但仅凭开脑洞和无脑地堆砌并不能真正解决问题,如果你想构造出具有可解释性且丰富的特征,需要一套思想方法。

在此我给出一种特征构造的思想方法,希望能给大家一定的启发。

3.4.2.1 思想方法

  1. 理解字段
  2. 抽取实体
  3. 分析实体关系
  4. 设计特征群
  5. 按特征群分别构造特征
  6. 考察特征群关系,进一步构造新特征

3.4.2.2 特征构造举例

t.zsxq.com/IMfe2vB

3.4.2.3 特征构造 注意事项

t.zsxq.com/IMfe2vB

3.4.3 特征选择

前面你构造了很多特征,但这些特征不一定都是有用的,需要用特征选择的办法把有用的特征选出来。Feature selection is a process that chooses an optimal subset of features。特征选择可以帮你筛选有效特征,消除冗余信息,提高训练效率,避免模型发生过拟合。

常用的特征选择方法如下图所示:

我一直觉得特征选择是那种烂大街的知识。可问题是,这些方法都要用吗?哪个好用?哪个效率最高?t.zsxq.com/IMfe2vB

3.4.4 特征工程总结

这样整个特征工程部分就讲完了。我最后想提醒大家,在数据科学竞赛中,特征工程是一个需要不断迭代测试的过程,也就是说,数据探索、数据预处理、特征工程要反复多次进行。所以,一定要把75%以上的时间放在特征工程的工作上。

3.5 模型选择

我知道每个机器学习小白在做比赛前都把周志华的西瓜书和李航的《统计机器学习》翻了一遍又一遍。那我想问大家一个问题:书上讲的算法模型,比如LR,GLM,SVM,KNN,NN,Tree,RF,Adaboost,在机器学习比赛中,到底用什么,哪个好用,哪个效率最高?

答:都不用!!!!!!!!

我想这个答案可能有点出乎大家的意料吧。毕竟大家学了大半学期的机器学习,都是在讲这些玩意儿的原理。你是不是忽然觉得有些迷茫了呢?自己学了大半学期的书本竟然像垃圾一样没用。

然后我想告诉大家,数据科学竞赛的模型大杀器是:基于决策树的集成学习模型,例如LightGBM、XGBoost、CatBoost等。

从好用程度上来看:LightGBM > XGBoost > CatBoost。你甚至可以只用LightGBM来学习你的训练数据。

下面我想解释两个问题:

一,为什么梯度提升树打数据挖掘竞赛优势明显?

看一个机器学习模型的开源工具好不好用,主要是看训练效率和学习能力的trade-off。像LightGBM这样的模型,训练速度快,效率高,还支持并行和GPU计算;同时能够处理大规模的数据,算法的学习能力更强,预测精确度高。

二、为什么深度学习模型打数据挖掘竞赛优势不大?

在此引用吴恩达老师在Coursera公开课中的一张图。

该图横轴表示的是训练数据的条数,纵轴显示的是多种模型的学习效果。从这个图可以看出,当你的数据规模比较小时,深度学习模型的效果甚至还不如普通的机器学习模型。所谓的数据规模比较小,我给一个判断标准:2000万训练样本。也就是说,没有两千万的训练样本,深度学习模型根本无法施展它的威力。所以在传统的机器学习比赛中,我们还是用lightGBM这种集成树,简单粗暴却又威力无穷。

3.6 模型优化

模型优化主要分为三块,在此以一个思维导图呈现:

3.6.1 评估方法

周志华老师的西瓜书中讨论了三种模型优化的方法,分别是留出法,自助法和交叉验证法。在我看来这也属于烂大街的知识。还是老问题,在打比赛时,我们应该如何使用这些方法,有哪些关键性的技巧?这里有几条经验跟大家分享。

K折交叉验证法

来点干货:

  1. 比赛中最常用的模型评估方法是留出法和K折交叉验证法。
  2. t.zsxq.com/IMfe2vB

3.6.2 性能度量

在比赛中常见的指标(性能度量)包括AUC、Logloss、K-S、F1、Kappa系数等,这些指标都是综合考量模型对正类和负类的预测能力,更具有说服力。

来点干货:

  1. 线下测试时,应多使用几种指标,单刷赛题给定的指标容易发生过拟合
  2. 如果几个指标同时上涨,则可以证明你的特征&模型取得了实质性的改进
  3. 针对赛题使用的性能度量指标,推导其数学原理,思考特殊的优化策略

3.6.3 参数调整

主要方法:

  • 网格搜索(Grid Search)
  • 贝叶斯优化(Bayesian Optimization)
  • 启发式算法(Heuristic Algorithms,如GA、模拟退火,PSO)

工具包:Hyperopt等

关于调参我实在不想讲太多东西,虽然网上这一块可能扯的很多。但一般扯的越多的东西,一般都是扯淡。事实上,用一用网格搜索就足够了。

来点干货:t.zsxq.com/IMfe2vB

3.7 模型融合

所谓的模型融合,主要是指对不同子模型的预测结果的融合。江湖上有人说,“Feature决定了模型效果的上限,而ensemble就是让你更接近这个上限”。

模型融合的方法网上有很多,在此我简单罗列一下。

方法:

  • 简单加权平均:0.5*result_1 0.5*result_2
  • Bagging:对训练集随机采样,训练不同的base model,然后投票;可以减少方差,提升模型的稳定性(随机森林就是这个原理)
  • Boosting:弱分类器提升为强分类器,并做模型的加权融合;可以减少学习误差,但容易过拟合
  • Blending:拆分训练集,使用不重叠或者部分重叠的数据训练不同的base model,然后分别预测test数据,并加权融合(这是个好办法)
  • Stacking:网上讲的很多,但极易造成过拟合,尤其是数据量小时过拟合严重,不建议使用

Stacking融合方法

其实网上的资料总会给你各种误导,所以我想直接讲干货,告诉你如何更高效地用这些方法。

t.zsxq.com/IMfe2vB

3.8 迭代策略

t.zsxq.com/IMfe2vB

每日结果提交记录表

3.9 其他

还有一些内容是我想强调的,这些东西依然是战略层面的。不得不说,它们对你很重要。

第一,做比赛的第一步是完成一个从0到1的原型设计。这是一种原型思维。也就是说,你要先做出一版能提交的结果,并提交成功。走完这一步,你才算刚刚上路。做任何事,完成从0到1的过程都是最重要的。

第二,一定保证自己的代码是正确的,所谓正确指的是,正确地表达了你的idea而不仅仅是没有语法逻辑bug。这一点也是小白常常犯的错误。

第三,写一个较为自动化的、高效率的代码框架。在数据预处理的部分,一定要少用暴力的for循环。一个入门级的baseline在这里:github.com/yzkang/My-Da,大家可以直接基于此代码做特征工程即可。

第四,关于时间和精力的分配。做比赛是一件很辛苦的事情,每天压力很大,常常昼夜颠倒,没日没夜地写代码。所以,一定要善于抓住主要矛盾。数据探索 特征工程的部分要分配75%的时间和精力。模型优化及调参占15%,模型融合占10%。另外,珍惜你的每一次提交机会。

第五,在闲暇时间,及时更新你的武器库,多阅读开源经验分享,多跟大佬们请教和学习。

四、总结

最后我想谈一谈自己这几年做比赛、做项目、做论文、做团队的一点收获,希望大家批评指正。

首先,我认为不管是在学校做事情还是在公司做事情,结果导向、以终为始是十分重要的思维方式。牢记邓公所讲的黑猫白猫论,通过不断地磨练让自己成为一只好猫。当然,这种思维方式可能不太适合体制内的工作人员。

其次,编程的目的不是秀自己的智商,而是盖一栋房子,解决一个问题,实现一个目标。所以不重复造轮子是很重要的,我一直坚持的一个观点是,能抄别人的代码坚决不自己写,不到万不得已坚决不自己写。我们的手机,每个零件都有专门的厂家进行加工,编程做比赛也是一个道理。如果华为不购买别人家的芯片,一百年也造不出一个手机。通过借鉴吸收别人的经验成果,安全避坑,高效率地完成自己的目标,才是快速创造价值的真谛。

第三,很多事情都是实践出真知。就拿编程来讲,你把编程语言的课本翻烂也学不会编程。机器学习的理论学的再好,你依然不会解决实际问题。很多工科性质的知识,你看过但没有用过,跟没看过一样。如果你是工科生,一定要注意多动手,多实践。

第四,有竞争的地方就有江湖。在江湖上混,打铁还需自身硬。希望你知道,优秀的人只会和优秀的人合作,想升级你做事的圈子,先把自己搞成相对优秀的人。世界上绝大多数的合作都是强强联合。

第五,靠天赋、努力还是运气?我认为做比赛最需要的是强烈的兴趣和自我驱动力,和智商的高低其实没有太大关系。一个比赛,你想做到Top50,我猜用这份资料讲述的经验应该足够了。你想做到Top10,需要坚持不懈的努力。你想做到Top5,多多少少还是需要一点运气的,毕竟在一个比赛的最后几天,提交机会相对越来越少,怎么把握这些提交机会,还是需要你与生俱来的判断力。

最后,送给大家一句话吧:胜利后的复盘可能非常精彩,但实现的过程则枯燥而艰难。

祝大家都能在数据科学竞赛中取得好成绩!

附:我的竞赛成绩总结

部分未完成竞赛

0 人点赞