查看原文
其他

分享一波关于做 Kaggle 比赛,Jdata,天池的经验,看完我这篇就够了。

2017-12-17 Jasperyang AI研习社

本文作者Jasperyang,毕业于BUPT。本文原载于知乎专栏,AI 研习社授权转载。

Kaggle 的数据挖掘比赛近年来很火,以至于中国兴起了很多很多类似的比赛,做了两个这种类型的比赛了,Jdata 用户商品购买预测和用户位置精准预测,积累了相当多的比赛经验了,虽然两次成绩都不是特别好,59/4590和 179/2844。

这些比赛的套路从根本上都是一毛一样的,我下面可以和大家探讨一个大致的做题套路以及怎么往高分走的方向,但是总结来说这就是个拼体力的任务,和智力无关。(虽然锻炼了动手能力,极大强化了我在 sklearn 和 pandas 上的技能熟练度...)


  PART 1 : 怎么开始

首先是看题目,是个什么样类型的预测?回归?二分类?多分类?

每种类型的预测会有一点点不同,个人觉得西瓜书还是需要快速看一遍的,不一定说每个公式都要仔仔细细去推导(推导公式对你做比赛基本没有什么帮助),你要知道什么是监督,半监督,非监督等等。

关于多分类我有个入门 blog,可以快速浏览一遍

  • 关于比较简单的多分类思想的整理,没有实质性的帮助,莽看( http://t.cn/RTpMKcG )

然后就是繁复的特征工程了

一般这种比赛都有个这么样的流程:

最重要的是在特征工程上,基本你会花上 60% 的时间在这里,因为在这里你需要做的是数据清洗,异常处理,变换,构造新特征等等,这一套有很详细的教程,给大家贴两个传送门(先别急着看)

  • 用 sklearn 优雅地做特征工程( http://t.cn/RTpMRTt )

  • (和上面的一篇同一个作者,我觉得很不错)sklearn 做单机特征工程( http://t.cn/RTpMRTt )

看完这两篇后, 基本你就能做到得心应手地处理数据。

但是,其实在做特征工程之前,你应该先去了解数据,怎么去了解数据呢?这就需要你熟练掌握 pandas 这个工具了,提到怎么熟悉这个工具,我想 offer 你下面这个学习流程。

  • 安装 anaconda,这个很简单,网上一搜就有(这个科学研究工具包含了基本所有你需要的,jupyter,pandas,numpy 等等)当然你要做深度学习就需要 tensorflow,pytorch 之类的还得另外装。

  • 由于后面我们需要用到 xgboost 这款神器当模型,所以最好你的系统是 ubuntu,因为在 ubuntu 中安装 xgboost 只需要 pip install 就行,在别的系统装起来可能你会想打人。

  • ok,有了环境,就用 anaconda/bin/jupyter 来运行一个 jupyter 工作环境吧,在这个环境里你可以随心所欲为所欲为所欲为...(主要就是因为 jupyter 可以保存你之前执行的结果,很方便做实验,详细的你可以 google)

  • 学习 pandas 很简单,因为它就是像数据库对表操作一样。初学直接就看看官网的教程:10 min to learn( http://t.cn/RTpxhAU ),之后你要 merge,concat,join 等等复杂的操作再去一点点查,一点点啃。慢慢熟练了你就能对你的数据做任何你想要的变换,比如找出某些年份的大于某些数值的数据。

  • 为什么需要去了解数据呢?因为数据有分布,有不同的业务意义,你通过整理做图可以更加深入理解某些属性的意义,然后构造或是提取出有用的特征。

构造特征

在我看来,这算是特征工程的一部分,也是最最重要的一部分,你将会在这里花大量的时间!!(所谓特征就是 feature,也就是你的训练数据集中除去 label 以外的所有列)
打个比方,比如一个商品预测的比赛,你可以将特征分成三类,从三种角度去整理分析。(感谢阿里移动推荐算法大赛总结( http://t.cn/RTpxWcP )的图片数据)

这种特征构造提取的过程对于每一种比赛都不一样,我这里就不详细讲了,如果你需要更多的启发的思维,建议你去搜索大量别人怎么从各种角度思考的资料。

在这里提及一句,一般来讲,涉及时间的都会需要设计时间窗口这么一个东西,这个东西说复杂不复杂,但是实践起来很费精力。简单来讲就是你需要对你的数据按照一定的时间划分。比如我之前的比赛用前五天的数据预测后一天的,但是总的数据集是两个月的,这时候你需要划分你的数据集分好训练集和验证集。

上面的 1,2,3 是三个训练集,后面带的小框是验证集,等于你需要训练好几个模型。

同时你可以想啊,更早之前的数据肯定对现在的预测影响会更小,所以会有个权重的问题,也就是你得到了十个模型,最接近预测日的算 model_0,最远的算 model_9,那么给 model_0 权重 0.7,给 model_9 的权重 0.05。

你需要知道什么是训练集,验证集,测试集!!

有时候训练集的类别很不均衡
这个时候需要欠采样或是过采样。

  • 欠采样 某个数据比较多的类别随机减少掉一些训练数据

  • 过采样 找那些数据少的类别使用 smote 方法插值添加数据 smote 算法( http://t.cn/RGWdmlq )

其实数据不平衡的处理也是特征工程的一部分,我这里只是提出来强调了一下,类别不平衡的处理其实还有很多,但是都不常用,大家可以去大概了解了解。

每个特征你都应该取好名字,以防乱了。

另外,由于做模型融合时需要有特征多样性这么一说,所以也许你需要不同的特征簇输入到不同的模型中,所以做好你的文件管理十分重要!!!

我建议你的比赛工程文件如下。

result 里面你需也要分好文件夹放不同的结果,这样方便后面模型融合时我们用投票器的方式。

experiment 里面是你的 jupyter 实验文件,因为这类文件你会创建很多,所以最好有一个专门的文件夹来管理。

是不是很简单并且清晰明了,当你学会了 sklearn 中的 pipeline 之后,你就可以搭建一个可以轻易修改并给别人看讨论思考过程的工程代码。但是不能完成的是做成一个可以轻易复用到各种比赛的框架。因为每个比赛的数据大不相同。不再多言。

OK!! 走过上面的流程,我们现在进入到 part 2 的训练阶段吧,这个阶段是最激动人心的,因为你将在这里遇见你特征工程以及模型的不足,然后调优,看着成绩慢慢提高~!

  PART 2

模型阶段,在这里,你需要对各种模型都有很清晰的了解,最好是你能够推导公式,不能也算了。

  • Logistic Regression

  • SVM

  • GDBT

  • Naive Bayes

  • Xgboost (这个可以说是最有用的)

  • Adaboost 等等

熟读西瓜书吧,里面从基础开始会让你懂很多,最好是李航的统计学习方法看一遍,这本书比较薄,涵盖的内容却很全,推导也好理解。

然后这些模型很高兴的是,一个都不用你去写~都有现成的库,而且基本集中在 sklearn 中。除了 lightGBM。

先看一下这篇简单调用: python sklearn 常用分类算法模型的调用,你会发现模型用起来好容易好方便~是的,但是这只是开始,别忘记要保存模型哦,另外保存结果也要严格按照规定的文件路径,不然后面你就乱了。

sklearn 的编程方式博大精深,但是 api 使用还是很简单,你只需要花点时间好好学学,就能很熟练了,推荐 python 之 sklearn 学习笔记( http://t.cn/RTpJaLS ),这个比官网的教程( http://t.cn/SMzAoZ )好看懂,毕竟是中文的嘛... 流汗~

再来你还需要去对这些算法调参,这些我就不再谈了,我想着重提一下 xgboost,这是一个可以并行运算的回归树,在现在的比赛中用的十分频繁而且有效。

  • XGBoost 原理解析,还不错的 blog,我之前也翻译过官方的但是那个太偏理论,这个还有点工程上的见解,还不错( http://t.cn/RTpJQSx )

  • 我翻译的官网的原理解释 : (XGBoost)提升树入门介绍(Inrtoduction to Boosted Trees)( http://t.cn/RTpJuCT )

看懂了后你就会知道为什么这个东西这么牛逼了,当然前提是你需要知道决策树,随机森林的原理。

再说一句,安装 xgboost 在 ubuntu 系统上很方便,但别的系统真的很难受,自己体会吧,不想浪费时间最好都弄成 ubuntu

xgboost 运行后的效果一般就很好了,但是这不是最终的,因为 xgboost 有很多的参数,怎么去调参使得结果更优很重要。

  • XGBoost 调参经验(这篇是很好很详细的)( http://t.cn/RXW1EkL )

  • 余音的 xgboost 调参经验( http://t.cn/RTpizw0 )

调参也是个体力活,望各位保重身体!~

好了,part 2 也就讲到这里了,其实把这前两个部分好好做,就能取得好的成绩了,第三个部分是后期往上窜一窜的手段,当然不可不用。

  PART 3

模型融合

模型融合得看你是做什么样的预测,不同的预测结果有不同的融合方式。
bagging,voting,stacking 都是 ensembling 的一种。

  • Kaggle 机器学习之模型融合(stacking)心得( http://t.cn/R0nClu2 )

  • 【机器学习】模型融合方法概述( http://t.cn/R62UGLF )

一般都是讲回归的,voting 具体的方法没有讲,我这里有一段代码,你看看就懂怎么做 voting。

# 投票器 def file_name(file_dir):    filename = []    for root, dirs, files in os.walk(file_dir):        filename.append(files)    return filename\n", filename = file_name('./result/all_result/')[0] ''' * 文件名 * 票数 ['result_0.002_no_0.03_8steps_0.8964.csv', 9 'result_TL_ten_0.002_no_0.03_0.9062.csv', 10 'result_0.001_0.8917 .csv', 9 'result_LT_ten__0.001_no_0.03_0.9092.csv', 10 'result_LT_ten_0.0015_no_0.03_0.9051.csv', 10 'result_0.0015_0.9061.csv', 10 'result_AdaB_0.31.csv', 3 'result_feature_delexcep_0.002_tree.csv', 9 'result_rf_0.001_0.03_0.86.csv', 8 'result_lr_0.60.csv', 4 'result_rf_0.87.csv', 8 'result_0.002_no_0.03_6steps_0.8951.csv', 9 'result_0.002_no_0.03_0.9058.csv', 10 'result_gdbt_0.79.csv', 6 'result_xgb_91.csv', 11 'result_0.002__0.9046.csv', 10 ] ''' dic = {} index = list(re.iloc[:,0]) result = [] voting = [9,10,9,10,10,10,3,9,8,4,8,9,10,6,11,10,9] for t in list(re.iloc[:,0]):    dic[t] = {}    for i,shop in enumerate(list(re[re.row_id == t].iloc[0,1:])):        # 建立字典        if shop not in dic[t].keys():            dic[t] = {re[re.row_id == t].iloc[0,1] : voting[i]}        else:            dic[t][shop] += voting[i]    # 选出最高票者 , 得票相同的选后者    top = 0    score = 0    for x,y in dic[t].items():        if y > score:            top = x            score = y    result.append(x) re = pd.DataFrame({'row_id':index,'shop_id':result})"

关于模型融合这一块就看你想怎么弄了,多标签分类这种比较局限,就是投票器,回归的话花样就多了,还能分层搞,所以不怕你想不到,就怕你不尝试。

为了加深你对模型融合的理解和使用,另外推荐三篇:

  • 关于 bagging 和 random forest,GDBT 以及属性扰动 (属性扰动我在西瓜书里看到的,但是实际中我觉得还是不敢用)( http://t.cn/RTp6xLp )

  • Bagging 与随机森林(这个算是多种方法的一个小总结吧)( http://t.cn/RTp6SuL )

  • 讲 sklearn 中的投票器实现,很好, 这篇偏讲理论,讲的很不错,可以学到一些东西( http://t.cn/RTp6pkM )

  PART 4

最后我讲两个 trick 吧。(没什么道理性的,有时候行,有时不行)

  1. 找比赛 leak,这个就是钻空子吧。通过分析测试集的一些特性找出 golden feature(就是一下子能把成绩提高老多的 feature)我听大牛的分享里有讲到但是我做比赛时没有想到,很惭愧。

  2. 利用 GDBT 或是 XGBoost 的叶子节点的信息创建出新的特征,一般来讲能提高成绩,但是训练起来贼慢,像我借了好几台电脑,把训练集分散到不同电脑上跑。累死了...

  • 利用 GDBT 的叶子节点信息构造新的特征(原理不是很清楚,Facebook 发表的,这篇最后面有些链接可以点进去看,会更明白点)( http://t.cn/RTp6rbp )

  总结

有人说跟一遍 kaggle 上的 kernel 一套就都会了,我觉得挺好的,但是看了我的这篇呕心沥血的文章后,我想你的知识才是系统的!~

好了,终于到收官了,说实在的,这类型的比赛我暂时是不想参加了,我们学校的大牛硬是打了 10 场,然后拿了两次冠军,我这参加了两次,成绩不好,但是已经身心俱疲了,没信心拿到奖了。况且,我认为深度学习才是现在的王道,我已经在图像识别和 image
caption 中遨游了好些日子。有意思多了。

到此,祝大家好运。




新人福利





关注 AI 研习社(okweiwu),回复  1  领取

【超过 1000G 神经网络 / AI / 大数据,教程,论文】



如何在 Kaggle 首战中进入前 10%

▼▼▼  

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存