向AI转型的程序员都关注了这个号????????????
机器学习AI算法工程 公众号:datayx
根据郑州市某年8-11月各地铁闸机刷卡数据来预测12月1-7日的地铁客流量。通过对数据进行分析和清理后我们发现该问题为时序模型问题,因此我们在建立模型时分析并去除了异常的时间点,再应用构建的时序模型预测出相应的客流量。
代码 以及运行教程 获取:
关注微信公众号 datayx 然后回复 地铁 即可获取。
AI项目体验地址 https://loveai.tech
字段分析
比赛数据给了41个字段的数值,用于预测每日客流量。从题目要求中可知,我们所需要输出的预测结果只有“日期”,“TRADE_ADDRESS(刷卡地点编号)”和“预测客流量”三种数据。这意味着很多所给的字段可能是无用的。并且我们发现,预测客流量并不是一个直观的字段,因此需要我们自己对其进行整理。建立ipython文件Traffic_dataAnalysis。先用pandas库读取csv的数据:
客流量并没有出现在字段中,由题目要求得知,每个站点的日客流量是交易类型21,22之和,因此客流量实际上就是对应行的和。因此我们选择用python进行作图,来判断字段之间的联系和影响。
通过作图我们可以看出,每个月不同刷卡地点的客流量的变化趋势十分接近,因此可以知道刷卡地点TRADE_ADDRESS字段的数据拟合的非常好。
数据清洗
通过分析我们字段我们得出结论,这是一个关于时序模型预测的问题。其余无关的属性字段对预测并没有帮助,可以去除。因为预测的数据单位为天(day),因此我们先将日期进行正则处理,只取年月日(Y-m-d):
增加字段TRADE_DATE_DAY:
通过dataframe的排序求和,我们获得对应日期对应刷卡地点的客流量字段VAL:
将重新整理的数据输出,此时便得到了用来训练时间序列模型的数据集。
特征工程
新建ipython文件Traffic_modelNPre,对新输出的数据集进行操作。通过分析相关字段的客流量变化,可以看出其波动非常之大,这势必对模型的拟合产生影响,所以我们建立新字段VAL_LOG,对VAL进行指数转化,使变化值处于一个相对小的范围内。
针对整理好的数据,可以分析出:地铁客流的时间序列具有一定的连续性,以一周为单位,整段时间的客流情况会具有相似性。因此对于该题我们决定使用 时间序列模型 作为基本模型进行解答。这时开始继续分析数据:
该函数能提取相应TRADE_ADDRESS的时间序列数据,及每天的平均连接数。
绘图结果如下,可以看出有存在异常的天数。
所以需要写如下函数将异常的日子过滤掉,此处的过滤策略是:对每月特定时间段天数的数据求均值与标准差,然后将均值与标准差落在10%分位数以下和90%分位数以上的日子去除。
去除后序列如下:
将异常的天数筛选出来后,保留剩余的天数所对应的数据,并且将异常天数对应的日客流量取每月正常天数客流量的均值,使得模型能更好的拟合。这样我们便得到了新的数据集,保存在data_final文件夹中。这样,就完成了建立模型的前置工作。
建立模型
数据都已经准备好,可以开始着手模型的构建了。因为地铁人流具有连续性的特征,我们使用ARMA来对预测进行一定的修正,模型如下:
我们选择了8-10月的数据作为临时训练集,将11月1-7日的数据作为验证集来测试模型拟合的好坏。通过计算得到,该时序模型的置信区间落在(2,0),因此我们的时间序列模型p,q数值的取值分别取2和0作为参数。
从结果图上来看,对于时间序列趋势的预测还算不错,但仍存在部分偏差。模型基本构建完成,可以开始进行预测了。
结果预测
按照要求的表格形式,输出成dataframe,
进行输出就完成了预测数据:
我们将训练模型保存,用9月1日-9月7日作为测试集进行预测,与实际数据比对,最终得到的MAE=4135.218。
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
机大数据技术与机器学习工程
搜索公众号添加: datanlp
长按图片,识别二维码