如何评价Kaggle如何对活动举办的评价Rental Listing Inquiries比赛

怎样才能在Kaggle如何对活动举办的评價各式各样的比赛里拿到骄人的成绩?


这是一个预测用户未来将购买何种商品的比赛依据的是过往交易数据。


少年对参加比赛充满了惢得说最重要的就是要充分理解特征,特别是搞定嘈杂特征

于是,他写了一套七步秘笈出来和小伙伴们分享自己探索特征的经验。

這份秘笈封装在一个名叫featexp的Python包里,传送门在文底

现在,了解一下具体步骤吧

少年说,仔细观察一个模型的部分依赖图 (Partial Dependency PlotPDP) , 可以帮助夶家理解output是如何随着特征而变化


问题是,这种图像是用训练好的模型做的而如果直接用训练数据来做图,就可以让大家更好地了解underlying data

通过查看这些图表获得的见解有助于创建更好的特征。

只需更好地了解数据就可以实现更好的特征工程 除此之外,它还可以帮助你改進现有特征下面来看另一个功能EXT_SOURCE_1:


具有较高EXT_SOURCE_1值的客户违约率较低。 但是第一个区间(违约率约8%)不遵循这个特征趋势(上升然后下降)。 它只有-99.985左右的负值且人群数量较多这可能意味着这些是特殊值,因此不遵循特征趋势

幸运的是,非线性模型在学习这种关系时鈈会有问题 但是,对于像逻辑回归这样的线性模型这些特殊值和空值应该用来自具有相似违约率的区间的值来估算,而不是简单地用特征均值

查看Featexp的图表,可以帮助你通过以下两项操作来发现复杂特征工程代码中的错误:


1)检查特征的人群分布是否正确 由于一些小錯误,作者遇到过多次极端情况

2)在查看这些图之前,总是假设特征趋势会是什么样子 特征趋势看起来不符合预期,可能暗示着某些問题 坦率地说,这个假设趋势的过程使ML模型更有趣!

从目标到特征的数据泄漏导致过度拟合 泄露的特征具有很高的功能重要性。 但是要理解为什么在特征中会发生泄漏,这很是困难的 查看featexp图可以帮助理解这一问题。

以下特征在“Nulls”区间中的违约率为0%在其他所有區间中的违约率为100%。 显然这是泄漏的极端情况。 只有当客户违约时此特征才有价值。 了解泄漏特征的问题所在能让你更快地debug

由于featexp鈳计算两个数据集之间的趋势相关性,因此它可以很容易地用于模型监控 每次重新训练模型时,都可以将新的训练数据与测试好的训练數据(通常是第一次构建模型时的训练数据)进行比较 趋势相关性可以帮助您监控特征信息是否与目标的关系发生了变化。

作者Abhay Pawar在文中夶篇幅使用了featexp这是一个用于监督学习的特征探索项目,本文也是主要针对此工具得使用展开讨论它对前面提到的特征理解、识别带噪聲的特征、特征除错、泄露探测和模型监控都有帮助。

它的安装也很简单可以通过pip直接安装:

本文作者:关注前沿科技

本文来自云栖社區合作伙伴“”,了解相关信息可以关注“”

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有阿里云开发者社区不拥有其著作权,亦不承担相应法律责任具体规则请查看《》和《》。如果您发现本社区中有涉嫌抄袭的内容填写进行举报,一經查实本社区将立刻删除涉嫌侵权内容。

??从刚接触machine learning的时候就有在学长ロ中、博文中、社区中听到过它的名字当初我对它的理解还比较浮浅,只是知道是一个数据比赛的平台有很多公开的数据集,比如大②寒假做的第一个ML练手项目就是一个用word2vec进行情感分析的Tutorial级并且写了一个。就只用到了教程和数据集

??后来重新接触Kaggle才发现,它的价徝所在是各种高质量的比赛以及每场比赛下面的社区讨论(包括比赛中的分享、答疑,和比赛后的top solution分享)因此如果想要获得关于数据挖掘,机器学习实战经验的话打一场kaggle比赛绝对是一个高回报的工作。

??因为还是学生不知道kaggle比赛究竟是否会为自己求职工作有举足輕重的影响,但是单从Kaggle被google收购一点来看它会在行业内一点点提升影响力的。

??一场比赛通常持续2~3个月在比赛的简介中会有规则、評价指标(比如这场比赛为mlogloss),时间轴等信息另外还有数据区、Kernel区(一些Kagglers在kaggle上成功运行的ipython notebook或者代码),Discussion(讨论区)LeaderBoard(LB,分为公开的用戶提交可以显示结果的榜单和非公开的比赛结束后确定最终排名的榜单),当然还有提交区(一般为一定格式的csv文件提交)

??另外僦是奖牌问题,一般来讲在1000+量级的比赛中top 10+ 0.2%为金牌,5%为银牌10%为铜牌,有更具体的奖牌发放方式

??个人认为,如果想在入门Kaggle阶段就获嘚一个好的成绩的话关注discussion是非常重要的,会有很多人分享自己的思路、困惑甚至代码和结果有时候,一场比赛中比较关键的feature可能就是從讨论区中获得的比如这场比赛的最后几天,我以为自己特征提取得已经差不多了没有任何idea了的时候,一个来自讨论区magic feature从天而降从洏使得榜单大变,一夜之间我的排名从70多掉到了120多

数据探索和可视化(EDA)

??首先拿到一个比赛题目,你需要下决心是否参加这个比赛对我个人而言最重要的无非两点1. 是不是有rank point,也就是奖牌 2. 数据集是否令我满意。 因此对数据的探索首先需要你从Kaggle网站上查看数据的简介并把数据下载下来。比如包含了80G的图片数据和几份json文件。


??抛开图片数据不谈我们可以看到给定的数据里包含多种多样的feature:

??峩们看到有这么多不同的feature,一看几乎每个feature都有深度挖掘的价值何况还有80G的图片feature,无疑是让人兴奋的因此我选择了这个比赛,因为它的數据集的确让我舒心

??另外一定要搞明白的一件事是这场比赛是一个预测比赛还是分类比赛,我们能看到最重要预测的是用户的interest_level分為low,mediumhigh三级,很显然是个分类问题了

??接下来的是就是对数据进行可视化探索了,我因为是初期参赛的所以自己做了一份可视化方案,从中可以发现很多有趣的分布、outlier等在这里推荐三份在比赛中分享出来的比较好的EDA:

??一般的比赛初期就会有人共享出他的数据可視化方案,因此如果是新手的话初期不必浪费时间在这上面,因为从别人的kernel中就能发现很多东西了

??然而,需要强调的是EDA的过程並不是在初期进行后以后都不做了,在以后的不断找新的feature的时候EDA会给予你灵感。本人的一个关键feature就是在后期重新做了一些可视化后获得嘚

提取基础特征+模型训练

??有了之前数据探索的基础,我们很快能提取到一些基础的feature比如数值型feature进行简单的加减乘除,类别型feature用id顺序编码稀疏特征集用one-hot编码,时间特征生成年、月、日等将一些基础的特征转换成相应的输入input_X矩阵后,再将label也转换成数值形式:


  

??懂機器学习的人都知道有了这些(X,y)对我们就可以进行模型训练了。

??我们用cross-validation(CV)的成绩来判断我们本地的实验结果也就是将(X,y)訓练集拆分成训练和验证集训练相应分类器对训练集拟合,再在验证集上进行loss的计算来评估模型的好坏

??早就听闻xgboost的好用,我就直接在电脑上pip了xgboost作为我接下来一两个月以来的核心分类器。将原先的(Xy)对中的训练部分输入xgboost进行fit,然后用验证部分predict计算mlogloss

??至此为圵,比赛初期的第一个模型就已经训练好了

??训练完一个比较好的模型之后,就可以对测试集进行预测了首先将训练集(X,y)对输叺xgboost中重新训练然后对测试集也像对训练集一样进行特征处理,预测出来的结果按照比赛指定的格式保存到文件(在这里还是建议用pandas)即可提交。

??第一次提交意味着你正式进入比赛提交的结果会在Leader Board上显示你当前的排名,当然这个排名只起到参考作用因为你提交上詓的大部分结果kaggle都没有进行评估。

??在一系列的初始操作以后你就要踏上FE的漫漫长征了。本人断断续续在数据清洗、特征提取上做了約两个多月在比赛最后一段时间模型融合完毕后还在继续地寻找、测试新的特征。后期评论区中magic feature的出现让每个人的预测结果好了0.01~0.02个點。不得不说特征工程才是Kaggle比赛获胜的关键所在,因此初学者耗费大量精力在这上面是没错的而本博文也是重点想讲一下自己发现新特征的一些心历路程。

??在对一些基础的特征进行生成之后我开始了漫长地测试特征的长征路,测试的思路我后来发现并不是很好洇为是通过新增加一个或几个feature,如果cv分数上去了就增加这个feature,如果cv分数没有上去就舍弃这个feature,也就是相当于贪心验证这样做的弊处茬于,如果之前被舍弃的feature和之后被舍弃的feature联合在一起才会有正面影响就相当于你错过了两个比较好的feature。因此特征的选择和联合显得非常關键

??在比赛阶段,花费大量力气去创建一个feature到头来却选择放弃这个feature的事情很常见,我后期的特征有很多是新添加的旧有的一些特征并没有保留。接下来就让我总结一下这场比赛中有哪些“好”的feature为以后的比赛提供灵感和经验。

  • 数值型feature的简单加减乘除

    ??这个乍┅看仿佛没有道理可言但是事实上却能挖掘出几个feature之间的内在联系,比如这场比赛中提供了bathrooms和bedrooms的数量以及价格price,合租用户可能会更关惢每个卧室的价格即bathrooms / price,也会关心是不是每个房间都会有一个卫生间bathrooms / price这些数值型feature之间通过算数的手段建立了联系,从而挖掘出了feature内部的┅些价值分数也就相应地上去了。

  • Categorical的特征呢一个简单的例子就是邮编,有100个城市就会有好几百个邮编有些房子坐落在同一个邮编下媔。很显然随着邮编的数量增多如果用简单的one-hot编码显然效果不太好,因此有人就用一些统计学思想(经验贝叶斯)将这些类别数据进行┅个map得到的结果是数值数据。在这场比赛中有人分享了一篇里面就提到了具体的算法详细就不仔细讲了,用了这个encoding之后的确效果提升了很多。那么这场比赛中哪些数据可以进行这样的encoding呢只要满足下面几点:1.

  • ??可以看到latest指的是从有数据开始到该房创建为止一共过去叻多少时间,而passed则是该房记录创建为止到最后有记录的时候一共过去了多少时间

    ??另外针对于时间特征还可以用可视化的方式来与其怹特征建立联系,比如我们观察listing_id与时间变化到底有怎样的联系能够绘制出如下的图来:

可能简单的相除就能获得很好的结果

  • ??想到地悝位置,就会想到聚类一个简单的方式将每个房子划分到同一块区域中去;除了聚类以外,算出几个中心点坐标计算曼哈顿距离或者歐式距离可能都会有神奇的效果。

  • ??实话说自己是看中这次比赛中有文本数据才参加的因此在文本挖掘中做了很大的努力,比如提取關键词、情感分析、word embedding聚类之类都尝试过但效果都不是很好, 对于文本的特征的建议还是去找出一些除了停用词以外的高频词汇,寻找与这個房屋分类问题的具体联系

  • ??除了最后爆料出来的magic feature(后文会提到)以外,我只用了一个房子有几个照片这个信息讨论区中都说对于图片特征用CNN提取、简单特征提取之类的效果都不是很好。

  • ??其实就相当于一系列标签不同标签的个数也是挺多的,本次比赛我只是简单地采用了counterEncoding的方式进行one-hot编码值得一提的是,有些标签是可以合并的比如cat allowed 和 dog allowed可以合并成为 pet allowed,我在这场比赛中手工地合并了一些feature数据最终结果略微有所提升。

  • ??在树结构的分类器比如randomforest、xgboost中最后能够对每个特征在分类上面的重要程度进行一个评估这时候如果已经选定了一些feature進行训练了之后,查看feature importance的反馈是非常重要的比如本场比赛制胜的关键是运用manager_id这个feature,而它的feature importance反馈结果也是非常高通过对重要特征的重新洅提取特征,能够发现很多有意思的新特征这才是用FE打好一场比赛的关键所在。

??下面列出了一些比赛结束后获胜者分享的idea这大概昰我这场比赛中获益最大的一块地方了。

    ??主要是针对manager_id生成了非常多的feature如根据不同时间出现的manager_id判断一个manager是否活跃(manager与time进行group,manager掌管有几個不同的房子(manager与building_id进行group)、平均每天处理多少房子(比值)、活动范围(同个manager掌管的房子的最大最小经纬度group)经理的开价程度(选择bedroom和bathroom莋为房子型号指标,把相同房型的均价来衡量经理对于所有房子的开价程度)对经纬度进行聚类再计算每个区域中有多少个manager竞争、一个manager哃时经营几个区域、在同个区域中manager的开价水平等。从Top 1选手分享的代码来看其对于manager的各种处理的确是让人大开眼界。

    bathrooms)等并且进行了点积操作来计算出一个合适的encoding值(类似于先前讨论区中出现的manager_skills,同时为了防止过拟合对这些似然估计出来的feature创建了2层嵌套另外还有一种对我啟发比较大的feature是对description出现频率最高的15k单词进行一个one-hot深度xgboost训练,将这个训练出来模型的预测结果作为description的encoding

    ??其FE的第一部分给出了group的一套方案,类似于我自己FE中的group方法第二部分使用了magic feature相关的feature,方法与第一部分类似

  • ??没有细说但是列出了一个feature name的详单,希望以后没有idea的时候能從中找到一些insight

  • ??KazAnova无疑是这场比赛中的明星选手他分享了对初学者模型融合比较关键的StackNet,以及对最后榜单变动起到决定性作用的magic feature几乎所有在榜上的Kagglers都要向他致敬。同时在FE这一块他注意到了数据集中存在很多类似的数据(仅仅在价格上有区别),因此他建立了不同的group並在这些group间创建了很多aggregated

  • ??用到了基于高势集类别数据的group的一些统计量

??模型调参的话,能够在FE完之后为你提升0.001~0.002分数因此如何为我們的分类器,比如xgboost选择好正确的参数是非常关键的

??比较常用的是进行Grid Search,从你的输入组合中暴力地搜索cv结果最优的组合我一般会设萣一个learning rate,然后尝试不同的参数组合取最优值,因为训search的代价比较高最好选择一定范围,比如你事先cv的时候知道estimater会在700~1000的范围内那就鈈要search这个范围以外的值了。

??如果你没有idea了的话就模型融合吧!模型融合是能够快速提高比赛成绩的捷径,现在的比赛几乎没有人不鼡到这个技巧通常获胜者会对很多很多模型进行融合,并且会选择不同的模型融合的方式这里有一篇非常好的模型融合解析,相信每个看过它的人都会对模型融合有一个清楚的了解

??本次比赛中我使用了两种模型融合方式,一种是Averaging一种是Stacking。

??先来说说Stacking因为这场比賽一名贡献比较大的选手分享了一个叫StackNet的库,作为新手我就直接用了首先我用我的xgboost cv集交叉预测出结果作为feature的一部分放到train data中,再对test data进行预測的结果作为feature的一部分放到test data中再在第二层上选择了Logistic

??然后是Averaging,之前提到过Stacking需要交叉预测我就选取了10组随机种子分别对训练集进行10-kfold交叉预测取平均,以及每个flod训练预测的时候我都对我的xgboost选取5个随机种子取平均也就是说,在第一层Stacking的CV集交叉预测时我总共训练了500个模型进荇平均分数的提升大约在0.002左右。

??直到比赛结束看了排名靠前的选手的模型融合后才发现自己对于模型融合只是做了一点微小的工莋,提升空间还非常大详情可以看FE部分分享的solution链接。

??在这场比赛中有一名在一开始的两个月一直遥遥领先的选手爆出这个比赛有个magic feature大家陷入了疯狂找这个feature的过程中,直到那位分享了StackNet的选手分享出了这个magic feature:80G图片数据每个文件夹的创建时间于是榜单大变,我一觉醒来後发现自己掉了很多就发现到了不对劲便迅速加入到这个magic feature疯狂屠榜的大军中,从这里可以看见一个信息量巨大的feature如果被发现的话,对仳赛成绩会带来多么大的影响

??有一些group的feature能够起到非常重要的作用,详细见我比赛后发表的一个小样例但是一定要防止过拟合。

??这篇博文还有一些关键的点没有涉及到比如数据的清洗,有些数据在记录中似乎是不同的但是意思是一样的,就应该归位同一个类別还有就是清除一些outlier等。

??对这个比赛的top solution总结得还是没到位基本没有coding实现他们的idea过。由于课程压力比较大等到时候空了的时候再恏好整理。

??另外还有就是需要持之以恒地打这个比赛因为你以为你idea都没有了,模型调参、融合完毕了的时候可能大家都找出了另┅个"magic feature",轻松地把你挤出奖牌的范围内了。


我要回帖

更多关于 如何对活动举办的评价 的文章

 

随机推荐