# O2O-Predict-Coupon-Usage
**Repository Path**: jiangbin216/O2O-Predict-Coupon-Usage
## Basic Information
- **Project Name**: O2O-Predict-Coupon-Usage
- **Description**: 天池O2O优惠券使用预测第一赛季部分代码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2020-07-24
- **Last Updated**: 2024-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
赛题地址:[https://tianchi.shuju.aliyun.com/competition/introduction.htm?spm=5176.100065.200879.2.6r6s4g&raceId=231587](https://tianchi.shuju.aliyun.com/competition/introduction.htm?spm=5176.100065.200879.2.6r6s4g&raceId=231587 "O2O优惠券使用预测赛题地址")
[第一赛季数据](https://pan.baidu.com/s/1c1NkUn2)
-------------------
**目录**
[TOC]
-------------------
正式开始做是从十月底开始的,之前参加了新手赛,而这一次正式赛可以说是真正认真做的一次,中间和队友一起学习了很多,也有小小的收获,不管这次成绩如何,以后还有机会。

-------------------
# **数据与评价方式**
赛题提供用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,预测用户在2016年7月领取优惠券后15天以内的使用情况。 使用优惠券核销预测的平均AUC(ROC曲线下面积)作为评价标准。 即对每个优惠券coupon_id单独计算核销预测的AUC值,再对所有优惠券的AUC值求平均作为最终的评价标准。
-------------------
# **解决方案**
提供数据的区间是2016-01-01~2016-06-30,预测七月份用户领券使用情况,即用或者不用,转化为**二分类问题**,然后通过分类算法预测结果。首先就是特征工程,其中涉及对数据集合的划分,包括提取特征的区间和训练数据区间。接着就是从特征区间中提取特征,包括用户特征、商户特征、优惠券特征、用户商户组合特征、用户优惠券组合特征。后期在测试区间提取了当天的前后7/3/1天的领券信息(这里面后七天的特征其实是不能应用于工业应用的,因为实际预测中你无法知道后7/3/1天的领券信息),提升较大。最后使用GBDT、RandomForest、LR进行基于rank的分类模型融合
-------------------
# **数据划分**
最初没有使用数据划分,导致特征中产生数据泄露,以至于在训练数据上效果很好,线下测试也还不错,在线上表现确差强人意,后来划分了之后有明显提升。
| 集合 | 预测区间 |特征区间|
| :------- | :--------| :-- |
| 测试集 |领券:20160701~20160731|领券&消费:20160101~20160630|
| 训练集 | 领券:20160515~20160615
消费:20160515~20160630 |领券:20160101~20160501
消费:20160101~20160515|
并没有划分多个训练集,这一点是要改进之处。
-------------------
# **特征工程**
主要有五大特征类:用户特征、商户特征、优惠券特征、用户商户组合特征、用户优惠券组合特征,赛题包括online和offline的数据,由于里面只有部分用户重合,商户优惠券等并未有重合,个人臆测线上应该是淘宝天猫的购买消费数据,有一定关联,但关系微弱,因此只向其中提取了用户特征。而offline数据集就提取了所有五个特征类。一下是各部分特征:
- 用户特征:u
- 线下领取优惠券但没有使用的次数 u1
- 线下普通消费次数 u2
- 线下使用优惠券消费的次数 u3
- 线下平均正常消费间隔 u4
- 线下平均优惠券消费间隔 u5
- u3/u1 使用优惠券次数与没使用优惠券次数比值 u6
- u3/(u2+u3) 表示用户使用优惠券消费占比 u7
- u4/15 代表15除以用户普通消费间隔,可以看成用户15天内平均会普通消费几次,值越小代表用户在15天内普通消费概率越大 u8
- u5/15 代表15除以用户优惠券消费间隔,可以看成用户15天内平均会普通消费几次,值越大代表用户 在15天内普通消费概率越大 u9
- 领取优惠券到使用优惠券的平均间隔时间 u10
- u10/15 表示在15天内使用掉优惠券的值大小,值越小越有可能,值为0表示可能性最大 u11
- 领取优惠券到使用优惠券间隔小于15天的次数 u12
- u12/u3 表示用户15天使用掉优惠券的次数除以使用优惠券的次数,表示在15天使用掉优惠券的可能,值越大越好。 u13
- u12/u1 F014 表示用户15天使用掉优惠券的次数除以领取优惠券未消费的次数,表示在15天使用掉优惠券的可能,值越大越好。 u14
- u1+u3 领取优惠券的总次数 u15
- u12/u15 F016 表示用户15天使用掉优惠券的次数除以领取优惠券的总次数,表示在15天使用掉优惠券的可能,值越大越好。 u16
- u1+u2 一共消费多少次 u17
- 最近一次消费到当前领券的时间间隔 u18
- 最近一次优惠券消费到当前领券的时间间隔 u19
- 用户当天领取的优惠券数目 u20
- 用户前第i天领取的优惠券数目 u20si
- 用户后第i天领取的优惠券数目 u20ai
- 用户前7天领取的优惠券数目 u21
- 用户前3天领取的优惠券数目 u22
- u22/u21 u23
- u20/u22 u24
- 用户后7天领取的优惠券数目 u25
- 用户后3天领取的优惠券数目 u26
- u26/u25 u27
- u20/u26 u28
- 用户训练、预测时间领取的优惠券数目 u29
- 用户当天领取的不同优惠券数目 u30
- 用户前第i天领取的不同优惠券数目 u30si
- 用户后第i天领取的不同优惠券数目 u30ai
- 用户训练、预测时间领取的不同优惠券数目 u31
- 按照7/4/2分解训练、预测时间,提取此段窗口时间的特征
- 用户7/4/2天领取的优惠券数目 u32_i
- 用户7/4/2天所领取的优惠券优惠率r1/r2/r3/r4排名 u_ri_ranki
- 用户7/4/2天所领取的优惠券优惠率r1/r2/r3/r4排名 u_ri_dense _ranki
- u32_4/u32_7 u33
- u32_2/u32_4 u34
- u32_2/u32_7 u35
- u20/u32_2 u36
- 线上领取优惠券未使用的次数 action=2 uo1
- 线上特价消费次数 action=1 and cid=0 and drate="fixed" uo2
- 线上使用优惠券消费的次数 uo3
- 线上普通消费次数 action=1 and cid=0 and drate="null" uo4
- 线上领取优惠券的次数 uo1+uo3 uo5
- uo3/uo5 线上使用优惠券次数除以线上领取优惠券次数,正比 uo6
- uo3/uo4 线上使用优惠券次数除以线上普通消费次数,正比 uo7
- uo2/uo4线上特价消费次数除以线上普通消费次数 uo8
- 加入训练预测时间前一个月的窗口特征
- 线下领取优惠券但没有使用的次数 uw1
- 线下普通消费次数 uw2
- 线下使用优惠券消费的次数 uw3
- 线下平均正常消费间隔 uw4
- 线下平均优惠券消费间隔 uw5
- uw3/uw1 使用优惠券次数与没使用优惠券次数比值 uw6
- uw3/(uw2+uw3) 表示用户使用优惠券消费占比 uw7
- uw4/15 代表15除以用户普通消费间隔,可以看成用户15天内平均会普通消费几次,值越小代表用户在15天内普通消费概率越大 uw8
- uw5/15 代表15除以用户优惠券消费间隔,可以看成用户15天内平均会普通消费几次,值越大代表用户在15天内普通消费概率越大 uw9
- 领取优惠券到使用优惠券的平均间隔时间 uw10
- uw10/15 表示在15天内使用掉优惠券的值大小,值越小越有可能,值为0表示可能性最大 uw11
- 领取优惠券到使用优惠券间隔小于15天的次数 uw12
- uw12/uw3 表示用户15天使用掉优惠券的次数除以使用优惠券的次数,表示在15天使用掉优惠券的可能,值越大越好。 uw13
- uw12/uw1 F014 表示用户15天使用掉优惠券的次数除以领取优惠券未消费的次数,表示在15天使用掉优惠券的可能,值越大越好。 uw14
- uw1+uw3 领取优惠券的总次数 uw15
- uw12/uw15 F016 表示用户15天使用掉优惠券的次数除以领取优惠券的总次数,表示在15天使用掉优惠券的可能,值越大越好。 uw16
- F01+F02 一共消费多少次 uw17
----------
- 商户特征:m
- 商户一共的消费笔数:m0
- 商户优惠券消费笔数:m1
- 商户正常的消费笔数:m2
- 没有被使用的优惠券: m3
- 商户发放优惠券数目:m3+m1 m4
- 商户优惠券使用率:m1/m4 m5
- 商户在训练、预测时间发行的优惠券数目 m6
- 商户当天发行的优惠券数目 m7
- 商户在训练、预测时间有多少人在此店领券 m8
- 商户在当天有多少人在此店领券 m9
- 按照7/4/2分解训练、预测时间,提取此段窗口时间的特征
- 7/4/2天此商店优惠券发放数目 m10_i
- m9 / m10_7 m11
- m9 / m10_4 m12
- m9 / m10_2 m13
- m10_2 / m10_4 m14
----------
- 优惠券特征:c
- 折扣类的优惠券折扣率 r1
- 满减类优惠券满减金额 r2
- 满减类优惠券减的金额 r3
- 满减类优惠券优惠率 (r2-r3)/r2 r4
- c1+c2 此优惠券一共发行多少张 c0
- 此优惠券一共被使用多少张 c1
- 没有使用的数目 c2
- c1/c0 优惠券使用率 c3
- 优惠力度 c5
- 优惠力度在当天所领取优惠券里面排名 c5_rank
- 优惠力度在当天所领取优惠券里面排名 c5_denserank
- 优惠力度在当天同一店家所领取优惠券里面排名 c5_rankm
- ~~优惠力度在当天所领取优惠券里面百分比排名 c5_rankp~~
- ~~优惠力度在当天同一店家所领取优惠券里面百分比排名 c5_rankmp~~
- 此优惠券在训练、预测时间发行了多少张 c6
- 此优惠券在当天发行了多少张 c7
- ~~领券当天周几 c8~~
- ~~领券当天是否周末 c9~~ c8,c9去掉效果更好了。。。。
- 此优惠券在当天被多少人领过 c10
- 此优惠券在训练、预测时间被多少个人领过 c11
- 此优惠券最后一次领券时间到此领券时间的间隔 c12
- 此优惠券最后一次消费时间到此领券时间的间隔 c13
- 按照7/4/2分解训练、预测时间,提取此段窗口时间的特征
- 7/4/2天此优惠券发放数目 c14_i
- c10 / c14_7 AS c15
- c10 / c14_4 AS c16
- c14_2 / c14_4 AS c17
- c10 / c14_2 AS
----------
- 用户和商户组合特征:um
- 用户在商店总共消费过几次 um0
- 用户在商店使用优惠券几次 um1
- 用户在商店领取优惠券未消费次数 um2
- 用户在商店普通消费次数 um3
- um1/(um1+um2) 用户在此商户优惠券使用率 um4
- um0/(u2+u3) 值大表示用户比较常去的商户 um5
- um1/u3 值大表示用户比较喜欢在那个商户使用优惠券 um6
- 用户在训练、预测时间在此商店领取的优惠券数目 um7
- 用户当天在此商店领取的优惠券数目 um8
- 按照7/4/2分解训练、预测时间,提取此段窗口时间的特征
- 7/4/2天此用户在此商店领取的优惠券发放数目 um9_i
- um8 / um9_7 um10
- um8 / um9_4 um11
- um8 / um9_2 um12
- um9_2 / um9_4 um13
----------
- 用户和优惠券组合特征:uc
- 用户领取的优惠券数目 uc0
- 用户领取未消费的优惠券数目 uc1
- 用户消费了此优惠券的数目 uc2
- uc02/uc0 uc3
- 用户在此期间领取了多少张此优惠券 uc4 partiton by uid, cid
- 用户在当天领取了多少张此优惠券 uc5
- 领取优惠券时间-最后一次使用优惠券时间 uc6
- uc6/ u5 uc7 正比
- 用户前第i天领取的此优惠券数目 uc5si
- 用户后第i天领取的此优惠券数目 uc5ai
- 用户前7天领取的此优惠券数目 uc8
- 用户前3天领取的此优惠券数目 uc9
- uc9/uc8 uc10(若u21为0,则为1)
- uc4/uc9 uc11
- 用户后7天领取的此优惠券数目 uc12
- 用户后3天领取的此优惠券数目 uc13
- uc13/uc12 uc14
- uc4/uc13 uc15
- 按照7/4/2分解训练、预测时间,提取此段窗口时间的特征
- 7/4/2天此用户在此商店领取的优惠券发放数目 uc16_i
- 用户前后2/4/7领取的优惠券优惠率排名 uc17_i
-------------------
# **算法及模型融合**
最初使用GBDT和RF两种模型,GBDT效果优于RF,后期使用了多个GBDT,分别使用不同的参数、不同的正负样本比例以rank的方式进行多模型的融合,效果有微小提升,但是由于计算量的限制没有进一步展开。
## **模型融合**
由于评估指标是计算每个coupon_id核销预测的AUC值,然后所有优惠券的AUC值平均作为最终的评估指标,而rank融合方式对AUC之类的评估指标特别有效,所以采用此方法,公式为: