Hust-ZYD / SubwayFlowPredict

2019天池大数据竞赛杭州市地铁流量流入流出预测 成绩27/2319 比赛地址https://tianchi.aliyun.com/competition/entrance/231708/introduction?spm=5176.12281957.1004.6.38b04c2a85aWql

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SubwayFlowPredict

2019天池大数据竞赛杭州市地铁流量流入流出预测 成绩27/2319 比赛地址https://tianchi.aliyun.com/competition/entrance/231708/introduction?spm=5176.12281957.1004.6.38b04c2a85aWql

个人认为此次时序比赛的最重要一环是数据集的划分,需要考虑到数据泄露、数据分布的问题。

作为一枚比赛小白,个人建议可以从大佬分享的baseline入手,参考他们是如何进行数据分析、建模的,但是一定要以批判的眼光看待,学习的是思路而不是copy代码,也不是在baseline基础上盲目的堆特征(事实证明这很浪费时间)。

最终模型:单模lightGBM+20个特征

下面是整体的思路:

主要过程:

海选赛

1.数据集的划分

元旦的数据分布情况和其他天明显不同,删除元旦数据。

剩下的天数,由于周一到周五和周末数据分布不一样,现在预测29号(周二),暂时去掉周末数据。

剩下的天数,以5天为一个周期,时间窗口取为5天,特征提取区间为前5天(特征构造不能用到当天或者未来某天的数据),验证集用28号。

这里要注意由于窗口取得5天,最开始的前5天数据只能作为特征提取区间,不参与训练。

2.预测值预处理

观察预测值inNums和outNums的分布,发现是一个长尾分布(大多数值集中在较小的数),因此做一个对数变换ln(x+1),转化为近似的正态分布,更适合模型预测,预测值记得用指数函数还原。

3.特征工程

时序特征主要有:

1.原始特征:hour minute week

2.前1-5天的同station同时段的inNums/outNums 这里前5天中的第5天即为上周同一天(尝试过取前两个星期,效果不好)。

3.把窗口缩小一点,构造统计特征,取最近3天构造统计特征。最近三天的均值,相邻两天的差值,相邻两天差值的差值,相邻两天的值相除等。

4.对hour分箱。观察数据分布可以看出,上午7-9点,中午11-16点,晚上17-19点是高峰期和平峰期,可对这些时间段内的hour作分箱处理(具体分法可以再细化,比如week和hour组合特征)。

空间特征:

对stationID和lineID重新编码:按照staionID分组后的平均人流量对站点进行排序,将stationID按照大小顺序重新编码。lineID同样操作。

空间特征挖掘空间还很大,没有时间了。 可以尝试DeepWalk算法做embedding

4.模型

lightGBM,调参是没有时间调参的。。简单按照以往的经验稍微调了下参数,没有时间细调了。

淘汰赛

做了半天吧,差不多下午开始做,有事没有坚持做到最后时间点。(主要是前期准备不充分,思路没有打开)

直接把周末数据添加进去,特征提取区间换为前7天,注意观察周六和周末数据分布不一致,预测的为周日数据,因此我把验证集用的上一周的周日。

代码几乎不变,跑出来就提交了,12.4+当时是25名左右(心想模型泛化性能还可以),后面简单做了XGB和LGB的模型融合没有什么提升(XGB跑的太慢时间跑没了,如果前期这些尝试过的话,能省不少时间),晚上结束看的时候跌到70左右了,比赛结束。

总结:数据和特征决定了机器学习的上限。第一步数据集的划分极为重要,对数据的理解极为重要,盲目的划分数据集和堆特征最终效果基本是做无用功,开头就走歪了,后面自然越来越歪。

文中不妥的或者错误的地方,感谢指出!有也在找实习的小伙伴欢迎交流!

About

2019天池大数据竞赛杭州市地铁流量流入流出预测 成绩27/2319 比赛地址https://tianchi.aliyun.com/competition/entrance/231708/introduction?spm=5176.12281957.1004.6.38b04c2a85aWql


Languages

Language:Jupyter Notebook 100.0%