O2O优惠券复盘(二)

回顾:接O2O优惠券预测复盘(一),对模型进行优化

https://blog.csdn.net/weixin_38966454/article/details/90057156


优化模型

优化模型主要体现在以下几个方面:

 

  1. 特征工程
  2. 机器学习算法
  3. 模型集成

本文将尝试采取机器学习算法-----决策树模型进行优化

建立决策树模型

  1. 使用上面的14个特征
  2. 训练集:20160101-20160515;验证集:20160516-20160615

#划分训练集、验证集
df=dfoff[dfoff['label']!=-1].copy()
train=df[(df['Date_received']<'20160516')].copy()
valid=df[(df['Date_received']>='20160516')&(df['Date_received']<='20160615')].copy()
print('Train Set: \n',train['label'].value_counts())
print('Valid Set: \n',valid['label'].value_counts())

特征


#feature
original_feature=['discount_rate','discount_type','discount_man','discount_jian','distance','weekday_type','weekday']+weekdaycols
print('共有特征:',len(original_feature),'个')
print(original_feature)

建立决策树模型


from sklearn.tree import DecisionTreeClassifier

def check_model(data,predictors):
    classifier=DecisionTreeClassifier(random_state=1)
    parameters={
        'max_leaf_nodes':list(range(2,100)),
        'min_sample_split':[8,10,15]}
   # StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。
    folder=StratifiedKFold(n_splits=3,shuffle=True)
    grid_search=GridSearchCV(
        classifier,
        parameters,
        cv=folder,
        n_jobs=-1,#-1表示使用所有的进程
        verbose=1)
    
    grid_search=grid_search.fit(data[predictors],data['label'])
    
    return grid_search

训练



predictors=original_feature
model=check_model(train,predictors)

验证

对验证集中每个优惠券预测的结果计算 AUC,再对所有优惠券的 AUC 求平均

计算 AUC 的时候,如果 label 只有一类,就直接跳过,因为 AUC 无法计算



#valid_predict
y_valid_pred=model.predict_proba(valid[predictors])
valid1=valid.copy()
valid1['pred_prob']=y_valid_pred[:,1]
valid1.head(5)

计算AUC


vg=valid1.groupby(['Coupon_id'])
aucs=[]
for i in vg:
    tmpdf=i[1]
    if len(tmpdf['label'].unique())!=2:
        continue
    fpr,tpr,thresholds=roc_curve(tmpdf['label'],tmpdf['pred_prob'],pos_label=1)
    aucs.append(auc(fpr,tpr))
print(np.average(aucs))

测试



y_test_pred=model.predict_proba(dftest[predictors])
dftest1=dftest[['User_id','Coupon_id','Date_received']].copy()
dftest1['Probability']=y_test_pred[:,1]
dftest1.to_csv('submit_decisontree.csv',index=False,header=False)
dftest1.head(5)

后续将继续优化并修改代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值