博客
关于我
Kaggle 首战拿银总结 | 入门指导 (长文、干货)
阅读量:316 次
发布时间:2019-03-03

本文共 2790 字,大约阅读时间需要 9 分钟。

初识Kaggle

从接触机器学习初期,便常常听到关于Kaggle的名字。起初,我对它的理解还比较浅显,只知道是一个数据比赛平台,有很多公开的数据集。比如大二寒假时做的一个用word2vec进行情感分析的Tutorial级比赛,这个项目让我对Kaggle有了初步的接触。

后来重新接触Kaggle时,我才发现它的真正价值不仅仅是提供数据集,更是一个高质量的比赛平台。每场比赛下都有丰富的社区讨论,包括比赛中的分享、答疑,以及比赛后的Top Solution分享。对于想要实战经验的学习者而言,参加Kaggle比赛无疑是一个非常高回报的选择。

尽管我还是学生,对Kaggle比赛对求职工作是否有实际影响还不太确定,但单从Kaggle被Google收购这一点来看,它在行业内的影响力已经逐渐增强。

比赛组织

一场Kaggle比赛通常持续2到3个月。比赛简介中会有规则、评价指标(例如这场比赛的评价指标为mlogloss),时间轴等信息。另外,比赛区分为数据区、Kernel区(Kagglers成功运行的ipython notebook或代码)、讨论区、LeaderBoard(LB,分为公开的用户提交可以显示结果的榜单,以及比赛结束后确定最终排名的榜单),以及提交区(通常为特定格式的csv文件提交)。

奖项设置方面,一般来说,前1000名的选手会获得奖牌,具体奖牌发放方式因比赛而异。例如,前0.2%为金牌,5%为银牌,10%为铜牌。

讨论区的重要性

如果想在入门阶段就获得不错的成绩,关注讨论区非常重要。在讨论区中会有很多人分享自己的思路、困惑甚至代码和结果。有时候,关键的特征可能就来自于讨论区。例如,在这场比赛的最后几天,我以为自己的特征提取已经差不多了,已经没有任何新思路了。然而,一个来自讨论区的magic feature突然出现,导致我的排名从70多掉到了120多。

数据探索和可视化(EDA)

拿到一个比赛题目后,首先需要对数据进行初步的探索。这场比赛的数据集包含了80GB的图片数据和几份json文件。下载下来,使用python pandas对train.csv进行分析。通过取样观测,可以快速了解数据的分布情况。

从数据中可以看出,包含了多种类型的特征:数值型特征、类别型特征、高势集类别特征、时间型特征、地理位置型特征、文本特征、稀疏特征集特征和ID型特征。每一种特征都有其独特的价值,尤其是那些经过深度挖掘的特征。

此外,还需要明确比赛的类型。通过观察目标变量interest_level的分布,可以确定这是一场分类问题。目标是预测用户的兴趣水平,分为low、medium和high三个级别。

在数据探索阶段,我还做了一份可视化方案,从中发现了数据的分布、outlier等有趣的特征。在比赛中分享了几份EDA,效果不错。

特征工程(FE)

在有了基础特征后,接下来需要进行特征工程。这个阶段大约花了我两个多月的时间。在这个过程中,我不断测试新的特征,方法是新增加一个或几个特征,如果cv分数上去了,就保留下来;如果没有上去,就舍弃。这种贪心验证的方式虽然简单,但弊端在于可能错过一些重要的联合特征。

在比赛最后阶段,我发现特征工程的重要性所在。有时候,一个看似无用的特征,经过处理后就能带来意想不到的效果。例如,将类别型特征通过经验贝叶斯方法转换为数值特征,效果尤为明显。时间特征也可以通过构造新的时间相关特征来提升模型性能。

对于文本特征,我尝试了关键词提取、情感分析等方法,但效果并不理想。相比之下,简单地提取高频词汇可能会更有帮助。对于图片特征,我只用了简单的特征提取,效果也并不理想。

模型训练

有了基础的特征后,接下来就是模型训练了。在这场比赛中,我选择了xgboost作为主要的分类器。通过对训练集和验证集的交叉验证(cv),评估模型的性能。常见的分类器有Logistic Classifier、SVM、NN softmax、Random Forest等。在Kaggle上,xgboost、lightgbm等封装好的分类器使用较为广泛。

在模型训练过程中,我还尝试了Stacking模型融合的方法。通过对训练集的交叉预测结果作为特征,再对测试集进行预测,最后使用随机森林作为最终的分类器。这种方法使得模型的多样性得到了提升,成绩也有所提升。

提交结果

训练了一个比较好的模型后,接下来就是对测试集进行预测了。将训练集重新训练模型,然后对测试集进行特征处理,生成结果文件提交。第一次提交意味着正式进入比赛,结果会出现在LeaderBoard上,但这些结果在比赛开始时并没有实际意义。

特征工程的深入

在特征工程的过程中,我发现了许多有价值的特征。例如,通过对数值型特征进行简单的加减乘除,可以发现特征之间的内在联系。对于类别型特征,经验贝叶斯方法将其转换为数值特征后,效果显著提升。

在时间特征方面,除了提取年、月、日等,还可以构造如latest和passed这样的特征。latest表示从有数据开始到该房创建为止一共过去了多少时间,passed表示从该房创建到最后有记录的时间。通过对这些时间特征与其他特征进行可视化分析,可以发现一些有趣的联系。

在文本特征方面,我尝试了关键词提取、情感分析等方法,但效果并不理想。相比之下,简单地提取高频词汇可能会更有帮助。

模型调参

模型调参是FE完之后提升成绩的重要环节。对于xgboost等分类器,通过Grid Search来寻找最佳参数组合是常用的方法。通常会设定一个学习率范围,尝试不同的参数组合,取cv成绩最优的组合。

模型融合

如果没有新的idea了,可以考虑模型融合。这种方法能够快速提升成绩。在这场比赛中,我使用了Averaging和Stacking两种融合方法。Stacking方法通过对训练集的交叉预测结果作为特征,再对测试集进行预测,最后使用随机森林作为最终分类器。这种方法使得模型的多样性得到了提升,成绩也有所提升。

Kaggle中的技巧

在这场比赛中,有一名选手在比赛初期就一直遥遥领先,最终爆出一个magic feature,导致其他选手陷入疯狂寻找的过程中。这场比赛让我深刻体会到一个信息量巨大的特征,如果被发现,对比赛成绩会带来多么大的影响。

总结

这篇博文讲述了我第一次参加Kaggle比赛的心历路程,总结了遇到的问题和解决思路,为以后的比赛做了一定的准备。通过这次比赛,我不仅学到了许多关于特征工程、模型训练和模型融合的技巧,还体会到了Kaggle社区的力量。

比赛结束后,我还计划整理一些top solution的代码和idea,为以后参赛提供参考。Kaggle不仅是一个比赛平台,更是一个学习和分享的社区。希望未来能有更多机会在这里学习和成长。Kaggle,真的是很有趣!

转载地址:http://njgm.baihongyu.com/

你可能感兴趣的文章
Net与Flex入门
查看>>
net包之IPConn
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
查看>>
New Relic——手机应用app开发达人的福利立即就到啦!
查看>>
NFinal学习笔记 02—NFinalBuild
查看>>
NFS
查看>>
NFS Server及Client配置与挂载详解
查看>>
NFS共享文件系统搭建
查看>>
nfs复习
查看>>
NFS安装配置
查看>>
NFS的安装以及windows/linux挂载linux网络文件系统NFS
查看>>
NFS的常用挂载参数
查看>>
NFS网络文件系统
查看>>
nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
查看>>
NFV商用可行新华三vBRAS方案实践验证
查看>>
ng build --aot --prod生成文件报错
查看>>
ng 指令的自定义、使用
查看>>
nghttp3使用指南
查看>>
Nginx
查看>>