https://github.com/wepe/cainiao-demandforecast-storageplaning
1st Place Season one & 6th Place Season two
https://github.com/wepe/cainiao-demandforecast-storageplaning
Last synced: about 1 year ago
JSON representation
1st Place Season one & 6th Place Season two
- Host: GitHub
- URL: https://github.com/wepe/cainiao-demandforecast-storageplaning
- Owner: wepe
- Created: 2016-10-21T08:32:00.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2017-03-20T15:00:06.000Z (over 9 years ago)
- Last Synced: 2023-11-07T18:38:27.628Z (over 2 years ago)
- Language: Python
- Size: 73.2 KB
- Stars: 141
- Watchers: 11
- Forks: 95
- Open Issues: 5
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# 菜鸟-需求预测与分仓规划
天池大数据竞赛平台上的一道赛题,[赛题详情](https://tianchi.shuju.aliyun.com/competition/introduction.htm?spm=0.0.5678.0.CXxahU&raceId=231530)。
## 队伍
- 队名:左手诗句,右手数据
- 成员: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文件夹下的类似,运行步骤也是一样的。