回顾:接O2O优惠券预测复盘(一),对模型进行优化
https://blog.csdn.net/weixin_38966454/article/details/90057156
优化模型
优化模型主要体现在以下几个方面:
- 特征工程
- 机器学习算法
- 模型集成
本文将尝试采取机器学习算法-----决策树模型进行优化
建立决策树模型
- 使用上面的14个特征
- 训练集: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)
后续将继续优化并修改代码