引言
在O2O优惠卷预测案例中,我们会把所有的数据分为训练数据集和测试数据集,训练数据集和测试数据集是用于训练和验证模型性能的两个不同数据集。
- 训练数据集(Training Dataset):训练数据集用于模型的参数估计和学习过程。它是用来训练和拟合机器学习模型的数据集。训练数据集包含了已知的输入特征以及相应的目标值或标签,模型使用这些数据来学习特征与目标之间的关系。通过迭代训练,模型会调整自身的参数以最大程度地减小预测和实际标签之间的误差。
- 测试数据集(Testing Dataset):测试数据集用于评估训练好的模型在未知数据上的性能和泛化能力。测试数据集通常包含与训练数据集相似的特征,但是不包含目标值或标签,因为我们想要使用模型进行预测并将其与真实的目标值进行比较。通过对测试数据集的预测结果与真实标签进行比较,可以评估模型的准确性、精确度、召回率等性能指标。
训练数据集和测试数据集的目的是为了验证模型在未知数据上的表现,以评估其泛化能力。它们需要从整体数据中随机选择,并且应该是相互独立的样本,以确保评估结果客观有效。一般而言,训练数据集占总数据集的大部分(例如 70-80%),而测试数据集占总数据集的一小部分(例如 20-30%),具体比例取决于具体问题和数据集规模。
需要注意的是,为了更好地评估模型的性能,还可以使用交叉验证(Cross Validation)方法,将数据集分割为多个训练和测试子集,多次训练和测试模型,并综合评估结果。这有助于更准确地估计模型的泛化能力和鲁棒性。
一、项目背景与目标
1、项目背景
- 随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以O2O(Online to Offline)消费最为吸引眼球。
- O2O行业天然关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录。
- 以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。
- 随机投放的优惠券会对多数用户造成无意义干扰,且影响商家声誉。
- 个性化投放是提高优惠券核销率的重要技术。
2、项目目标
- 精准预测用户是否会在规定时间内使用相应优惠券。
二、数据说明
- 提供用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,预测用户在2016年7月领取优惠 券后15天以内的使用情况。
- 为了保护用户和商家的隐私,所有数据均作匿名处理,同时采用了有偏采样和必要过滤。
Table 1: 用户线下消费和优惠券领取行为
ccf_offline_stage1_train.zip
Table 2:用户O2O线下优惠券使用预测样本
ccf_offline_stage1_test_revised.csv
Table 3:选手提交文件字段
sample_submission.csv
三、数据预处理
1、正样本
- Date!=null & Coupon_id != null,且Date-Date_received <= 15天。
2、负样本
- Date=null & Coupon_id != null(领取了优惠券但没有使用)
- Date!=null & Coupon_id != null,但是Date-Date_received > 15天
3、普通样本
- 其他用户
4、处理特征值 Discount_rate
- 300:20变为1-20/300=0.93
5、处理门槛
- 300:20的门槛为300
6、处理时间——从领取到消费的天数
- 领取时间为2022-02-12,消费时间为2022-02-20,则最后结果为8
四、特征构建
- 哪些因素对你是否使用商家赠送的优惠券有影响?
折扣力度、店铺距离、商品品牌、商家知名度…… - 特征构建方向:
1. 和优惠券相关
2. 和商家相关
3. 和用户相关
4. 交互关系 - 用户特征
1、用户在商家15天内使用优惠卷的次数
2、用户在商家领取优惠卷数
3 、用户在商家消费的次数(使用优惠卷和不使用优惠券)
4、 用户15天内在此商户核销率:使用的次数 / 消费的次数
5、用户核销过优惠卷的不同商家数量(对商家去重)
6、用户优惠券使用间隔天数(最小天数、平均天数)(从领券到消费的天数)
7、用户-商家领券消费距离(最大/最小/平均距离)
8、用户核销优惠券的平均门槛 - 商家特征
1、商户合计被消费次数
2、商户被领券次数
3、商户被领券消费次数
4、商户用券率 : 商户被领券消费次数 / 商户合计被消费次数
5、商户核销率 : 商户被领券消费次数 / 商户被领券次数
6、此商户中所有消费者15天内核销总数、核销率 :此商户中所有消费者15天内核销总数 / 商户被领券次数
7、商户-消费者距离(max/mean已核销的)
8、商家已使用的优惠券门槛(平均、最小、最大)
9、此商家中各个优惠券被使用的平均间隔时间和最少间隔时间(从领券到消费的天数) - 优惠券特征
1、优惠价的流行度
2、各类优惠券type被领取次数
3、各类优惠券type被使用次数
4、各类优惠券type核销率 : 各类优惠券type被使用次数 / 各类优惠券type被领取次数
5、各类优惠券type15天内核销数量
6、各类优惠券type15天内核销率 : 各类优惠券type15天内核销数量 / 各类优惠券type被领取次数
7、各类优惠券type被使用的距离(max/mean)
8、各类优惠券type被使用的时间间隔(mean/min)(从领券到消费的天数) - 用户——优惠券联合特征
1、用户领取特定优惠券次数
2、用户使用特定优惠券次数
3、用户特定优惠券核销率
4、15天核销次数
5、15天核销率
6、时间间隔 - 用户——商户联合特征
1、用户在特定商家消费次数
2、用户在特定商家领取优惠券次数
3、用户在特定商家使用优惠券次数
4、用户在特定商家优惠券核销率
5、用券率
6、15天核销次数
7、15天核销率
8、时间间隔 - 商户——优惠券联合特征
1、商户领取特定优惠券次数
2、商户使用特定优惠券次数
3、商户特定优惠券核销率
4、15天核销次数
5、15天核销率
6、时间间隔 - 用户——商户——优惠券联合特征
1、用户-商户-优惠券-领取次数
2、用户-商户-优惠券-使用次数
3、商户特定优惠券核销率
4、15天核销次数
5、15天核销率
五、特征拼接
把上面提取出来的特征拼接到测试集和训练集中
训练集:
datasets=pd.merge(datasets,Merchant_sale_sum,on=‘Merchant_id’,how=‘left’)
测试集:
datasets_yc=pd.merge(datasets_yc,Merchant_sale_sum,how=‘left’,on=‘Merchant_id’)
对此训练集和测试集前后填充空值
#处理空值
datasets_yc.fillna(method='ffill',inplace=True)
datasets_yc.fillna(method='bfill',inplace=True)
六、模型训练
对feature参数,在此之前所有提取出来的特征值都加进去,再调用这个函数
#建模函数
def get_train_model(datasets=datasets,model=GradientBoostingClassifier(n_estimators=100,max_depth=3),features=['Discount_rate','Distance'],label='label'):
#4.提取正样本和负样本组合成新的样本
data_pro = datasets[datasets[label]==1]
data_neg = datasets[datasets[label]==0]
# datas = data_pro.append(data_neg)
datas = pd.concat([data_pro,data_neg],axis =0) #按列连接
datas.reset_index(inplace=True)
#5.提取两列特征值进行建模
X = datas[features]
y = datas[label]
#划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)
model = model
model.fit(x_train,y_train)
pre = model.predict_proba(x_test)[:,1]
#评估模型
auc = roc_auc_score(y_test,pre)
return model,auc
七、模型评估与预测
调用get_predict函数,并把结果存入result_final12.csv中
#预测函数
def get_predict(datas=datasets_yc,model=model,features=['Discount_rate','Distance'],outfiles='result01.csv'):
data_yc = datas[features]
pre_yc = model.predict_proba(data_yc)[:,1]
result = datas[['User_id','Coupon_id','Date_received']]
result['probability'] = pre_yc
#保存为提交所用的csv文档
result.to_csv(outfiles,index=None,header=None)