2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > [印象盐城]数创未来大数据竞赛 - 盐城汽车上牌量预测亚军比赛攻略

[印象盐城]数创未来大数据竞赛 - 盐城汽车上牌量预测亚军比赛攻略

时间:2020-06-30 10:03:47

相关推荐

[印象盐城]数创未来大数据竞赛 - 盐城汽车上牌量预测亚军比赛攻略

大赛具体信息可以参考,比赛地址:

/competition/entrance/231641/introduction?spm=5176.12281957.1004.6.38b04c2a6dFlCw

共有2635只队伍参赛,我获得了复赛Rank1,决赛亚军。这是我的方案。

题目内容:

本次赛题需要选手利用历史某3年的汽车日上牌数据,预测某2年每天的汽车上牌数。

数据特点及要求: 数据经过严格脱敏,所以选手看到的”cnt”并非真值;字段”date”, “brand”用数字代替;字段”day_of_week”是真实的数据。 为还原真实场景需求,除日期和假日外的未来数据,皆不可使用。

价值: 预测盐城总体汽车增长情况,对于政府的道路规划起到一定的指导意义。

赛题分析

精确:要对上牌量做到尽量准确的预测,这样才能更好的指导政府道路规划等实际应用。 泛化:模型要对不同品牌,不同时间的数据表现稳定,不能有太大的波动。 性能:因为未来实际应用的时候,可能会处理大批量的数据,所以对模型的性能也有一定的要求。

整体方案如图所示:

数据预处理

数据特点: 1,赛题日期等关键数据进行了脱敏。 2,上牌量为0的日期的数据是没有的。 3,赛题要求对未来每天上牌量的一个长期预测,最后决赛阶段预测的时间的跨度超过了1年,假日等特征十分的重要。

数据还原: 1,为了对数据规律进行探索,及使用时序算法,需要填充缺失的日期。 2,为使用日期和假日作为特征,及对实际日期进行还原。

缺失日期填充: 1,汇总每天的上牌量,并按Sale_date排序。 2,先假设没有完全失去的一周,即只要后续日期的day_of_week小于等于本天,就是开始了新的一周。以此为根据补全所有的缺失日期。

日期还原: 因为上牌量具有工作日上牌量较多,节假日较少的特点。所以可以将填充缺失日期后的上牌信息与每年节假日情况进行对比,主要以十一和春节两个大假期作为锚点,通过比对这两个假期的距离以及历年春节的日期,可以很快确定第一周是从1231开始的。

节假日信息: 根据历年的放假安排加入节假日信息,主要是工作日放假及周末串休的情况。同时重新检查是否有完全没有上牌的周(这个根据检查是没有的)。需要注意9月3日抗战纪念日,3号、4号、5号放假,6号上班。

工作日、节假日特征: 每天的工作情况是最重要的特征之一,必须进行妥善的处理和表达。建立if_work_day特征对工作情况进行表述: 1,根据统计数据发现一般工作日与周六、周日相差较大,周六与周日也有一些差别,不过周日和节假日的情况差别不大。所以分别用2,1,0对应一般工作日,周六,周日。 2,节假日休息的日期处理成0,串休工作的日期处理成2。

数据分析: 将数据按日期画折线图及按每年叠加分别画图进行观察,可以发现一般的品牌都有比较明显的周期性(年,周等),所以类似day_of_week,day_of_year一类的特征肯定要用的。

异常值处理: Brand5和Brand8的数据在以前和后期情况相差很大,所以在做特征的时候这两个品牌只取之后的数据。特征工程

特征工程: 前期以探索、堆叠特征为主方向,后期以调整、优化为主方向,因为本次比赛数据量相对不大,可以进行频繁的实验,实际过程中对所有特征的变化都通过实验进行了验证。

尝试过的特征数据及变换: 1,基础数据特征:上牌日期,总日期,品牌,工作情况,年第几天,月第几天,周几,年份,月份,年第几周,总第几周,总第几月等等。 2,衍生数据特征:节假日前后第几天,春节相关的系数(试过春节距离新年的天数及一些衍生的系数),放假第几天,去年当日上牌量(本天减364,因为要周对齐)及一些衍生,去年当周上牌量(本周减52)及一些衍生(比如本品牌在当周的排行,日期平均、品牌平均等),平均当周在一年的占比,平均周几在1周的占比,时序预测(fbprohpet, auto.arima, tbats …)的结果等。 3,外部数据特征:网上爬取了盐城地区的汽车产量,消费情况等数据,以及乘用车比赛的月汇总销量等等。 4,目标值处理:尝试过对上牌量进行开方,取Log等变换。

特征评估和验证: 选择特征的时候使用了相关性,pca,selectkbest等方法。程序对调整后的特征自动进行实验验证及记录,以Xgboost和LightGBM的线下成绩为判断依据。 使用过类似贪心法的办法进行自动模型探索,即先放入必不可少的几个特征后,通过代码对比每次增加新特征之后的成绩,确定是否保留这个特征。然后继续直到把所有特征都过一遍。

选择结果: 经过大量的实验,尤其是在3月2日更新不准使用日期和假日外的未来数据后,基本排除了2,3部分的特征,以及第4部分的变换,最终特征都是来自第1部分的基础特征。

最终特征版本(使用9个特征): day_of_year(年第几天), brand(品牌), week_id(总第几周), day_of_month(月第几天), day_of_week(周几), week_of_year(年第几周), year_num(年), if_work_day(工作情况), month_num(月) xgboost下特征的重要性排序如图所示(LightGBM也是这个顺序):

模型选择、调参及优化

尝试时序算法:

1,尝试使用fbprohpet及auto.arima, tbats, stlf,等时序算法,试过按日,周(然后按照一周内每天的占比再分),效果都一般,不够参与最后的融合。2,后续曾经尝试将时序分析的结果(包括时序分析预测 的结果,fbprophet的yhat, yupper,ylower)等用于回归的特征,效果还是不好,最后放弃了直接使用时序算法,只作为对数据规律理解的辅助手段。

选择回归算法:

1,尝试LR, XGBoost, LightGBM, CatBoost, KNN, RF, DT, SVR, LSVR, GBDT, ABDT, BAG, ET, MLP, RIDGE, LASSO等多种模型,根据模型效果重点使用XGBoost, LightGBM进行实验,不过只要对特征进行较大改动还会用所有的模型扫一遍,防止漏掉可能的好方案。2,模型评估,TestA阶段主要是线下CV的结果进行验证,TestB阶段用TestA阶段的结果补充验证。3,在调用模型的时候,对于分类特征(品牌和工作情况),对比了直接训练,使用categorical_feature,以及分别训练,发现分别训练的效果更好。最后选择了3种训练模式:1,按Brand分别训练,2,按工作情况分别训练,3,按工作情况分别训练,然后工作日再按照Brand分别训练。然后再将结果融合。

参数调优: 采用网格调参,调参的时候针对10个Brand分别运行GridSearchCV,因为发现对于不同的Brand在大多数的参数上的取之都是比较集中,所以最后的参数是这个10个Brand参数进行表决的结果(取出现最多的数值)。验证的时候发现比每个Brand分别用自己GridSearchCV的最优参数还要好,在提高成绩的同时也提高了整个模型的泛化能力。

最终方案

总结

创新性:

针对长期预测的特点选择了最适合的少量特征+适度复杂模型的处理模式,有效的防止了过拟合的产生。 通过采用表决机制形成统一的最优参数,在提高成绩的同时,提升了方案的性能和泛化能力。 系统化的特征构建及全自动的实验、记录及验证过程。以多模型的线下结果作为选取特征的评估标准,对多种特征组合进行验证。 对模型的训练方式进行了深入的探索和测试,最终通过分类训练然后融合的模式提升了准确性。 细致的数据预处理过程,对具体日期和节假日的精细还原。

实用性:

精确:最终线上成绩32778,复赛第1。 泛化:整个模型的泛化能力很好,线下针对不同的时间段进行测试,都取得了很好的成绩。 性能:算法性能极佳,未来用于实际应用的时候,处理大规模数据完全不是问题。 高效:通过构建科学的代码结构,很方便的进行特征构建及模型的探索;实现全自动的实验及结果记录,提高人员工作效率;代码复用性很好,可以很方便的复用于其它问题。

经验总结:

需要对业务和数据进行深入的了解,科学的数据可视化处理对于理解数据有很大的帮助。 磨刀不误砍柴工,优化代码结构,将模型实验、特征分析和结果记录等工作自动进行,提高工作效率,实现快速迭代。 查找资料,借鉴前人经验。做好规划,合理安排时间,可以多种方案、模型并行研究。 如果向一个方向反复尝试都效果不好,不妨停下来,让自己缓一缓,想一想其他方向,不要落入自己的思维定势。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。