赛题解读

赛题介绍:https://tianchi.aliyun.com/competition/entrance/231573/introduction

数据集介绍及下载:https://tianchi.aliyun.com/competition/entrance/231573/information

代码见:https://github.com/Sendren/The-Purchase-and-Redemption-Forecast-Challenge-baseline.git

阅读完赛题介绍后,总结了一下这个赛题的目的就是预测未来一个月,每天余额宝总的的转入金额和转出金额。是一个回归问题

下载解压数据集后有五个表格。提供了很多的信息,一开始看到这么多信息让我无从下手啊!目前这个阶段先看下,熟悉下五个表中有什么吧~~ 后面通过数据探索阶段来熟悉变量间的关系!
在这里插入图片描述
这里的评价标准有点意思~看图自己领悟
在这里插入图片描述

赛题解析

  • 类型:回归预测
  • 标签:由于赛题没有提供,所以要根据其他数据统计每天的申购总额和赎回总额
  • 解决方案:时间序列预测问题方案
  • 基准方法:临近数据、中位数等 时间序列规则与模型 抽取特征、利用机器学习方法建模

数据分析与探索

本来准备把代码也贴出来,但是做了会发现代码又臭又长,贴出来意义不大,所以这一张准备写一些数据探索的从零如何上手。

周特征分析

由于本次预测的目标是每日的余额宝的申购和赎回总量,是一个时间序列,所以先探索一下时间因素和它的关系。

画出2014年4-8月的时序图。

在这里插入图片描述从图中得出以下结论:

  1. 月末时赎回高于购买(月末时更需要钱)
  2. 申购与赎回看起来有关联
  3. 每月有4个波峰、4个波谷

周一到周日申购总量和赎回总量的差异

用小提琴图和分布图画出一周中申购赎回的分布情况(还可以画出中位数图、箱线图),发现星期日到星期四较高,星期五六较低,这可能是与余额宝收益和赎回计算方式有关。

在这里插入图片描述在这里插入图片描述#### 构造星期变量,分析与申购总量和赎回总量间相关性
对weekday进行onehot encoding,然后做一个与申购赎回的相关系数图。由于weekday是一个定序变量,申购赎回是一个定距变量,所以要用Spearman相关系数。参考下图:
在这里插入图片描述
出图了,发现线性相关性挺弱的
在这里插入图片描述#### 测试特征与标签的独立性

MVTest可以用这个github上的文件,也可以用pip下载,但是有些源找不到这个包 Ref: https://github.com/ChuanyuXue/MVTest
在这里插入图片描述
发现p—value小于0.05,说明我们错误拒绝H0假设的概率为0.01,所以可以拒绝H0假设,所以测试特征与标签存在依赖关系。
知识补充:
在这里插入图片描述

月份特征分析

每月申购总额与赎回总额的分布特点

用sns.kdeplot()画出每月申购赎回概率分布,发现13年7-10月与其他月份差异明显。
在这里插入图片描述
在这里插入图片描述

日期特征分析

利用直方图分析14年8月份申购总额与赎回总额,通过下面三张图,得出一些结论。

  1. 每周开始倾向购买,每周中期倾向于赎回
  2. 周末不倾向交易
  3. 赎回波动性比购买大

在这里插入图片描述在这里插入图片描述在这里插入图片描述

利用直方图分析13年9月份申购总额与赎回总额,通过下面三张图,发现16号——购买峰值(中秋节前);28号——赎回峰值(国庆节前)11号和25号——赎回峰值(周三),19-21号(中秋节);28-30号(国庆节),说明节假日对申购和赎回都有影响。所以我们重点分析下节假日。
在这里插入图片描述
在这里插入图片描述

分析节假日及特殊日期

过节时

选了这几个假期来进行
The QingMing festerval (April.5 – April.7)
The Labour day (May.1 – May.5)
The DuanWu festeval (May.31 – June.2)
The MidAutumn festeval (Sep.6 – Sep.8)
与平时均值对比一下
在这里插入图片描述与同时其非假日对比

在这里插入图片描述结论是假日申购和赎回量都比平时小,618没什么变化,这个可能是因为淘宝支持余额宝付款的缘故。

过节前后

画出过节和节前后交易量变化,意料之中的是节前交易量下降,节后交易量上升。
在这里插入图片描述至此,有关时间的探索告一段落,下面对别的数据进行探索。

异常数据的探索(大额交易)

将单笔交易大于100万的金额,视为大额交易。
将数据区分为大额交易和小额交易,画图对比,发现小额交易的日申购赎回总额都要小于大额交易的日总额,还是有钱人多啊!
小额交易的购买要大与赎回,穷人喜欢存钱。
14年5月下旬后,大额交易的赎回大于购买(资本套现)

在这里插入图片描述
画出小额和大额交易星期类型的箱型图,大额交易更不愿在周五发生
在这里插入图片描述

分析用户交易纪录表中其他变量

做一下‘total_purchase_amt’,‘total_redeem_amt’,‘report_date’, ‘tBalance’, ‘yBalance’, ‘direct_purchase_amt’, ‘purchase_bal_amt’, ‘purchase_bank_amt’,‘consume_amt’, ‘transfer_amt’, ‘tftobal_amt’,‘tftocard_amt’, ‘share_amt’这些变量的相关性图。用的是皮尔森系数。

在这里插入图片描述

对于银行及支付宝利率的分析

画出银行及支付宝利率与标签的时序图

拆解利率与交易量关联

在这里插入图片描述

在这里插入图片描述

余额宝收益与交易量关联

在这里插入图片描述在这里插入图片描述可以总结出:

The influence of share is more likely to act on Purchase
The influence of bank rate is more likely to act on Redeem
The influence of share rate is for short
The influence of bank rate is for long

分析用户信息

分析各城市交易量

在这里插入图片描述

分析男、女交易量差异

在这里插入图片描述
在这里插入图片描述

分析星座

哈哈,这个好扯,用屁股想都知道没啥关系
在这里插入图片描述

结论

based on above analysis, we can simply find three features:

the weekday
is it weekend
is it holidy
the distance from the start of week(monday)
the distance from the end of week(sunday)
the distance from the holiday centre(centre of QingMing DuanWu Labour ZhongQiu)
the distance from the start of month
the distance from the end of month
the mean/max/min value of the same week in last month
the value in last day of last month
the city
user’s gender

时间序列规则与baseline

基本规则法快速入门

原文点击这里

在这里插入图片描述
看到这基本就明白什么是时间序列规则了。上文中的周期应该怎么确定呢?有下面几个tip

  • 周期一般为(一周、一月)
  • 确定组成一个周期的元素(周1-周日、1号-31号)
  • 结合STL分解观察周期变化
  • 缺点:不考虑节假日、突发事件等

那么对于本赛题,怎么应用时间序列规则来解呢?祥见下图,总之就是求出每天的周期因子,再乘以对应号数的均值,得到的就是预测值。

在这里插入图片描述

三种时间序列规则的资金流入流出预测

下面用三种时间序列规则做预测

  1. 以星期为周期的中位数预测
  2. 基于周期因子(以星期为周期)的预测
  3. 基于周期因子(以月份为周期)的预测

最后线上效果135.51在这里插入图片描述

特征工程

从前面数据分析和探索我们可以找出一些候选特征。

基于《数据分析与探索》提取是/否类型的特征(稀疏特征)

  • 是否周一、是否周二……是否周日
  • 与节假日相关的特征——是否节假日、是否节假日第一天、是否节假日最后一天等等
  • 与月初、月末相关的特征

在这里插入图片描述
筛选掉正负样本数量严重不平衡的,做一下相关性分析,去掉相关性小的(如<0.1).

考虑到节假日、月初、月末等的特殊性,提取相关距离特征

  • 距放假的天数、距上班的天数等
  • 距月初天数、距月中天数、距星期日天数等
    在这里插入图片描述做点线图和相关性图看对标签量的影响。

考虑距波峰、波谷的天数

  • 如何确定波峰、波谷?(以星期为周期)
  • 申购总额时序图

从个月的申购时序图,可以找出每月的波峰波谷是在那(赎回时序图也一样)
在这里插入图片描述下图是统计出来的是各月波峰波谷的时间。
在这里插入图片描述
结果发现相关性还挺强的
在这里插入图片描述

添加《时间序列规则与baseline》中的周期因子

  • 星期周期因子
  • 月份周期因子
    发现 赎回周期因子也与申购总额相关
    在这里插入图片描述

淘汰特征

由于前面构造了好多特征,所以要筛选掉一些

  • 利用MV test判断弱相关特征是否与因变量存在非线性关联
  • 利用相关性分数来筛选
  • 采用Shap方法分析特征重要性,并排序
  • 采用Permutation Importance方法分析特征重要性,并排序
  • 最后,对不同方法的排序列表前Top K取交集

模型训练与构建

常用的回归预测模型:

  • 常用回归模型
  • 线性回归
  • 决策树
  • 随机森林
  • 梯度提升树:Gradient Boosting Tree、Xgboost、LightGBM、Catboost

基本上梯度提升树模型可以做到其他传统机器模型的效果,现在竞赛用的除了神经网络,其余基本用的都是Xgboost及其变种。

模型参数的设置

  • 不建议将精力放在调参;黔驴技穷时再调参
  • 仅需大体的设置主要参数即可,例如,Xgboost,learning_rate=0.1,nround=200,max_depth=6

下面是各各机器学习模型的得分,明显看出LGBM分数最好,但是线上效果不好,过拟合的原因可能是因为模型复杂,数据量又少。相比LR的线上得分缺比较高。
在这里插入图片描述

模型融合

  • 加权:算数平均数、几何平均数、调和平均数等
  • Stacking:交叉验证;类似于深度学习
  • Blending:简单划分数据集;相当于只做Stacking的一折
  • 模型平均
  • 时序方法/模型与机器学习的融合

这里没有做演示,后面再试试吧~

总结

参加这次活动收获还是挺多的。

  1. 社区的重要性。一个人埋头学习的效果相当于闭门造车,遇到问题了不能讨论,学到什么水平自己也没什么底。

  2. 时间序列的挖掘问题解法。有几种方法,1、规则法、统计学方法(如ARIMA)以及机器学习方法。
    收获最大的就是对于机器学习方法处理时间序列预测的问题。一般需要预测一星期或者一个月后的标签。但是一个月后的很多信息我们是不知道的,如题中的当天银行利率,这些对我们解决本题问题没有一点帮助,因为我们不可能知道一个月后的利率是多少。所以我们构造的因变量必须是已知的,如上文中是否周末、是否节假日、距离波峰波谷这些。

  3. 赛题 提供的那么多信息,很多是永不上的,不必因为看到这么多的数据和类目害怕。冷静下来抓住关键少数!

  4. 作比赛还是很费时费力的!


版权声明:本文为qq_37501211原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_37501211/article/details/108111332