【百度点石(WSDM)】 Retention Rate of Baidu Hao Kan APP Users 小白经验分享

先说结论

线上 AUC:0.7466
这是我正儿八经参加的第一个数据科学竞赛,心路历程也是十分艰辛,队友经历几次更换,自己也是经常游走在崩溃的边缘,同门都说我头发又见秃,总之不是很顺利的,最后结果不是很理想。用我队友的话就是100来人的比赛,不拿个top3真的没用。
菜是原罪。?
这个比赛总结,拖了太久了,自己真的是拖延癌晚期,写出来对别人实际参考意义不大,只是对我自己的一个总结,想在这个基础上把代码整理一下,争取下次别这么丢人了~

百度点石

先来谈谈百度点石吧,常见的比赛阵地是天池、kaggle、datacastle等等,点石算是比较小众的吧,含金量不高,参赛人数较少,倒是之前因为他和我交合作了一个比赛有点印象。

再也不想参加点石的比赛了,有问题官方不管不顾,题目不规范,对新手最终要的论坛也存在活跃度几乎为0的情况,体验感超差,太不友好了,费心费神。如果你和我一样还是入门新手的话,建议还是平台大一些的天池或者kaggle吧,和一些热爱分享的人一起比赛,进步会很快的~

一次管够,再也不想参加了。

赛题背景

学计算机还是需要点英文阅读能力的~
如果你读着很累,还是选择有道滑词翻译插件吧~
大概就是:根据用户基本属性、视频信息与用户行为信息,预测用户是否留存。
是一个二分类问题,评价指标是AUC。
【百度点石(WSDM)】 Retention Rate of Baidu Hao Kan APP Users 小白经验分享_第1张图片

数据探索

获取数据

数据呈现的特点是:真实脱敏数据,数据庞大,缺失值很多,原始特征共21维。
当训练数据下载下来的时候,我是懵逼的:

  1. 原始数据以二进制文件存储,以前没碰到过。
  2. 好不容易将数据切分开以后,发现训练数据24G,测试数据8G。
    咨询了大佬以后,我认为解决办法有三个:选择spark or 借一台至少64G内存的服务器 或者选择将数据拆分开一组一组的跑模型~
    最终,厚着脸皮找同学借到了他们实验室的服务器,尽管有64G内存,但是还是时刻在崩掉的边缘啊~

数据

包含用户个人信息数据、视频信息数据、用户行为数据。
训练数据:9.7kw条 22G
测试数据:3.6kw条 8G
共有124w用户

    用户id
    性别
    年龄
    教育程度
    地域编码
    是否留存
    安装渠道
    视频id
    视频分类
    视频tag
    创作者
    上传时间
    视频时长
    是否展现
    是否点击
    推荐类型
    视频播放时长
    行为发生时间戳
    是否评论
    是否点赞
    是否转发
  1. 数据特点
    因为是真实数据,所以缺失值非常多,还存在很多异常数据,比如这个用户一会是男生一会是女人。
  2. 滑窗法(pass)
    一般这样的问题呢,大多数都是时候滑窗法,对一段时间的数据进行分割,划分成多个自数据集(如果你还没了解过滑窗法,请戳这里),但是虽然此次数据的时间跨度如下
训练集 10.15-10.31
测试集 10.15-10.31
预测:使用之后转天是否留存

但是每个用户在这段时间内只有一天有数据,所以滑窗法失效。

  1. 各个特征与是否留存的相关性
    这段需要绘图来查看,这种常用的小代码,我会更新在文末,总结成一个专门的笔记。
    绘图之后,都差不多,没有特别相关和特别无关的特征,这又给我们增加了难度。

数据整理

在最开始的时候我们纠结的点就在于,一个是滑窗法对此题该怎么应用,另一个就是如何填充这里大量的缺失数据。
事实证明,年轻人拿到数据就该多自己观察数据,而不要就想着我该怎么处理。这两个问题都是无用的, 因为是线上数据,所以必然有很多缺失值,而且也是合理存在的,同时lightgbm是对缺失值不敏感的,所以还是经验太少了,在此处耽误了很多时间。
主要的处理数据步骤:
1. 删除整份数据都相同的特征。
2. 规范异常数据。
3. 对数据按照uid和timestamp_of_behavior升序排序。
4. 对必要特征处理缺失值和异常值,比如性别的异常。将所以的缺失值替换成nan。
5. 时间戳转化为日期。
6. 连续特征离散化,离散属性数字化。
7. 转化数据类型,降低内存使用率。
8. 最后将原始数据整理成一个用户一条数据的形式。(我觉得我成绩不好的原因绝对是这里出了问题)

我的问题???反思自己一下吧~

  1. 数据观察不够,不够详细,也可能是没有经验吧,只知道观察数据,但是忽略了“如何做”。
  2. 这块没有一步到位的处理好,写的bug太多,导致到最后的时间内我还在修改这块的代码。
  3. 没有及时将数据保存,节省代码运行时间。我在前面写过,这次比赛的数据量非常大,运行一次简简单单的数据处理,可能就需要个把个小时,所以要随机应变啊~
  4. 变通性太差,一直在纠结,殊不知只有实践才是检验真理的唯一标准,别犹豫,多查多做即可。
  5. 前期积累太差,没有做好常用小函数的笔记,写的时候翻书,翻别人博客浪费了很多时间。《利用Python进行数据分析》一定要多翻多看多用,我就是太久不用,非常生疏。

特征工程

特征工程的话,我还从user、item、user-item这三方面进行展开的,但是为啥最终效果这么差,我觉得旁人没法给我一个解释,还需要我自己在去读别人的代码,来进行自我反思吧。
我阅读了几个大牛开源的思路后整理一个这个,仅供新手使用,大牛勿喷~
特征工程的特征从何而来

构建特征

  1. 性别 one-hot;
  2. 年龄、学历 label-encode;
  3. 安装渠道总个数、该安装渠道下留存得分;
  4. 时间戳处理转化,行为时间戳的星期、天、小时;
  5. 最后一条行为数据距离转天0点之间的时间差,连续两次观看视频之间的时间差;
  6. 视频类别和安装渠道进行one-hot,视频tag取200维进行tf-idf向量;
  7. 所看视频个数、视频类别数、展现、点赞、评论、转发次数,所有行为总次数;
  8. 观看视频时长和视频总时长的比例的最大、最小、平均;
  9. 用户点击视频中视频类别个数,用户展现视频中视频类别个数;
  10. 用户前10、20条记录中show的比例,用户后10,20条记录中show的比列;

五个强特

  1. 用户安装渠道;
  2. 用户APP使用时间;
  3. 用户最后使用APP的行为时间戳的小时;
  4. 用户观看视频时间的比例;
  5. 用户观看视频的总时长。

反思

在做特征的时候就注定我是个loser了吧,后期进行代码排查的时候我发现我写的几个地方就把数据大变样了,造成了很多问题,虽然后期纠正了,但是还是逃不过命运。在一个地方就是我没有掌握如何判断新加特征是否能提高AUC,我就一味的加特征加特征,我觉得十分忙目,不知道如何处理。还有的就是在昨晚特征之后也是可以把数据保存成一个新数据的,节省时间,最后一次模型跑了8个多小时,都快哭了。

训练模型

因为是第一次参加这种比赛,我就选用了对新手最友好的lgb训练了一个模型,这个比xgb训练速度会更快一些,效果也差不多。我没有用网格搜索来挑选最合适的参数,我觉得这点影响都是微乎其微的可以忽略。在这一阶段我最大的收获就是学习了lgb这种数据科学比赛大杀器,官方文档一生推,你想要的官方文档都有。

模型融合

到训练模型我的历程也就结束了,都没做到模型融合的一步,真的是遗憾。
奉上我之前找到的非常好的博文:
https://blog.csdn.net/WxyangID/article/details/80205075

人生经验

  1. 练习赛和真实比赛绝对不一样!!!比飞行棋更加紧张刺激~
  2. 团队协作很重要,如果你是新手菜鸟,一定要有队友,孤军奋战真的太累~
  3. 找到适合的入坑比赛。尽量选择预测、分类这种常见场景的,数据集大小要适中,像我这次就是数据25G的数据,跑一次模型几个小时,要快速迭代才能给我们更多反馈,进行更多优化。
  4. 熟能生巧。表格型比赛大同小异,打上一两次就能积累非常多的经验,要有自信,也要把一些常见的代码积累下来,都是可复用的。
  5. 版本控制。无论是你自己还是队友之间都需要进行版本控制,才能不用浪费一遍又一遍的时间来记住我哪里做了改动,而且现在github开放私人库了,我觉得是十分友好的。
  6. 海量数据处理时记得降低内存使用,优化存储空间,我就因为对pandas数据处理机制不理解,没有好好优化,跑崩过一次又一次。
  7. 代码的耦合性一定要降低啊,一定要降低,我把数据处理、特征工程、和模型都放在一起,后期好痛苦- -。
  8. 学会多读别人的源码,学习思路,学习代码优化,这样才能快速提升。
    良心推荐,一个top solution集合,一个成电的学弟进行总结的。
  9. 心态要好,打比赛嘛,肯定是要适当熬夜的,但是别让自己太暴躁。

第三名的简短经验分享

https://developer.baidu.com/forum/topic/show/298191

结语

写到最后,发现自己并没有写太多的干货,特别重要的特征工程都是一笔带过,因为自己真的菜吧,好多问题还是没理解,真的很惭愧。

你可能感兴趣的:(算法比赛相关,机器学习和自然语言处理相关,百度点石,数据科学,机器学习,用户留存)