这是CDA数据分析网站的一个赛题,A公司希望发掘用户购买产品的行为习惯,建立产品精准营销模型,对有意向的客户进行精准营销,增加收入,减少开支。将通过混淆矩阵(Confusion matrix)来评价分类模型的准确率,准确率越高,说明正确预测出响应营销效果越好。
本次实战以官方公布的评分标准accuracy为目标进行参数调优与建模。又探索了在不同成本收益模型下,选择不同的模型评估指标,最终得到最高的潜在盈利预测。
附赛题网址:https://contest.cda.cn/info/id/6.
重要事情说三遍~
想听我讲案例,请点这里,进入B站
想听我讲案例,请点这里,进入B站
想听我讲案例,请点这里,进入B站
(一)赛题简介及数据预处理
(二)数据探索分析
(三)模型构建与评估
(四)预测与排名
(五)成本收益分析与模型重构
(一)数据预处理(算法填充缺失值)
# 填充
cates=['用户地区', '性别', '使用累计时间','产品服务使用量', '是否使用信用卡付月费','是否为活跃用户']
x_cates=['产品使用分数', '年龄', '点数余额','估计薪资']
dummies_f7=[ region_features,sex_features,usetime_features,service_features,credict_features,active_features,fill_data[x_cates] ]
for i in range(6):
print('填充有缺失值的特征:',cates[i])
print('第一步:构造特征与标签--------------------')
Y=y_data[cates[i]] #Serise
Y_train=Y[Y!='99'] #没有缺失值,用于建模
Y_test=Y[Y=='99'] #缺失值,待预测
objs=[ region_features,sex_features,usetime_features,service_features,credict_features,active_features,fill_data[x_cates] ]
df=pd.concat(objs,axis=1)
ob=list(dummies_f7[i].columns)
X=df.drop(labels=ob,axis=1)
X_train=X[Y!='99']
X_test=X[Y=='99']
print('第二步:建模与预测填充------------------------')
times=time()
xgb_fill=xgboost.XGBClassifier(max_depth=3,n_estimators=190)
xgb_fill.fit(X_train,Y_train)
Y_predict=xgb_fill.predict(X_test)
print('运行时间:%s'% datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))
#预测结果赋值到缺失值地方
y_data[ cates[i] ][ y_data[ cates[i] ]=='99' ]=Y_predict
#保存模型
j=str(i)
modelname=r'xgb_fill_'+j+'.model'
model_file = open(modelname, 'wb')
pickle.dump(xgb_fill, model_file)
model_file.close()
(二)数据探索分析(特征筛选)
(三)模型构建与评估
(四)预测与排名
#构造特征空间
data=pd.read_csv('./clean_df_test.csv',index_col='Unnamed: 0')
model_load_file = open(r'ohe_keyf.model', 'rb')
ohe_keyf_r = pickle.load(model_load_file)
model_load_file.close()
cates=['用户地区', '性别','产品服务使用量', '是否为活跃用户']
result=ohe_keyf_r.transform( data[cates] )
df_catefeature=pd.DataFrame(result.toarray(),columns=ohe_keyf_r.get_feature_names())
cates=['产品使用分数', '年龄', '点数余额']
objs=[df_catefeature,data[cates]]
X=pd.concat(objs,axis=1)
#导入预测模型
model_load_file = open(r'best_2_XGBClassifier.model', 'rb')
xgb_2_r = pickle.load(model_load_file)
model_load_file.close()
#预测并保存
Y_pre=xgb_2_r.predict(X)
data['Predicted_Results']=Y_pre
results=data[['客户ID','Predicted_Results']]
results.to_csv('./results_xgb_2.csv',index=False)
results.Predicted_Results.value_counts()