《python數(shù)據(jù)分析與應(yīng)用》 課件 第15章 金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析_第1頁(yè)
《python數(shù)據(jù)分析與應(yīng)用》 課件 第15章 金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析_第2頁(yè)
《python數(shù)據(jù)分析與應(yīng)用》 課件 第15章 金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析_第3頁(yè)
《python數(shù)據(jù)分析與應(yīng)用》 課件 第15章 金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析_第4頁(yè)
《python數(shù)據(jù)分析與應(yīng)用》 課件 第15章 金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第15章金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析Python數(shù)據(jù)分析與應(yīng)用1機(jī)器學(xué)習(xí)CONTENTS15.1知識(shí)準(zhǔn)備15.2任務(wù)介紹15.3代碼演示15.4代碼補(bǔ)全和知識(shí)拓展目錄15.5實(shí)訓(xùn)任務(wù)2知識(shí)準(zhǔn)備13基于金融預(yù)測(cè)的比賽在Kaggle上較為常見:分別是JPX的東京證券交易所預(yù)測(cè),Ubiquant的市場(chǎng)預(yù)測(cè)以及G-Research的加密預(yù)測(cè)。Python是競(jìng)賽獲勝者的首選語(yǔ)言,而成功參賽者的工具選擇往往是:Python、Pydata、Pytorch和梯度提高的決策樹。深度學(xué)習(xí)仍未完全取代梯度增強(qiáng)的決策樹。入門機(jī)器學(xué)習(xí)和深度學(xué)習(xí)Kaggle(/)平臺(tái)成立于2010年,是一個(gè)進(jìn)行數(shù)據(jù)發(fā)掘和預(yù)測(cè)競(jìng)賽的在線競(jìng)賽平臺(tái)。企業(yè)或者研究者可以在平臺(tái)上發(fā)布有獎(jiǎng)競(jìng)賽項(xiàng)目。即通過(guò)將競(jìng)賽數(shù)據(jù)集、問(wèn)題描述、期望的解決結(jié)果和評(píng)價(jià)指標(biāo)發(fā)布到Kaggle平臺(tái)上,以競(jìng)賽的形式向廣大的數(shù)據(jù)專家和愛(ài)好者征集解決方案,類似于KDD-CUP(國(guó)際知識(shí)發(fā)現(xiàn)和數(shù)據(jù)挖掘競(jìng)賽)。15.1.1Kaggle數(shù)據(jù)建模大賽阿里云平臺(tái)素以舉辦“國(guó)際化”、“高端化”、“智能化”的算法比賽在行業(yè)著稱,自2014年推出以來(lái),已相繼有98個(gè)國(guó)家、30萬(wàn)開發(fā)者參與,成為一個(gè)電商、金融、物流、電力、工業(yè)制造、醫(yī)療等領(lǐng)域創(chuàng)新方案的新發(fā)源地。“阿里云天池”大賽鏈接業(yè)界最新的技術(shù),提供行業(yè)真實(shí)一手賽題和數(shù)據(jù),非常值得學(xué)界關(guān)注15.1.2中國(guó)的競(jìng)賽平臺(tái):阿里云天池大賽知識(shí)準(zhǔn)備任務(wù)介紹25以電話營(yíng)銷為例,銀行營(yíng)銷經(jīng)理經(jīng)常需要撥打電話給潛在客戶推薦銀行的各類產(chǎn)品,但是也常常遇到多數(shù)接到電話的客戶對(duì)所推銷的產(chǎn)品并不感興趣,往往不接聽電話或者即便接聽之后也很快在幾秒鐘之后就掛斷了電話。為了提升營(yíng)銷的效率,實(shí)現(xiàn)精準(zhǔn)營(yíng)銷,需要提升銀行經(jīng)理?yè)艽螂娫挼慕勇犅?,同時(shí)也可以節(jié)省撥打無(wú)謂的電話浪費(fèi)的人力成本。任務(wù)介紹葡萄牙銀行采用機(jī)器學(xué)習(xí)方法優(yōu)化了電話營(yíng)銷的流程,具體的做法是在撥打電話之前,首先從4萬(wàn)多潛在客戶中挑選出具有極大概率會(huì)接聽電話的客戶,營(yíng)銷經(jīng)理只給這些機(jī)器選出的接聽成功率高的客戶撥打電話開展?fàn)I銷活動(dòng),而不是像傳統(tǒng)營(yíng)銷一樣,不進(jìn)行任何分析直接給4萬(wàn)多客戶逐一撥打電話,可以極大提升營(yíng)銷效率、獲得較優(yōu)的營(yíng)銷效果。本次任務(wù)的目的就是要建立一個(gè)客戶是否接受存款產(chǎn)品的模型,而這個(gè)模型的建立是通過(guò)機(jī)器學(xué)習(xí)的方式,使用已有的數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練而完成的。簡(jiǎn)單而言就是用數(shù)據(jù)訓(xùn)練模型,然后獲得一個(gè)有預(yù)測(cè)能力的模型。本次訓(xùn)練模型將使用的數(shù)據(jù)集來(lái)自葡萄牙銀行機(jī)構(gòu)的(電話)直銷活動(dòng)的真實(shí)數(shù)據(jù),經(jīng)過(guò)脫敏之后可以被公開使用。本次電話直銷活動(dòng)的數(shù)據(jù)分析目標(biāo)是對(duì)4萬(wàn)多客戶進(jìn)行分類,目的是預(yù)測(cè)客戶是否會(huì)接聽電話之后認(rèn)購(gòu)定期存款(設(shè)定目標(biāo)變量為y,即y=1表示客戶會(huì)認(rèn)購(gòu)銀行的定期存款,y=0則客戶不會(huì)認(rèn)購(gòu))。該數(shù)據(jù)集名稱為“bankadditionalfull.csv”,它由41188條數(shù)據(jù)組成,其中含有20個(gè)自變量。銀行客戶數(shù)據(jù)20個(gè)自變量(其中10個(gè)是數(shù)字特征,10個(gè)是分類特征)代碼演示372312代碼演示一般在建模之前,通常需要對(duì)數(shù)據(jù)本身進(jìn)行一些了解、考察和分析,這被稱為EDA(ExploratoryDataAnalysis)#=========================================#1.ExploratoryDataAnalysis(探索性數(shù)據(jù)分析)#=========================================plt.rcParams['font.sans-serif']=['SimHei']#用來(lái)正常顯示中文標(biāo)簽plt.rcParams['axes.unicode_minus']=False#用來(lái)正常顯示負(fù)號(hào)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接受營(yíng)銷"),shadow=True,fontsize='large')ax.set_title("是否接受電話營(yíng)銷")ax.set_xlabel('接受營(yíng)銷yesorno')ax.set_ylabel('人數(shù)占比(總?cè)藬?shù)約4萬(wàn))')plt.show()2312代碼演示一般在建模之前,通常需要對(duì)數(shù)據(jù)本身進(jìn)行一些了解、考察和分析,這被稱為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)代碼補(bǔ)全和知識(shí)拓展410231215.4.1代碼補(bǔ)全請(qǐng)繼續(xù)使用單變量方法分析其他變量,比如婚姻狀況、信用違約default、住房貸款等。請(qǐng)嘗試編寫代碼自行分析。分析后得到的圖形如圖15-5、圖15-6所示。圖15-5人群中不同婚姻狀況的占比圖15-6不同婚姻狀況的人群接受定期存款產(chǎn)品的百分比231215.4.2知識(shí)拓展機(jī)器學(xué)習(xí)數(shù)據(jù)集的劃分。對(duì)于構(gòu)建模型的數(shù)據(jù),一般會(huì)將其分為三個(gè)部分。第一是訓(xùn)練數(shù)據(jù)(traindata),它被用于訓(xùn)練模型。第二是交叉驗(yàn)證數(shù)據(jù)(crossvalidationdata,又被稱為CVdata),它是被用來(lái)調(diào)整模型參數(shù)的。第三是測(cè)試數(shù)據(jù)(testdata),它被用來(lái)測(cè)試、比較和評(píng)價(jià)模型的。有一個(gè)比喻可以幫助理解這個(gè)概念:訓(xùn)練集相當(dāng)于學(xué)生的課本,學(xué)生根據(jù)課本里的內(nèi)容來(lái)掌握知識(shí)。驗(yàn)證集相當(dāng)于作業(yè),通過(guò)作業(yè)可以知道不同學(xué)生學(xué)習(xí)情況、進(jìn)步的速度快慢。而測(cè)試集相當(dāng)于考試,考的題基本是平常都沒(méi)有見過(guò)的,主要考察學(xué)生舉一反三的能力。這個(gè)比喻中“學(xué)生”就是相當(dāng)于所要構(gòu)建的“模型”。傳統(tǒng)上,一般三者切分的比例是:6:2:2,但驗(yàn)證集CV并不是必需的,但測(cè)試集test是必需的。之所以使用測(cè)試集來(lái)幫助建立模型是因?yàn)椋?)訓(xùn)練集train直接參與了模型調(diào)參的過(guò)程,顯然不能用來(lái)反映模型真實(shí)的能力(防止死記硬背課本的學(xué)生擁有最好的成績(jī),即防止過(guò)擬合)。2)驗(yàn)證集參與了人工調(diào)參(超參數(shù)hyperparameters)的過(guò)程,也不能用來(lái)最終評(píng)判一個(gè)模型(刷題庫(kù)的學(xué)生不能算是學(xué)習(xí)好的學(xué)生)。3)所以要通過(guò)最終的考試(測(cè)試集)來(lái)考察一個(gè)學(xué)生(模型)真正的能力(期末考試)。實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析51315.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析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)數(shù)據(jù)預(yù)處理15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析#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)#至此數(shù)據(jù)處理已經(jīng)完成#之后是建模部分,作為選學(xué)內(nèi)容拆分?jǐn)?shù)據(jù)集15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析####Model1:LogisticRegression邏輯回歸#引入邏輯回歸的包fromsklearn.linear_modelimportLogisticRegressionLR=LogisticRegression()#建立模型LR.fit(X_train,y_train)#訓(xùn)練模型predictions=LR.predict(X_test)#那訓(xùn)練好的模型在測(cè)試組上預(yù)測(cè)#顯示模型預(yù)測(cè)指標(biāo)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()延伸高級(jí)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)建模邏輯回歸模型15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析####Model2:DecisionTree決策樹#引入決策樹的包fromsklearnimporttreefromsklearn.model_selectionimportGridSearchCVparam_grid={'max_depth':[3,4,5,6]}Tree=DecisionTreeClassifier(criterion="entropy")#建立模型(這里可以調(diào)整超參數(shù)eg.max_depth)grid_Tree=GridSearchCV(Tree,param_grid,cv=5)#調(diào)參grid_Tree.fit(X_train,y_train)#訓(xùn)練模型predictions=grid_Tree.predict(X_test)#那訓(xùn)練好的模型在測(cè)試組上預(yù)測(cè)#決策樹可視化fig=plt.figure(figsize=(25,20))_=tree.plot_tree(grid_Tree.best_estimator_,feature_names=X_train.columns,filled=True)#顯示模型預(yù)測(cè)指標(biāo)fromsklearn.metricsimportprecision_recall_fscore_support,accuracy_score,confusion_matrixprint("*****LogisbticRegressionPredictionAnalysis*****")print("AccuracyonTrainingSet:{:0.4f}".format(accuracy_score(y_test,predictions)))延伸高級(jí)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)建模決策樹模型15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析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()##繪制每個(gè)變量在模型中的權(quán)重(feature_importance)Tree=grid_Tree.best_estimator_feature_scores=pd.DataFrame({'features':X_train.columns,'importance':Tree.feature_importances_})#取出每個(gè)變量在這個(gè)模型中的權(quán)重feature_scores=feature_scores[feature_scores['importance']!=0]#移除掉權(quán)重為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="參數(shù)特征的重要性排序(featureimportancescores)")plt.show()延伸高級(jí)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)建模決策樹模型15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析#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)延伸高級(jí)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)建模XGBoost模型15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析#tree_method:①'auto':使用啟發(fā)式方法選擇最快的方法,速度很慢;#②'exact':精確貪婪算法,枚舉所有候選項(xiàng);#③'approx':使用分位數(shù)草圖和梯度直方圖的近似貪婪算法;#④'hist':快速直方圖優(yōu)化近似貪心算法。它使用了一些性能改進(jìn),例如垃圾箱緩存。#⑤'gpu_exact':精確算法的GPU實(shí)現(xiàn)。⑥'gpu_hist':hist算法的GPU實(shí)現(xiàn)。x_cfl=XGBClassifier(tree_method='hist',max_bin=16)#沒(méi)有設(shè)置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_)#準(zhǔn)備好變量繪制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)#沒(méi)有設(shè)置gpu,去掉tree_method='gpu_hist'延伸高級(jí)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)建模XGBoost模型15.5實(shí)訓(xùn)任務(wù):金融機(jī)構(gòu)電話營(yíng)銷數(shù)據(jù)分析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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論