• Stars
    star
    141
  • Rank 259,971 (Top 6 %)
  • Language
    Python
  • Created about 8 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

1st Place Season one & 6th Place Season two

菜鸟-需求预测与分仓规划

天池大数据竞赛平台上的一道赛题,赛题详情

队伍

  • 队名:左手诗句,右手数据

  • 成员:wepon,Bryan,逝水无痕

解決方案简述

  • 由于原始数据只有1000个item,为了生成更多的训练样本,我们采用了滑窗法,每两周(14天)作为一个窗口,该窗口各个(item,store_ code)的总销量作为label,特征的产生方式如下:统计该窗口前1/2/3/5/7/9/11/14天的各种非类目特征的sum和avg,统计item_id在最近14天的非聚划算支付件数最大值、最小值、标准差,统计其他类目id在最近14天的非聚划算支付件数的sum,avg,std

  • 基于以上构建的训练集,训练了多个回归模型,包括:XGboost、GBDT、RandomForest、SVR(线性核与高斯核),训练时各个分仓是分别建模的,值得一提的是我们将(补少成本+补多成本)作为每个样本的权重(代价敏感学习),在验证集上降低了10多万成本(相比于不设置权重)。此外也训练了时序模型ARIMA。

  • 在得到单模型结果后,再根据补多补少成本进行融合。举例来说,如果某个(item,store_ code)的补少成本大于补多成本,则我们倾向于预测多一点,故取单模型预测结果中的最大值再乘以1.1,反之取单模型预测结果中的最小值再乘以0.9。得到该结果后,与规则进行加权融合,融合系数为0.75model + 0.25rule

  • 规则:预测窗口前两周的销量分别记作week1,week2,对每个(item,store_ code),如果补少成本大于补多成本,则预测为2* max(week1,week2),反之预测为2* min(week1,week2)

  • 单纯规则线上为99万,通过 0.75model + 0.25rule的融合后线上为88万,通过线下验证集计算各个(item,store_ code)的代价,发现全国的一些item产生的代价非常大,Top20个样本产生了大约20万的成本。对其进一步可视化分析,发现大多是上线时间比较短,或者是预测窗口前几周销量波动比较大的item。对这部分item,模型的预测效果非常差,所以我们直接用这些item前两周的销量,结合补多补少成本进行预测(补多>补少,前两周销量乘以0.8,反之乘以1.2)。

代码目录说明

  • data

    存放原始数据,以及预处理后的文件,特征提取后的训练集文件.

  • feature_engineering

    代码包括数据预处理(比如添加字段名、划分补多补少成本)、特征提取(如上所述)。特征提取部分代码是用SQL编写,采用滑窗法提取特征,所以该步骤会比较繁琐。

  • arima

    时序模型ARIMA的相关代码,包括生成数据的Python代码,运行auto.arima的R代码

  • val

    线下验证集的相关代码,包括以上提到的多种回归模型,以及模型融合。采用的是Python的package,包括pandas、xgboost、sklearn、numpy.

  • test

    线上预测集的相关代码,与val一致

  • visualize

    以天为单位,将每个(item,store_ code)的销量可视化,保存为图片,有助于后续分析。

代码运行步骤

  • 预处理和特征提取 feature_engineering文件夹下

    • 先运行preprocess.sql 导入数据并删除双11双12
    • 运行feature_ train_ all.sql提取全国训练数据特征,修改其中滑窗代码,运行10次得到10份数据
    • 运行feature_ train_ fencang.sql提取分仓训练数据特征,修改其中滑窗代码,运行10次得到10份数据
    • 运行combine_ train.sql合并全国和分仓的10份滑窗数据
    • 运行feature_ test_ all.sql提取全国测试数据特征
    • 运行feature_ test_ fencang.sql提取分仓测试数据特征
    • 运行data_ preprocessing.py添加字段名,划分补多补少成本字段
  • 可视化分析 visualize文件夹下

    • 运行visualize.py,生成各个item的销量曲线。
  • 时序预测 arima文件夹下

    • 运行gen_ data.py生成data.csv文件
    • 运行arima.r 对data.csv中的每个(item,store_ code)进行时序预测
  • 线上预测 test文件夹下

    训练多种回归模型,以xgboost为例,分别对分仓1、2、3、4、5以及全国的样本进行训练和预测,运行步骤如下:

    • 运行xgb/xgb_1/xgb.py,对分仓1的样本建立xgboost模型,得到预测结果
    • 运行xgb/xgb_2/xgb.py,对分仓2的样本建立xgboost模型,得到预测结果
    • 运行xgb/xgb_3/xgb.py,对分仓3的样本建立xgboost模型,得到预测结果
    • 运行xgb/xgb_4/xgb.py,对分仓4的样本建立xgboost模型,得到预测结果
    • 运行xgb/xgb_5/xgb.py,对分仓5的样本建立xgboost模型,得到预测结果
    • 运行xgb/xgb_all/xgb.py,对全国的样本建立xgboost模型,得到预测结果
    • 运行xgb/combine.py,将各个分仓的预测结果合并成一个文件

    上面每个分仓的训练时间都非常快,20秒以内训练并预测完成。对于GBDT、RF、SVR这几个回归模型,运行步骤类似,不再赘述。

    • 运行rule/rule.py得到规则预测的结果
    • 运行ensemble.py得到最终融合的结果
  • 线下验证集val文件夹

    线下验证集有两个作用,一个是调节模型参数和融合的系数,另一个是得到线下产生成本比较高的item(运行val/ensemble.py后可以得到该文件)。

    val文件夹下的代码结构与test文件夹下的类似,运行步骤也是一样的。