今天老肥和大家分享的是下午刚刚结束的招商银行2021FinTech精英训练营数据赛道的方案。这次赛题是时间序列
赛题,我也是第二次尝试(第一次是中兴捧月迪杰斯特拉赛道的流量预测),方式方法还略显稚嫩,只使用了树模型与时序模型进行任务的建模,最终取得了榜单24名的成绩,在这我抛砖引玉,期待大佬们更加多元化、性能强大的方案。
赛题介绍
近年来,以A(artificial intelligence)B(big data)C(cloud)为代表的数据智能技术飞速发展。为适应新时期银行科技转型的发展战略,招商银行提出“轻运营”理念,通过对未来业务量进行精准预测,可以合理安排人力,提升关键工作节点的精确化和自动化能力,向着以卓越、高效、低成本为特点的精益运营更进一步。
本次竞赛给出的数据包含日期、节假日信息、时间段、岗位(含2种岗位A、B)、业务类型和业务量数据。赛题共有两个子任务,任务一的权重为0.7, 任务二的权重为0.3。因此优化任务一收益更高,我们需尽量提升任务一的分值。
- 任务1:预测未来31天各岗位
每天的业务量总量
- 任务2:预测未来31天各岗位
每天每半小时粒度的业务总量
竞赛的评价标准为mape,该指标真实值较小的数据的影响要远大于值较大的。
解决方案
首先是对于任务一,需要我们预测未来每天业务量的总量,我采用了lgb模型对时序数据进行回归建模,特征包括节假日信息,当天的日期信息,包含年月日季度等等信息。
代码语言:javascript复制def get_inner_date_feature_eng(data):
data['date'] = pd.to_datetime(data['date'])
data["month"] = data['date'].dt.month
data["year"] = data['date'].dt.year
data["day"] = data['date'].dt.day
data["dayofw"] = data['date'].dt.dayofweek
data["dayofy"] = data['date'].dt.dayofyear
data["week"] = data['date'].dt.week
data["quarter"] = data['date'].dt.quarter
return data
对于AB两类不同的岗位分别训练建模(A类型岗位直接对大类进行训练),均使用2020年11月以前的全部数据进行训练,使用2020年11月的数据作为验证集。
从验证集来看,模型对A岗位学习较优,仅有0.036的mape,而B岗位的mape较高,观察发现模型对B的预测数值存在普遍数值较低的线性,结合历史数据,我们可以看到较为明显的年末效应(业务量增加),于是我对所有B岗位的预测加上固定数值,当然也可以使用比例系数放大的方法,最终在验证集能达到0.062的mape。这种规则处理的方法使我的任务一线上得分从0.13提升到0.06,可谓效果拔群。
对于任务二,我采用了两个不同的模型进行平均融合,首先是lgb模型,特征包括节假日信息,上一日的节假日信息等等,另外还有不同之处在于,在任务二中我采用分岗位细类
分别进行预测,最后将同岗位的数据按periods加和获得最终预测结果;第二个是arima模型,我将节假日信息作为外部信息对模型进行增强,对不同periods的时间序列分别进行建模。最后将这俩模型根据任务一的预测结果进行数据缩放
(因为任务一的性能较优,用任务一来指导任务二模型更加逼近真实值),这种规则处理的方法能够使mape优化接近2个百分点,同样效果拔群。
综上所述,我使用的模型方法结合规则后处理的方法综合使用能够取得较优的结果。以上就是本篇文章的全部内容了。
本文的所有代码已经上传 https://github.com/librauee/ZSYH