天池新人实战赛o2o优惠券使用预测五(第一个预测的程序)

扑腾了好久,总算出了第一个能预测的程序:
思路很简单,使用了下列5个特征:

#用户相关特征:
#FUser1 线下领取优惠券后消费次数
#FUser2 线下消费总次数
#商户相关特征:
#FMer1 线下总领取优惠券次数
#FMer2 线下总领取优惠券后消费次数
#FMer3 线下总消费次数

预测模型采用随机森林。
下面是提取User特征的代码:

OffTrain = pd.read_csv('data/ccf_offline_stage1_train.csv')
OffTrain.head()
#把其中出现的所有的用户ID都统计出来
FUser = OffTrain[['User_id']]
print("FUser.shape=",FUser.shape)
FUser.drop_duplicates(inplace=True)
OffTrainUser = FUser.shape[0]#总共有539438个独立用户
print("OffTrainUser=",OffTrainUser)
FUser = FUser.reset_index(drop=True)
#读取正样本
OffTrainP = pd.read_csv('data\OffTrainP.csv')
OffTrainPNumber = OffTrainP.shape[0]#总共75382个正样本
print("OffTrainPNumber=",OffTrainPNumber)
OffTrainPperUser = OffTrainPNumber/OffTrainUser#每个独立用户可能购买的几率是13.974173%
print("OffTrainPperUser=",OffTrainPperUser)
#寻找同样的ID在P样本中出现的次数
t = OffTrainP[['User_id']]
t['FUser1']=1#特征1
t = t.groupby('User_id').agg('sum').reset_index()#求和
FUser = pd.merge(FUser,t,on=['User_id'],how='left')
print(FUser.head(5))
#把所有NaN填充为0
FUser = FUser.fillna(0)
print(FUser.head(5))
t = OffTrain[OffTrain['Date'] != "null"]
t = t[['User_id']]
t['FUser2']=1#特征2
t = t.groupby('User_id').agg('sum').reset_index()#求和
FUser = pd.merge(FUser,t,on=['User_id'],how='left')
FUser = FUser.fillna(0)
print(FUser.head(5))
print(FUser.FUser2.describe())
FUser.to_csv('data/FUser.csv',index=False,header=True)

提取商户相关特征:

#读取线下训练数据
OffTrain = pd.read_csv('data/ccf_offline_stage1_train.csv')
OffTrain.head()
#把线下商户ID都提取出来
FMer = OffTrain[['Merchant_id']]
#print("FMer.shape=",FMer.shape)
#去掉重复的
FMer.drop_duplicates(inplace=True)
#print("FMer.shape=",FMer.shape)
#重新建立索引
FMer = FMer.reset_index(drop=True)
t = OffTrain[OffTrain['Coupon_id'] != "null"]#取出所有有领取优惠券的部分
#print(t.shape)
t = t[['Merchant_id']]
t['FMer1']=1#特征1
t = t.groupby('Merchant_id').agg('sum').reset_index()#求和
#print(t.head())
FMer = pd.merge(FMer,t,on=['Merchant_id'],how='left')
FMer = FMer.fillna(0)
print(FMer.head())
#FMer2 线下总领取优惠券后消费次数
t = OffTrain[OffTrain['Coupon_id'] != "null"]#取出所有有领取优惠券的部分
print(t.shape)
t = t[t['Date'] != 'null' ]
print(t.shape)
t = t[['Merchant_id']]
t['FMer2']=1#特征2
t = t.groupby('Merchant_id').agg('sum').reset_index()#求和
#print(t.head())
FMer = pd.merge(FMer,t,on=['Merchant_id'],how='left')
FMer = FMer.fillna(0)
print(FMer.head())
#FMer3 线下总消费次数
t = OffTrain[OffTrain['Date'] != "null"]#取出所有有消费的部分
print(t.shape)
t = t[['Merchant_id']]
t['FMer3']=1#特征3
t = t.groupby('Merchant_id').agg('sum').reset_index()#求和
#print(t.head())
FMer = pd.merge(FMer,t,on=['Merchant_id'],how='left')
FMer = FMer.fillna(0)
print(FMer.head())
FMer.to_csv('data/FMer.csv',index=False,header=True)

使用随机森林做预测模型

#读取特征文件
FMer = pd.read_csv('data/FMer.csv')
FUser = pd.read_csv('data/FUser.csv')
#读取样本数据
OffTrainN = pd.read_csv('data/OffTrainN.csv')
OffTrainP = pd.read_csv('data/OffTrainP.csv')
#加入FLag区分P和N
OffTrainN['Flag'] = 0
OffTrainP['Flag'] = 1
#建立特征列
print(OffTrainN.shape)
OffTrainN = pd.merge(OffTrainN,FUser,on=['User_id'],how='left')
print(OffTrainN.shape)
OffTrainN.head()
print(OffTrainN.shape)
OffTrainN = pd.merge(OffTrainN,FMer,on=['Merchant_id'],how='left')
print(OffTrainN.shape)
OffTrainN.head()
#建立特征列
print(OffTrainP.shape)
OffTrainP = pd.merge(OffTrainP,FUser,on=['User_id'],how='left')
print(OffTrainP.shape)
OffTrainP.head()
print(OffTrainP.shape)
OffTrainP = pd.merge(OffTrainP,FMer,on=['Merchant_id'],how='left')
print(OffTrainP.shape)
OffTrainP.head()
#生成Flag数组
OffTrainFlagP = OffTrainP['Flag'].values
print(OffTrainFlagP)
print(OffTrainFlagP.shape)
OffTrainFlagN = OffTrainN['Flag'].values
print(OffTrainFlagN)
print(OffTrainFlagN.shape)
#合并Flag
OffTrainFlag = np.append(OffTrainFlagP,OffTrainFlagN)
print(OffTrainFlag)
print(OffTrainFlag.shape[0])
#生成特征数组
OffTrainFeatureP = OffTrainP[['FUser1','FUser2','FMer1','FMer2','FMer3']].values
print(OffTrainFeatureP)
print(OffTrainFeatureP.shape)
OffTrainFeatureN = OffTrainN[['FUser1','FUser2','FMer1','FMer2','FMer3']].values
print(OffTrainFeatureN)
print(OffTrainFeatureN.shape)
#合并特征
OffTrainFeature = np.append(OffTrainFeatureP,OffTrainFeatureN,axis=0)
print(OffTrainFeature)
print(OffTrainFeature.shape)
rf=RandomForestRegressor()#这里使用了默认的参数设置  
rf.fit(OffTrainFeature,OffTrainFlag)#进行模型的训练  
temp = rf.predict(OffTrainFeature)
start = time.time()
err = 0
for i in range(OffTrainFeature.shape[0]):
    t = temp[i]-OffTrainFlag[i]
    if (t>0.5)|(t<-0.5):
        err = err +1
err = err/OffTrainFeature.shape[0]
end = time.time()
print(end-start)
print(1-err)
#读取测试集
Test = pd.read_csv('data/ccf_offline_stage1_test_revised.csv')
print(Test.shape)
Test = pd.merge(Test,FUser,on=['User_id'],how='left')
print(Test.shape)
Test = pd.merge(Test,FMer,on=['Merchant_id'],how='left')
Test['Flag'] = 0.0
print(Test.shape)
print(Test.head())
Test = Test.fillna(0)
TestFeature = Test[['FUser1','FUser2','FMer1','FMer2','FMer3']].values
print(TestFeature.shape)
print(TestFeature)
start = time.time()
temp = rf.predict(TestFeature)
end = time.time()
print(end-start)
Test['Flag'] = temp
Test.head()
Test.to_csv('data\sample_submission20171225.csv',columns=['User_id','Coupon_id','Date_received','Flag'],index=False,header=False)

最终得到训练集的正确率:0.9584821538771193
天池上提交结果的正确率:0.57166541,好歹比蒙的结果要好,证明了整个方法流程是正确的,下面就是怎么样提取更加丰富的特征,使用更加合理的方法了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
O2O优惠券使用预测数据集 背景描述 随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以O2O(Online to Offline)消费最为吸引眼球。 据不完全统计,O2O行业估值上亿的创业公司至少有10家,也不乏百亿巨头的身影。O2O行业天然关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录,因而成为大数据科研和商业化运营的最佳结合点之一。 以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言,滥发的优惠券可能降低品牌声誉,同时难以估算营销成本。 个性化投放是提高优惠券核销率的重要技术,它可以让具有一定偏好的消费者得到真正的实惠,同时赋予商家更强的营销能力。 本数据集为研究人员提供了O2O场景相关的丰富数据,通过分析建模精准预测用户是否会在规定时间内使用相应优惠券。 数据说明 注意: 为了保护用户和商家的隐私,所有数据均作匿名处理,同时采用了有偏采样和必要过滤。 offline_train.csv | 用户线下消费和优惠券领取行为表 字段 说明 User id 用户ID Merchant id 商户ID Coupon id 优惠券ID:null表示无优惠券消费,此时 Discount_rate 和 Date_received 字段无意义 Discount rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y。单位是元 Distance user经常活动的地点离该 merchant 的最近门店距离是 x * 500米(如果是连锁店,则取最近的一家门店),x\in[0,10];null 表示无此信息,0表示低于500米,10表示大于5公里; Date received 领取优惠券日期 Date 消费日期:如果 Date=null & Coupon_id != null,该记录表示领取优惠券但没有使用,即负样本;如果 Date!=null & Coupon_id = null,则表示普通消费日期;如果 Date!=null & Coupon_id != null ,则表示用优惠券消费日期,即正样本; online_train.csv | 用户线上点击/消费和优惠券领取行为表 字段 说明 User_id 用户ID Merchant_id 商户ID Action 0 点击, 1购买,2领取优惠券 Coupon_id 优惠券ID:null表示无优惠券消费,此时 Discount_rate 和 Date_received 字段无意义。“fixed”表示该交易是限时低价活动。 Discount_rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y;“fixed”表示低价限时优惠; Date_received 领取优惠券日期 Date 消费日期:如果 Date=null & Coupon_id != null,该记录表示领取优惠券但没有使用,即负样本;如果 Date!=null & Coupon_id = null,则表示普通消费日期;如果 Date!=null & Coupon_id != null,则表示用优惠券消费日期,即正样本; offline_test.csv | 用户O2O线下优惠券使用预测样本 字段 说明 User_id 用户ID Merchant_id 商户ID Coupon_id 优惠券ID Discount_rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y. Distance user经常活动的地点离该merchant的最近门店距离是 x * 500米(如果是连锁店,则取最近的一家门店),x\in[0,10];null表示无此信息,0表示低于500米,10表示大于5公里; Date_received 领取优惠券日期 研究人员需要为上述预测预测出15天内用户线下使用优惠券的概率,其中 user_id, coupon_id 和 date_received 均来自上述预测样本, 而 Probability 为预测值。 字段 说明 Coupon_id 优惠券ID Date_received 领取优惠券日期 Probability 15天内用券概率,需预测给出 问题描述 数据提供了用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,可以预测用户在2016年7月领取优惠券后15天以内的使用情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值