大数据竞赛所历所思

  

  比赛已经到了最后一天,旺旺群和QQ群上大神们百无聊赖地聊着天,因为数据量比较大,程序运行时间都相当长,在群上聊天打屁成了一种打发时间的很好方式。虚拟机上的几个程序还在跑,赶着最后一次提交,不过大抵尘埃落定了,首页是进不了了,但在7200多支队伍中,跌跌撞撞地拿到20多名的成绩,已经大大超出预期,也算是对这2个月学习、实践的肯定。

  4月中旬帮论文导师搞完定位系统后,就开始入手这个比赛,赛题是根据用户4个月在天猫的行为日志,建立用户的品牌偏好,并预测他们在将来一个月内对品牌下商品的购买行为。因为即将开始的研究生读的是数据挖掘方向,刚好借这个比赛把研究生期间学的东西提前学了,而且赛题几乎是工业界的实际场景,数据规模也不小,是实打实的应用,动态更新排名更是让这个比赛充满了趣味,所以找了志鹏和伟文就开搞了。

  在比赛期间,尝试了各种算法,出现了各种Bug,接下来细细道来。 


  第一季

  第一季的数据规模很小,18.3万条记录,4M的数据。但一开始还是觉得很难驾驭,因为什么都不会。第一季有队伍用Logstic Regression(LR),取得了不错的成绩,不过当时不怎么会,本着从基础搞起的计划--先学CF。发现这个算法的简单实现并不太难,很快用C语言实现了,但成绩十分不理想。不管是Item-CF或者User-CF,从算法的各个方面对其优化后,都没有取得理想的结果。一开始觉得是信息太少的缘故,后来想想协同过滤的原理和此处的推荐似乎是相悖的。之后用了一条考虑到时间、各个行为权重的规则,很快破7%(利用准确率和召回率得到的F1)。

  差不多可以进第二季了便开始学习LR,这才真正开始走上机器学习的路。在用LR之前,自学了Python,因为Python和C语言在语法上神似,比较顺利的入手,在YY了几个点击、购买相关的特征后用python实现了LR,用第一季的数据在线下做了测试,成绩5%左右。此时了解算法内核并且实现算法对之后的应用还是很有帮助的。

  最终第一季成绩7.02,排名218,顺利进入第二季。


  第二季

  第二季开始的时候,制定了一个策略--先把LR用到极致,然后再换其他模型,这便是悲剧的起始。

  这一季的比赛环境是阿里自主研发的Odps,选手通过远程连接在上面开发,数据保存在阿里的云服务器上,算法使用的是odps的Xlib库,数据规模大概是5.7亿条记录,2G,算是真正见识了海量数据与云计算。4月24日那天,比赛正式开始,看了下例程,发现用SQL来做这个比赛简单粗暴,然后就一直用到最后。用了2天熟悉ODPS平台,并且用SQL生成了特征表,在4月26号提交了第一个LR结果,成绩是3.56%,排名43,这是第一次大提升。

  前1个月的比赛做得很细,通过观察数据和从业务逻辑考虑一个一个的添加特征,慢慢筛选特征、组合特征、优化特征,尝试数据清洗、随机采样、特征归一化、处理特征值分布不均匀等数据预处理,对比不同训练测试集的优劣,通过看博客、论文深入了解LR的不同实现和模型参数的具体含义。虽然成绩提高得很慢,但是每次提高自己都心里有数,而且这个月自己真正学到了机器学习的一些东西,对于电子商务的业务逻辑也有自己的思考。

  不管出于学习,抑或是固执,LR都限制了成绩的提高,最多只做到5%左右。偶然的机会用了RF和LR融合,马上提到了0.11%,接着就换GBRT,又提高了0.11%,排名到了51,这是第二次大提升。这次提高突破了5%,而且多了一大截,为了庆祝整队去看了部《超凡蜘蛛侠》,之后队群的名字就变成了“超凡大腿们"。

  LR不仅限制了成绩提高,还限制了构建特征体系的思路,让我有了特征体系只能有ub对特征的错觉,所以在使用GBRT后依然只有7,8个特征。意识到问题所在,添加了10个u、b特征,然后成绩暴涨0.4%,这是第三次大提升。之后逐步优化特征体系,特征到25个时成绩提高到5.75%,然后本科接近尾声,开始忙毕业的事,就开始长达一个月的滑铁卢,从27名滑到47名。毕业季结束后本来想去环游中国,万万没想到又开始做比赛。这是分水岭,之前是慢慢派,比赛的每次进步自己都心里有数,成绩提升的比较慢,这之后就变成豪放派,我开始大幅度添加特征,从27个特征添加到54个特征,然后69,121,169,273,369,473,587,很神奇的是每次添加特征,成绩都能提高,添加特征从5.75%直到6.02%,用了一周的时间从47名顺利进入首页。为了庆祝破6,整队又去牛太郎烧烤吃了一顿自助餐。

  最后半个月甚是凄凉,都没怎么提高,我本来以为是融合的姿势不对。深入一想,融合姿势是不对的地方有二:

    1)在GBRT没办法提高的情况下要换个思路用RF好好搞几天才是正确的方向

    2)之所以GBRT融合没办法再提高,应该是在LR期间用各个简单的特征整合起来的7,8个特征太强,导致每次添加特征,得出来的结果都只有很微小的差异,因为这几个强特征已经能对样本做出比较好区分,所以构建的前几棵树总是选用这些特征作为树根,这样差异就小了。

   下图是第二季的成绩变动图:

  

  几个坑爹大Bug

  4月多的时候线下成绩一直是2%多,和线上差了2.5%左右,群里大神们都是0.3%~0.5%,我窃喜,可能我的模型比较独特。窃喜了10多天后才发现这原来是个坑爹的Bug-统计最后一个月的购买集时,将'-'写成了'_',导致预测集只包括了8月份的数字,这就意味着这10多天的线下测试结论都是不靠谱的。

  在我发现了这个巨坑后,我的神坑队友也发现了一个残害了我们10多天的BUG-他始终认为数据的日期范围是5-01~8-31,所以代码的时间范围也都是根据这个定的。这就导致了他那边的测试结论也变得不靠谱。

  7月8日,也就是上图的73天,得到了一个0.64%的成绩,当时让群里的少年们乐了一把。这是由于SQL中的select不保证行序,我在不了解这个特性的情况下犯了个很隐秘的错误,导致了上图的暴跌。

  更多的Bug出在特征提取上--复制代码的时候忘记了修改时间,以及训练集用到了先验知识也就是预测集的信息,导致深深的过拟合,以及一些内建函数的使用,比如sum写成count,因为代码很长,程序运行时间很长,数据以及结果很难用直观的判断,所以此类Bug很难找。

  这个比赛最痛恨的不是对手,是Bug,每次有Bug都要盯着屏幕找很久,而且没办法调试!但最喜欢的也是Bug,因为成绩没办法提高的时候,你突然发现了Bug,那简直就是看到希望啊!

  

  一些体会

  不要在不了解人生的时候给人生下定义    这次比赛最大的错误应该是第二季开始的时候订的策略,自己根本不够了解LR和其他的算法,不知道内核,不知道差异,不知道它们在这个比赛的适性,然后还要像固执的告诉自己把这个算法用到极致,如果能早点抛弃LR,转用GBRT,就不会有后面诸多的后遗症,结果可能完全不同。正如我们不应该在不了解人生的时候给自己的人生下一些定义,做诸多的束缚,而应该在年轻的时候去不断尝试各种可能,然后找到自己最喜欢亦或者是最适合自己做的。

  再平凡的人,只要时刻注意,总是能做出成绩的    这个比赛有7200多支队伍参加,有新手,也有实力强、经验丰富的人,但比赛到最后,前者也有可能做出成绩,只要抱着平常心一直坚持着,因为有很多人会慢慢因为各种原因退出,时间长的比赛亦或者其他事情就是这样。

  山水真是个态度超好的员工,官方团队认真倾听参赛选手声音的态度让人难以忘怀,关键阿里真的是土豪公司,嗯,是我想去的公司!


  这次阿里又给了件设计得不错的T-shirt,算是学生时代比赛赢到的第8件T-shirt,为了凑满10件然后召唤神龙,苦练一年,来年再战!

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值