版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第15章金融机构电话营销数据分析Python数据分析与应用1机器学习CONTENTS15.1知识准备15.2任务介绍15.3代码演示15.4代码补全和知识拓展目录15.5实训任务2知识准备13基于金融预测的比赛在Kaggle上较为常见:分别是JPX的东京证券交易所预测,Ubiquant的市场预测以及G-Research的加密预测。Python是竞赛获胜者的首选语言,而成功参赛者的工具选择往往是:Python、Pydata、Pytorch和梯度提高的决策树。深度学习仍未完全取代梯度增强的决策树。入门机器学习和深度学习Kaggle(/)平台成立于2010年,是一个进行数据发掘和预测竞赛的在线竞赛平台。企业或者研究者可以在平台上发布有奖竞赛项目。即通过将竞赛数据集、问题描述、期望的解决结果和评价指标发布到Kaggle平台上,以竞赛的形式向广大的数据专家和爱好者征集解决方案,类似于KDD-CUP(国际知识发现和数据挖掘竞赛)。15.1.1Kaggle数据建模大赛阿里云平台素以举办“国际化”、“高端化”、“智能化”的算法比赛在行业著称,自2014年推出以来,已相继有98个国家、30万开发者参与,成为一个电商、金融、物流、电力、工业制造、医疗等领域创新方案的新发源地。“阿里云天池”大赛链接业界最新的技术,提供行业真实一手赛题和数据,非常值得学界关注15.1.2中国的竞赛平台:阿里云天池大赛知识准备任务介绍25以电话营销为例,银行营销经理经常需要拨打电话给潜在客户推荐银行的各类产品,但是也常常遇到多数接到电话的客户对所推销的产品并不感兴趣,往往不接听电话或者即便接听之后也很快在几秒钟之后就挂断了电话。为了提升营销的效率,实现精准营销,需要提升银行经理拨打电话的接听率,同时也可以节省拨打无谓的电话浪费的人力成本。任务介绍葡萄牙银行采用机器学习方法优化了电话营销的流程,具体的做法是在拨打电话之前,首先从4万多潜在客户中挑选出具有极大概率会接听电话的客户,营销经理只给这些机器选出的接听成功率高的客户拨打电话开展营销活动,而不是像传统营销一样,不进行任何分析直接给4万多客户逐一拨打电话,可以极大提升营销效率、获得较优的营销效果。本次任务的目的就是要建立一个客户是否接受存款产品的模型,而这个模型的建立是通过机器学习的方式,使用已有的数据对模型进行训练而完成的。简单而言就是用数据训练模型,然后获得一个有预测能力的模型。本次训练模型将使用的数据集来自葡萄牙银行机构的(电话)直销活动的真实数据,经过脱敏之后可以被公开使用。本次电话直销活动的数据分析目标是对4万多客户进行分类,目的是预测客户是否会接听电话之后认购定期存款(设定目标变量为y,即y=1表示客户会认购银行的定期存款,y=0则客户不会认购)。该数据集名称为“bankadditionalfull.csv”,它由41188条数据组成,其中含有20个自变量。银行客户数据20个自变量(其中10个是数字特征,10个是分类特征)代码演示372312代码演示一般在建模之前,通常需要对数据本身进行一些了解、考察和分析,这被称为EDA(ExploratoryDataAnalysis)#=========================================#1.ExploratoryDataAnalysis(探索性数据分析)#=========================================plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False#用来正常显示负号plt.figure(figsize=(6,4))Y=data["y"]total=len(Y)*1.ax=sns.countplot(x="y",data=data)forpinax.patches:ax.annotate('{:.1f}%'.format(100*p.get_height()/total),(p.get_x()+0.1,p.get_height()+5))#put11ticks(therefore10steps),from0tothetotalnumberofrowsinthedataframeax.yaxis.set_ticks(np.linspace(0,total,11))#adjusttheticklabeltothedesiredformat,withoutchangingthepositionoftheticks.ax.set_yticklabels(map('{:.1f}%'.format,100*ax.yaxis.get_majorticklocs()/total))ax.set_xticklabels(ax.get_xticklabels(),rotation=40,ha="right")ax.legend(labels=("no不接受","yes接受营销"),shadow=True,fontsize='large')ax.set_title("是否接受电话营销")ax.set_xlabel('接受营销yesorno')ax.set_ylabel('人数占比(总人数约4万)')plt.show()2312代码演示一般在建模之前,通常需要对数据本身进行一些了解、考察和分析,这被称为EDA(ExploratoryDataAnalysis)#=========================================#2.UnivariateAnalysis(单变量分析)#=========================================defcountplot(label,dataset):plt.figure(figsize=(6,4))Y=data[label]total=len(Y)*1.ax=sns.countplot(x=label,data=dataset)forpinax.patches:ax.annotate('{:.1f}%'.format(100*p.get_height()/total),(p.get_x()+0.1,p.get_height()+5))#put11ticks(therefore10steps),from0tothetotalnumberofrowsinthedataframeax.yaxis.set_ticks(np.linspace(0,total,11))#adjusttheticklabeltothedesiredformat,withoutchangingthepositionoftheticks.ax.set_yticklabels(map('{:.1f}%'.format,100*ax.yaxis.get_majorticklocs()/total))ax.set_xticklabels(ax.get_xticklabels(),rotation=40,ha="right")#ax.legend(labels=["no","yes"])plt.show()defcountplot_withY(label,dataset):plt.figure(figsize=(8,6))Y=data[label]total=len(Y)*1.ax=sns.countplot(x=label,data=dataset,hue="y")forpinax.patches:ax.annotate('{:.1f}%'.format(100*p.get_height()/total),(p.get_x()+0.1,p.get_height()+5))#put11ticks(therefore10steps),from0tothetotalnumberofrowsinthedataframeax.yaxis.set_ticks(np.linspace(0,total,11))#adjusttheticklabeltothedesiredformat,withoutchangingthepositionoftheticks.ax.set_yticklabels(map('{:.1f}%'.format,100*ax.yaxis.get_majorticklocs()/total))ax.set_xticklabels(ax.get_xticklabels(),rotation=40,ha="right")#ax.legend(labels=["no","yes"])plt.show()#Feature:job(Category)countplot("job",data)countplot_withY("job",data)代码补全和知识拓展410231215.4.1代码补全请继续使用单变量方法分析其他变量,比如婚姻状况、信用违约default、住房贷款等。请尝试编写代码自行分析。分析后得到的图形如图15-5、图15-6所示。图15-5人群中不同婚姻状况的占比图15-6不同婚姻状况的人群接受定期存款产品的百分比231215.4.2知识拓展机器学习数据集的划分。对于构建模型的数据,一般会将其分为三个部分。第一是训练数据(traindata),它被用于训练模型。第二是交叉验证数据(crossvalidationdata,又被称为CVdata),它是被用来调整模型参数的。第三是测试数据(testdata),它被用来测试、比较和评价模型的。有一个比喻可以帮助理解这个概念:训练集相当于学生的课本,学生根据课本里的内容来掌握知识。验证集相当于作业,通过作业可以知道不同学生学习情况、进步的速度快慢。而测试集相当于考试,考的题基本是平常都没有见过的,主要考察学生举一反三的能力。这个比喻中“学生”就是相当于所要构建的“模型”。传统上,一般三者切分的比例是:6:2:2,但验证集CV并不是必需的,但测试集test是必需的。之所以使用测试集来帮助建立模型是因为:1)训练集train直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止死记硬背课本的学生拥有最好的成绩,即防止过拟合)。2)验证集参与了人工调参(超参数hyperparameters)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。3)所以要通过最终的考试(测试集)来考察一个学生(模型)真正的能力(期末考试)。实训任务:金融机构电话营销数据分析51315.5实训任务:金融机构电话营销数据分析fromxgboostimportXGBClassifierfromsklearn.model_selectionimportRandomizedSearchCVfromsklearn.calibrationimportCalibratedClassifierCVfromsklearn.metricsimportroc_auc_score#Loadingthedatasetdata=pd.read_csv("./bank-additional-full.csv",sep=";")()#DealingwithMissingdata#Fromtheabovebasicinfoofeachfeature,#weknowthattherearenomissingvaluesinthisdataset.#Dealingwithduplicatedatadata_dup=data[data.duplicated(keep="last")]print(data_dup)print(data_dup.shape)#Sowehave12rowswhichareduplicates.#Wewilldroptheseduplicaterowsbeforeproceedingfurther.data=data.drop_duplicates()print(data.shape)#Separateinpedendentandtargetvariablesdata_x=data.iloc[:,:-1]print("ShapeofX:",data_x.shape)data_y=data["y"]print("ShapeofY:",data_y.shape)数据预处理15.5实训任务:金融机构电话营销数据分析#TrainTestsplitfromsklearn.model_selectionimporttrain_test_splitX_rest,X_test,y_rest,y_test=train_test_split(data_x,data_y,test_size=0.2)X_train,X_cv,y_train,y_cv=train_test_split(X_rest,y_rest,test_size=0.16)print("XTrain:",X_train.shape)print("XCV:",X_cv.shape)print("XTest:",X_test.shape)print("YTrain:",y_train.shape)print("YCV:",y_cv.shape)print("YTest:",y_test.shape)#Replace"no"with0and"yes"with1y_train.replace({"no":0,"yes":1},inplace=True)y_cv.replace({"no":0,"yes":1},inplace=True)y_test.replace({"no":0,"yes":1},inplace=True)#至此数据处理已经完成#之后是建模部分,作为选学内容拆分数据集15.5实训任务:金融机构电话营销数据分析####Model1:LogisticRegression逻辑回归#引入逻辑回归的包fromsklearn.linear_modelimportLogisticRegressionLR=LogisticRegression()#建立模型LR.fit(X_train,y_train)#训练模型predictions=LR.predict(X_test)#那训练好的模型在测试组上预测#显示模型预测指标fromsklearn.metricsimportprecision_recall_fscore_support,accuracy_score,confusion_matrixprint("*****LogisbticRegressionPredictionAnalysis*****")print("AccuracyonTrainingSet:{:0.4f}".format(accuracy_score(y_test,predictions)))prfs=precision_recall_fscore_support(y_test,predictions)print("Precision:{:0.4f}".format(prfs[0][1]))print("Recall:{:0.4f}".format(prfs[1][1]))print("F1Score:{:0.4f}".format(prfs[2][1]))cf=confusion_matrix(y_test,predictions)sns.heatmap(cf,annot=True,fmt='g')plt.title("混淆矩阵(ConfusionMatrix)")plt.show()延伸高级任务:金融机构电话营销数据建模逻辑回归模型15.5实训任务:金融机构电话营销数据分析####Model2:DecisionTree决策树#引入决策树的包fromsklearnimporttreefromsklearn.model_selectionimportGridSearchCVparam_grid={'max_depth':[3,4,5,6]}Tree=DecisionTreeClassifier(criterion="entropy")#建立模型(这里可以调整超参数eg.max_depth)grid_Tree=GridSearchCV(Tree,param_grid,cv=5)#调参grid_Tree.fit(X_train,y_train)#训练模型predictions=grid_Tree.predict(X_test)#那训练好的模型在测试组上预测#决策树可视化fig=plt.figure(figsize=(25,20))_=tree.plot_tree(grid_Tree.best_estimator_,feature_names=X_train.columns,filled=True)#显示模型预测指标fromsklearn.metricsimportprecision_recall_fscore_support,accuracy_score,confusion_matrixprint("*****LogisbticRegressionPredictionAnalysis*****")print("AccuracyonTrainingSet:{:0.4f}".format(accuracy_score(y_test,predictions)))延伸高级任务:金融机构电话营销数据建模决策树模型15.5实训任务:金融机构电话营销数据分析prfs=precision_recall_fscore_support(y_test,predictions)print("Precision:{:0.4f}".format(prfs[0][1]))print("Recall:{:0.4f}".format(prfs[1][1]))print("F1Score:{:0.4f}".format(prfs[2][1]))cf=confusion_matrix(y_test,predictions)sns.heatmap(cf,annot=True,fmt='g')plt.title("混淆矩阵(ConfusionMatrix)")plt.show()##绘制每个变量在模型中的权重(feature_importance)Tree=grid_Tree.best_estimator_feature_scores=pd.DataFrame({'features':X_train.columns,'importance':Tree.feature_importances_})#取出每个变量在这个模型中的权重feature_scores=feature_scores[feature_scores['importance']!=0]#移除掉权重为0的变量##画图fig=plt.figure(figsize=(10,10))ax=sns.barplot(x='importance',y='features',data=feature_scores,order=feature_scores.sort_values('importance',ascending=False).features)ax.set(title="参数特征的重要性排序(featureimportancescores)")plt.show()延伸高级任务:金融机构电话营销数据建模决策树模型15.5实训任务:金融机构电话营销数据分析#XGBoostwithRandomizedSearchCVhyperparametertuningX_train,X_test,y_train,y_test=train_test_split(data_x,data_y,test_size=0.2)print("XTrain:",X_train.shape)print("XTest:",X_test.shape)print("YTrain:",y_train.shape)print("YTest:",y_test.shape)y_train.replace({"no":0,"yes":1},inplace=True)y_test.replace({"no":0,"yes":1},inplace=True)#Resetindexsothatpd.concatworksproperlyinResponseEncoderfunctionX_train=X_train.reset_index().drop("index",axis=1)X_test=X_test.reset_index().drop("index",axis=1)X_cv=X_cv.reset_index().drop("index",axis=1)X_train=ResponseEncoder(categorical_cols,X_train,y_train)print("Shapeofthetraindatasetafterencoding:",X_train.shape)X_test=ResponseEncoder(categorical_cols,X_test,y_test)print("Shapeofthetestdatasetafterencoding:",X_test.shape)#RemovedurationfeatureX_train=X_train.drop("duration",axis=1)X_test=X_test.drop("duration",axis=1)延伸高级任务:金融机构电话营销数据建模XGBoost模型15.5实训任务:金融机构电话营销数据分析#tree_method:①'auto':使用启发式方法选择最快的方法,速度很慢;#②'exact':精确贪婪算法,枚举所有候选项;#③'approx':使用分位数草图和梯度直方图的近似贪婪算法;#④'hist':快速直方图优化近似贪心算法。它使用了一些性能改进,例如垃圾箱缓存。#⑤'gpu_exact':精确算法的GPU实现。⑥'gpu_hist':hist算法的GPU实现。x_cfl=XGBClassifier(tree_method='hist',max_bin=16)#没有设置gpu,去掉tree_method='gpu_hist'prams={'learning_rate':[0.01,0.03,0.05,0.1,0.15,0.2],'n_estimators':[100,200,500,1000,2000],'max_depth':[3,5,10],'colsample_bytree':[0.1,0.3,0.5,1],'subsample':[0.1,0.3,0.5,1]}random_cfl=RandomizedSearchCV(x_cfl,param_distributions=prams,error_score='raise',verbose=10,n_iter=20,cv=5,scoring='roc_auc')random_cfl.fit(X_train,y_train)print(random_cfl.best_params_)#准备好变量绘制x_cfl,绘制feature_importance用到x_cfl.get_booster().get_scorex_cfl=XGBClassifier(n_estimators=2000,max_depth=3,learning_rate=0.01,\colsample_bytree=0.5,subsample=1,tree_method='hist',max_bin=16)#没有设置gpu,去掉tree_method='gpu_hist'延伸高级任务:金融机构电话营销数据建模XGBoost模型15.5实训任务:金融机构电话营销数据分析x_cfl.fit(X_train,y_train,verbose=True)sig_clf=CalibratedClassifierCV(x_cfl,method="sigmoid")sig_clf.fit(X_train,y_train)predict_y=sig_clf.predict_proba(X_train)print("Forvaluesofbestalpha=2000ThetrainAUCis:",roc_auc_score(y_train,predict_y[:,1]))predict_y=sig_clf.predict_proba(X_test)print("Forvaluesofbestalpha=2000ThetestAUCis:",roc_auc_score(y_test,predict_y[:,1]))#绘制feature_importanceplt.rcdefaults()feature_importance=x_cfl.get_booster().get_score(importance_type='gain')objects=feature_importance.keys()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北孝感人才集团业务员招聘12人备考题库附答案详解(预热题)
- 2026云南省体育医院招聘12人备考题库及参考答案详解
- 2025年检验科血常规异常结果鉴别模拟考试试题及答案解析
- 2026广东建设职业技术学院招聘12人备考题库(编制)及答案详解(考点梳理)
- 2026河南南阳开元学校高中部教师招聘321人备考题库含答案详解(轻巧夺冠)
- 2026广西柳州融安县中医医院招聘备考题库及答案详解(有一套)
- 浙江杭州市城市建设投资集团有限公司2026届春季校园招聘备考题库及答案详解(考点梳理)
- 盐亭县2026年上半年公开考核招聘教师备考题库(10人)及答案详解(全优)
- 2025年东方航空技术有限公司山东分公司招聘4人考试参考题库附答案解析
- 2025年病理科病理标本切片技术考核试题及答案解析
- 《二氧化碳捕集原理与技术》 课件 第六章 集中排放二氧化碳捕集技术
- 2025年中国干细胞医疗行业发展前景预测与投资战略规划分析报告
- 专家评审意见表模板
- 2025年河南机电职业学院高职单招语文2019-2024历年真题考点试卷含答案解析
- 冠脉介入并发症曾繁芳
- 经颅多普勒超声操作标准
- 学前教育学 第3版 教案 第四章学前教育活动的组织与指导
- 科学活动纸的大力士
- AQT3034化工过程安全管理导则
- 2025年中国极地研究中心(中国极地研究所)应届毕业生招聘13人历年高频重点提升(共500题)附带答案详解
- 登高安全操作规程(3篇)
评论
0/150
提交评论