一、背景
通过分析用户线上线下的消费行为,建立模型,预测现阶段用户是否会在规定时间内使用相应优惠券,以便商家个性化投放,提高优惠券核销率。
数据为用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,预测用户在2016年7月领取优惠券后15天以内的线下使用情况。
我们的目标是要预测用户优惠券的线下使用情况,线上数据我们重点关注与用户相关的特征(是作为线下数据的一个辅助),线下我们关注的特征数据就比较多了:用户特征、商户特征、优惠券特征、用户商户组合特征、用户优惠券组合特征。
数据分析:
1、预测集中的用户,是线下训练数据集里出现过的用户,也就是老用户。
2、根据经验,我们知道活跃用户更可能使用优惠券,活跃商家所发出的优惠券更可能被使用,用户对某个商家的喜爱程度越高越可能使用这个商家发的优惠券
3、用户在周末更有时间更可能使用优惠券
4、预测集中的商家,几乎都是线下训练数据集中出现过的商家。
二、数据预处理
本题所有数据记录的时间区间是2016.01.01至2016.06.30,需要预测的是线下2016年7月份用户领取优惠劵后15天内是否核销。根据这两份数据表,我们首先需要对数据集进行划分(采用滑窗的方式),特征区间为3.5个月,预测区间为一个月。要保证滑到最后,测试集的预测区间正好是7月。也可以用其他的方式划分,特征区间越小,得到的训练数据集越多。
特征区间(提取feature) | 预测区间(预测label) | |
---|---|---|
训练集 | 20160101~20160413 | 20160414~20160514 |
验证集 | 20160201~20160514 | 20160515~20160615 |
测试集 | 20160315~20160630 | 20160701~20160731 |
为什么要这样划分呢?第一,划分训练集和验证集,方便我们交叉验证;第二,我们的训练和预测是与时间有关系的,如果是用train_test_split随机划分,可能会导致训练数据是6月份,而预测数据却是5月份,这与现实是不符合的,这就是数据泄露:
数据泄露就是说用了不该用的数据,比如
(1)在训练模型时,利用了测试集的数据、信息
(2)在当前使用了未来的数据
(3)在交叉验证进行调参时,使用了验证集的信息参与模型建立
具体说下第三点,比如对特征进行标准化,正确的方法应该是在训练集上标准化,然后应用到验证集上,而非先标准化,再划分验证集。再比如说,要对数据进行pca降维,应该是在训练集上pca,然后作用到验证集上,而非对整个数据集进行pca。通常都忽略了这一点。
如果数据集划分的不好,可能会导致在训练数据上效果很好,线下测试也还不错,但是在线上表现却不好。
注意数据集的划分是不能只根据Date_Received(优惠券领取日期)来划分,否则划分出来的数据都是有优惠券的用户,没有领取优惠券的用户数据都被丢弃了。
因为我们要预测的是用户领取优惠券之后的使用情况,所以,预测区间可以根据用户领取优惠券时间来划分,特征区间麻烦一点,如果消费时间不为空,通过消费时间划分;如果消费时间为空,则根据优惠券领取时间划分。(不能单纯的用领取时间或消费时间划分,因为这两个时间都可能是空)
测试集的预测区间的划分是从ccf_offline_stage1_test_revised.csv中读取的。
#划分特征区间数据集,通过领取时间和消费时间
def filter_feature_data(data,start_time,end_time):
return data[((data['Date'] > start_time) & (data['Date'] < end_time))|((data['Date'