《python數(shù)據(jù)分析與應(yīng)用》 課件 史浩 第14、15章 銀行信貸潛在違約客戶識別、金融機構(gòu)電話營銷數(shù)據(jù)分析_第1頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 史浩 第14、15章 銀行信貸潛在違約客戶識別、金融機構(gòu)電話營銷數(shù)據(jù)分析_第2頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 史浩 第14、15章 銀行信貸潛在違約客戶識別、金融機構(gòu)電話營銷數(shù)據(jù)分析_第3頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 史浩 第14、15章 銀行信貸潛在違約客戶識別、金融機構(gòu)電話營銷數(shù)據(jù)分析_第4頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 史浩 第14、15章 銀行信貸潛在違約客戶識別、金融機構(gòu)電話營銷數(shù)據(jù)分析_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第14章銀行信貸潛在違約客戶識別Python數(shù)據(jù)分析與應(yīng)用1機器學(xué)習(xí)CONTENTS14.1知識準(zhǔn)備14.2任務(wù)介紹14.3代碼演示14.4代碼補全和知識拓展目錄14.5實訓(xùn)任務(wù)2知識準(zhǔn)備13以A卡的邏輯回歸模型為例,使用邏輯回歸模型可以得到一個[0,1]區(qū)間的結(jié)果,在風(fēng)控場景下可以理解為用戶違約的概率。A卡邏輯回歸模型一般來說,A卡可用作貸款0-1年內(nèi)的信用分析。B卡則是在申請人已獲得貸款,累計了一定的行為數(shù)據(jù)之后,依托大數(shù)據(jù)進(jìn)行的分析,一般為3-5年的時間區(qū)間。而C卡則對數(shù)據(jù)量要求更大,需加入催收后的客戶反應(yīng)等多維度的屬性數(shù)據(jù)再進(jìn)行分析。14.1.1貸前風(fēng)控模型每種評分卡采用的模型都會有所不同。在A卡中常用的模型有邏輯回歸(LogisticRegression,簡稱LR),層次分析法(AnalyticHierarchyProcess,簡稱AHP)等,也有采用人工智能的機器學(xué)習(xí)算法的(比如XGBoost、LightGBM算法等)。而在B、C兩種卡中,常使用多因素邏輯回歸,在預(yù)測精度等方面表現(xiàn)會更好。評分卡模型知識準(zhǔn)備14.1.2GBDT原理梯度提升決策樹GBDT(GradientBoostingDecisionTree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結(jié)論累加起來形成最終答案。決策樹可分為回歸樹和分類樹。區(qū)分回歸樹和分類樹的方法很簡單,例如能區(qū)分蘋果好與壞的就是分類樹,而能為蘋果好壞打個分?jǐn)?shù)的就是回歸樹。由于GB算法中需要將決策樹的結(jié)果累加起來,而如果是分類樹,其結(jié)果是無法相加的,例如“貓”+“兔”等于什么?所以說GBDT中所有的樹都是回歸樹,而不是分類樹。知識準(zhǔn)備GBDT的原理就是利用多個決策樹來逼近最終結(jié)果。即把其中所有回歸樹的結(jié)果相加等于預(yù)測值,然后下一個回歸樹去擬合預(yù)測值與真實值之間的誤差。舉一個非常簡單的例子,比如某人今年30歲了,需要讓計算機或者模型GBDT去根據(jù)一定的條件預(yù)測這個人的年齡。GBDT模型會在第一個決策樹中隨便用一個年齡比如20歲來擬合,然后發(fā)現(xiàn)誤差有10歲;接下來在第二棵樹中,用6歲去擬合剩下的損失,發(fā)現(xiàn)差距還有4歲;接著在第三棵樹中用3歲擬合剩下的差距,發(fā)現(xiàn)差距只有1歲了;最后在第四課樹中用1歲擬合剩下的殘差,差距為0,完美匹配。最終,四棵樹的結(jié)論加起來20+6+3+1,就是真實年齡30歲。6GBDT是機器學(xué)習(xí)算法,XGBoost是該算法的工程實現(xiàn)。XGBoost可以看做是GBDT算法的升級版,而LightGBM更是在XGBoost基礎(chǔ)上的再優(yōu)化,主要解決在數(shù)據(jù)量大、特征維度高的情況下效率和擴(kuò)展性不足的問題。lightGBM是2017年1月,微軟在GItHub上開源的一個新的梯度提升框架。在開源之后,就被冠以“速度驚人”、“支持分布式”、“代碼清晰易懂”、“占用內(nèi)存小”等屬性。LightGBM主打的高效并行訓(xùn)練讓其性能超越現(xiàn)有其他提升(又稱boosting)工具。在Higgs數(shù)據(jù)集上的試驗表明,LightGBM比XGBoost快將近10倍,內(nèi)存占用率大約為XGBoost的1/6。LightGBM算法既能做分類分析,又能做回歸分析,對應(yīng)的模型分別為LightGBM分類模型(LGBMClassifier)和LightGBM回歸模型(LGBMRegressor)。14.1.2GBDT原理知識準(zhǔn)備714.1.3混淆矩陣知識準(zhǔn)備

精準(zhǔn)率和召回率是相互制約的,如果想要精準(zhǔn)率提高,召回率則會下降,如果要召回率提高,精準(zhǔn)率則會下降,我們需要找到二者之間的一個平衡。精準(zhǔn)率和召回率這兩個指標(biāo)有時精準(zhǔn)率低一些有時召回率低一些。那么實際中用哪種組合比較好呢?對于有些場景,會更注重精準(zhǔn)率,比如股票預(yù)測。而如果在醫(yī)療領(lǐng)域,則召回率會顯得更加重要,也就是要能在實際得病的人中盡量預(yù)測的更加準(zhǔn)確。814.1.3混淆矩陣知識準(zhǔn)備

任務(wù)介紹29某銀行有一個包含1000個客戶的貸款信息表,其中記錄了每個客戶的身份證號碼、收入、年齡、性別、歷史授信額度、歷史違約次數(shù)、是否違約等信息。利用這些數(shù)據(jù)用GBDT算法建立模型,從而可以使用該模型來對未來的客戶進(jìn)行是否違約的預(yù)測。任務(wù)介紹在實際編程中,常會用到Scikit-learn(也稱為sklearn)庫,這是一個針對Python編程語言的免費機器學(xué)習(xí)庫。簡單來說Scikit-learn(sklearn)的定位是通用機器學(xué)習(xí)庫,建立在NumPy之上,它并不是一個深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)框架。而TensorFlow、Pythorch、Keras的定位則主要是深度學(xué)習(xí)庫。在實現(xiàn)GBDT算法時,常采用sklearn庫,它具有各種分類、回歸和聚類算法,包括支持向量機,隨機森林,梯度提升,k均值和DBSCAN等模型。另外,也常將sklearn與LightGBM配合使用。代碼演示3112312代碼演示假定采用隨機生成的數(shù)據(jù)來建立模型。首先隨機模擬產(chǎn)生一組50個客戶數(shù)據(jù)。14.3.1分析隨機生成數(shù)據(jù)(1)1importpandasaspd2importrandom34data=[[random.randint(1,36),random.randint(5,50),random.randint(0,1)]foriin5range(1,51)]67df=pd.DataFrame(data)8df.columns=['欠款時長(月)','年收入(萬元)','是否違約']9X=df.drop(columns='是否違約')10Y=df['是否違約']11print(df)12fromsklearn.model_selectionimporttrain_test_split1314X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)1516#分類模型17fromlightgbmimportLGBMClassifier18model=LGBMClassifier(boosting_type='gbdt',objective='binary',num_leaves=50,19learning_rate=0.1,n_estimators=10,max_depth=20,20bagging_fraction=0.9,feature_fraction=0.9,reg_lambda=0.2)2122#回歸模型23#fromlightgbmimportLGBMRegressor24#model=LGBMRegressor(boosting_type='gbdt',objective='binary',num_leaves=50,25#learning_rate=0.1,n_estimators=10,max_depth=20,26#bagging_fraction=0.9,feature_fraction=0.9,reg_lambda=0.2)272829model.fit(X_train,y_train)2312代碼演示假定采用隨機生成的數(shù)據(jù)來建立模型。首先隨機模擬產(chǎn)生一組50個客戶數(shù)據(jù)。14.3.1分析隨機生成數(shù)據(jù)(2)30#模型預(yù)測及評估31y_pred=model.predict(X_test)3233print(type(X_test))#<class'pandas.core.frame.DataFrame'>34print(type(y_test))#<class'pandas.core.series.Series'>35print(type(y_pred))#<class'numpy.ndarray'>36df1=X_test37#將series轉(zhuǎn)DataFrame38df1.insert(2,'y_test',y_test)#插入第2列,列名為y_test39#將numpy.ndarray轉(zhuǎn)DataFrame40df2=pd.DataFrame(y_pred,index=df1.index,columns=['y_pred'])41df1=df1.join(df2['y_pred'])42print(df1)43df1.sort_index(axis=0,ascending=True,inplace=True)44mydf=df1.reset_index()#mydf將索引重新從零開始順序排序,drop=True刪除舊的索引序列45mydf.index+=146print(mydf)4748#畫圖49importmatplotlib5051matplotlib.use('TKAgg')52importmatplotlib.pyplotasplt5354plt.rcParams["font.sans-serif"]=['SimHei']55plt.rcParams["axes.unicode_minus"]=False56plt.figure(figsize=(10,5))57plt.bar(mydf.index,mydf['y_test']+0.1,color='darkorange',width=0.2)58plt.bar(mydf.index+0.2,mydf['y_pred']+0.1,color='lemonchiffon',width=0.2)59plt.xlabel('X_test')60plt.ylabel('y_pred')61plt.show()622312代碼演示1#--------------------------------------------------------2#1、讀取數(shù)據(jù)3importpandasaspd45df=pd.read_excel('./客戶信息及違約表現(xiàn).xlsx')67#2、提取特征變量和目標(biāo)變量8X=df.drop(columns='是否違約')9Y=df['是否違約']1011#3、劃分訓(xùn)練集和測試集12fromsklearn.model_selectionimporttrain_test_split1314X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=123)1516#4、模型訓(xùn)練和搭建17fromlightgbmimportLGBMClassifier1819model=LGBMClassifier()#分類模型20model.fit(X_train,y_train)2122#5、模型預(yù)測及評估23y_pred=model.predict(X_test)24a=pd.DataFrame()#創(chuàng)建一個空的DataFrame25a['預(yù)測值']=list(y_pred)26a['實際值']=list(y_test)27print(a.head())28fromsklearn.metricsimportaccuracy_score2930score=accuracy_score(y_test,y_pred)31print(f'accuracy_score={score}')14.3.2分析某銀行真實數(shù)據(jù)(并進(jìn)行了參數(shù)調(diào)優(yōu))下面將不再使用隨機產(chǎn)生的數(shù)據(jù),而是使用經(jīng)過脫敏處理之后的某銀行真實數(shù)據(jù)(即“客戶信息及違約表現(xiàn).xlsx”數(shù)據(jù))進(jìn)行建模和預(yù)測。未完下頁繼續(xù)32print(f'model.score={model.score(X_test,y_test)}')#模型準(zhǔn)確度評分33#繪制ROC曲線來評估模型預(yù)測效果34y_pred_proba=model.predict_proba(X_test)3536fromsklearn.metricsimportroc_curve3738fpr,tpr,thres=roc_curve(y_test,y_pred_proba[:,1])39importmatplotlib4041matplotlib.use('TkAgg')42importmatplotlib.pyplotasplt4344plt.figure(figsize=(6,6))#600x600像素(先寬度后高度)45plt.plot(fpr,tpr)46plt.show()2312代碼演示47#求AUC值48fromsklearn.metricsimportroc_auc_score4950score=roc_auc_score(y_test.values,y_pred_proba[:,1])51print(f'roc_auc_score={score}')5253features=X.columns#獲取特征名稱54importances=model.feature_importances_#獲取特征重要性55#通過二維表格顯示56importances_df=pd.DataFrame()57importances_df['特征名稱']=features58importances_df['特征重要性']=importances59importances_df.sort_values('特征重要性',ascending=False,inplace=True)60print(importances_df)61fromlightgbmimportplot_importance6263plt.rcParams['figure.figsize']=(12.8,7.2)64plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標(biāo)簽65plt.rcParams['axes.unicode_minus']=False#用來正常顯示負(fù)號66plot_importance(model)67plt.show()6869#參數(shù)調(diào)優(yōu):使用網(wǎng)格搜索交叉驗證的方法進(jìn)行參數(shù)調(diào)優(yōu)70fromsklearn.model_selectionimportGridSearchCV7172parameters={'num_leaves':[10,15,31],'n_estimators':[10,20,30],'learning_rate':[0.05,0.1,0.2]}73model=LGBMClassifier()#分類模型74grid_search=GridSearchCV(model,parameters,scoring='roc_auc',cv=5)75grid_search.fit(X_train,y_train)#傳入數(shù)據(jù)76print(grid_search.best_params_)#輸出參數(shù)的最優(yōu)值77#輸出結(jié)果{'learning_rate':0.1,'n_estimators':20,'num_leaves':31}78model=LGBMClassifier(num_leaves=grid_search.best_params_['num_leaves'],79learning_rate=grid_search.best_params_['learning_rate'],80n_estimators=grid_search.best_params_['n_estimators'],)#分類模型81model.fit(X_train,y_train)82y_pred_proba=model.predict_proba(X_test)83score=roc_auc_score(y_test.values,y_pred_proba[:,1])84print(f'afterGridSearchCVroc_auc_score={score}')8514.3.2分析某銀行真實數(shù)據(jù)(續(xù))代碼補全和知識拓展416231214.4.1代碼補全預(yù)測印度股票指數(shù)NIFTY50次日的價格走勢的方向(上漲為1或下跌為0)。代碼將根據(jù)一組輸入特征進(jìn)行預(yù)測,該模型使用了15年的歷史數(shù)據(jù)。1#代碼補全2#請在()填寫代碼3#-----------------------------------------------------4#Fordatamanipulationandplotting5importpandasaspd6importnumpyasnp7importmatplotlib.pyplotasplt89#Formodelcreationandprediction10importlightgbmaslgb1112#Formodelanalysis13fromsklearn.metricsimportConfusionMatrixDisplay14fromsklearn.metricsimportclassification_report1516#UsingyfinancedownloadtheNIFTY50adjustedcloseprices17df=pd.read_excel("nifty50.xlsx")1819print(df.head())2021#Calculatethedailyreturns22df["returns"]=df.AdjClose.pct_change()2324#Calculatethechangecolumn25df["Change"]=np.where(df.AdjClose.shift(-1)>df.AdjClose,1,0)2627#CalculatethelaggedtimeseriesofNIFTY5028cols=[]2930foriinrange(7):31col_name=f'lag_{i}'3233df[col_name]=df.returns.shift(i)34cols.append(col_name)35231214.4.1代碼補全預(yù)測印度股票指數(shù)NIFTY50次日的價格走勢的方向(上漲為1或下跌為0)。代碼將根據(jù)一組輸入特征進(jìn)行預(yù)測,該模型使用了15年的歷史數(shù)據(jù)。36df.dropna(inplace=True)37print(df.columns)3839#Definethefeatures(x)andtheoutput(y)40x=df[cols]41y=df[["Change"]]#df[[]]:取完全的某列,是表格,返回DataFrame類型4243#Splitthedataintotraining(80%)andtesting(20%)sets44l=len(df)45x_train=x[:int(0.8*l)]46y_train=y[:int(0.8*l)]47x_test=x[int(0.8*l):]48y_test=y[int(0.8*l):]4950#CreatetheLightGBMmodelwiththebelowinputparameters51model=lgb.LGBMClassifier(num_leaves=10,max_depth=7,learning_rate=0.02,n_estimators=50)5253#Fitthemodelontrainingdata54model.fit(x_train,y_train.values.ravel())5556#Usethetrainedmodeltomakepredictionsonthetestdata57(_____________)5859#Toobtainthetrainingandtestingaccuracy60print('Trainingaccuracy:{0:0.2f}'.format(model.score(x_train,y_train)))61print('Testingaccuracy:{0:0.2f}'.format(model.score(x_test,y_test)))6263#Plotconfusionmatrixfortrainingandtestingdata64ConfusionMatrixDisplay.from_estimator(model,x_train,y_train)65plt.title("Confusionmatrixoftrainingdata")66ConfusionMatrixDisplay.from_estimator(model,x_test,y_test)67plt.title("Confusionmatrixoftestingdata")68plt.show()6970#Gettheclassificationreport71print(classification_report(y_test,y_pred))7273#Featureimportance74(_____________)75plt.show()76231214.4.2知識拓展optuna是?個使?python編寫的超參數(shù)調(diào)節(jié)框架。?個極簡的optuna的優(yōu)化程序中只有三個最核?的概念,?標(biāo)函數(shù)(objective),單次試驗(trial),和研究(study).其中objective負(fù)責(zé)定義待優(yōu)化函數(shù)并指定參/超參數(shù)數(shù)范圍,trial對應(yīng)著objective的單次執(zhí)?,?study則負(fù)責(zé)管理優(yōu)化,決定優(yōu)化的?式,總試驗的次數(shù)、試驗結(jié)果的記錄等功能。之前我們用到的gridsearchCV就是一種超參搜索算法,但是optuna是一個功能更強大的全流程超參數(shù)搜索工具。optuna包含了gridsearchCV算法,使用方法一般如下:1importoptuna234defobjective(trial):5x=trial.suggest_float('x',-10,10)6return(x-2)**2789study=optuna.create_study()10study.optimize(objective,n_trials=100)1112print(study.best_params)#E.g.{'x':2.0151920840525603}13231214.4.2知識拓展自動優(yōu)化代碼演示環(huán)節(jié)中的銀行真實數(shù)據(jù)1importtime23importoptuna4importwarnings56warnings.filterwarnings('ignore')#過濾掉early_stopping(stopping_rounds=100)帶來的warnings信息7fromlightgbmimportearly_stopping,log_evaluation8fromsklearn.metricsimportlog_loss,average_precision_score,roc_auc_score,accuracy_score,f1_score,\9classification_report,precision_score10fromsklearn.model_selectionimportStratifiedKFold11importnumpyasnp12importlightgbmaslgbm13fromegrationimportLightGBMPruningCallback14importpandasaspd1516df=pd.read_excel('./客戶信息及違約表現(xiàn).xlsx')1718#2、提取特征變量和目標(biāo)變量19X=df.drop(columns='是否違約')20y=df['是否違約']2122#劃分訓(xùn)練集和測試集23fromsklearn.model_selectionimporttrain_test_split2425X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=123)2627231214.4.2知識拓展28defobjective(trial,X,y):#參數(shù)網(wǎng)格29param_grid={"n_estimators":trial.suggest_int('n_estimators',5,50),30#"n_estimators":trial.suggest_categorical("n_estimators",[50]),31"learning_rate":trial.suggest_float("learning_rate",0.001,0.3),32"num_leaves":trial.suggest_int("num_leaves",5,100,step=1),33"max_depth":trial.suggest_int("max_depth",3,12),34#"min_data_in_leaf":trial.suggest_int("min_data_in_leaf",200,10000,step=100),35#"lambda_l1":trial.suggest_int("lambda_l2",0,100,step=5),36#"min_gain_to_split":trial.suggest_float("min_gain_to_split",0,15),37#"bagging_fraction":trial.suggest_float("bagging_fraction",0.2,0.95,step=0.1),38#"bagging_freq":trial.suggest_int("bagging_freq",2,7),39#"feature_fraction":trial.suggest_float("feature_fraction",0.2,0.95,step=0.1),40"random_state":120822,}4142#LGBM建模43model=lgbm.LGBMClassifier(objective="binary",**param_grid)#"binary",二分類。"multiclass",多分類。4445model.fit(X_train,y_train,eval_set=[(X_test,y_test)],46eval_metric='auc',47callbacks=[LightGBMPruningCallback(trial,'auc'),48log_evaluation(period=100),early_stopping(stopping_rounds=100)])49#模型預(yù)測50preds=model.predict_proba(X_test)51scores=roc_auc_score(y_test,preds[:,1])#優(yōu)化指標(biāo)score最大5253returnscores5455自動優(yōu)化代碼演示環(huán)節(jié)中的銀行真實數(shù)據(jù)231214.4.2知識拓展56study=optuna.create_study(direction="maximize",study_name="LGBMClassifier")57func=lambdatrial:objective(trial,X,y)58study.optimize(func,n_trials=20,show_progress_bar=True)59optuna.visualization.plot_optimization_history(study).show()#繪制60optuna.visualization.plot_parallel_coordinate(study).show()#61optuna.visualization.plot_param_importances(study).show()#6263print(f"\tBestvalue:{study.best_value:.5f}")64print(f"\tBestparams:")65forkey,valueinstudy.best_params.items():66print(f"\t\t{key}:{value}")67time.sleep(3)68print("------------------------------------------------------------------------------")69print("--------------------BestParamsTrainedmodel---------------------------------")70print("------------------------------------------------------------------------------")71model1=lgbm.LGBMClassifier(num_leaves=study.best_params['num_leaves'],72max_depth=study.best_params['max_depth'],73learning_rate=study.best_params['learning_rate'],74n_estimators=study.best_params['n_estimators'],75#min_data_in_leaf=study.best_params['min_data_in_leaf'],76#lambda_l1=study.best_params["lambda_l1"],77#lambda_l2=study.best_params["lambda_l2"],78#min_gain_to_split=study.best_params["min_gain_to_split"],79#bagging_fraction=study.best_params["bagging_fraction"],80#bagging_freq=study.best_params["bagging_freq"],81#feature_fraction=study.best_params["feature_fraction"],82random_state=120822)8384model1.fit(X_train,y_train)85y_pred_proba=model1.predict_proba(X_test)86score=roc_auc_score(y_test.values,y_pred_proba[:,1])87print(f'afteroptunaroc_auc_score={score}')88自動優(yōu)化代碼演示環(huán)節(jié)中的銀行真實數(shù)據(jù)實訓(xùn)任務(wù):某銀行實際數(shù)據(jù)進(jìn)行貸款違約預(yù)測52314.5實訓(xùn)任務(wù):某銀行實際數(shù)據(jù)進(jìn)行貸款違約預(yù)測1#實訓(xùn)任務(wù)2#################################3#LigthGBM模型4#################################5#--------------------------------------------------------6importdatetime7importpandasaspd89pd.set_option("display.max_columns",50)10#該數(shù)據(jù)集為zy銀行的個人貸款違約預(yù)測數(shù)據(jù)集,個別字段有做了脫敏(金融的數(shù)據(jù)大都涉及隱私保護(hù))。11#主要的特征字段有個人基本信息、經(jīng)濟(jì)能力、貸款歷史信息等等12#數(shù)據(jù)有10000條樣本,38維原始特征,其中isDefault為標(biāo)簽,是否逾期違約。13train_bank=pd.read_csv('./train_public.csv')1415print(train_bank.shape)1617#日期類型:issueDate轉(zhuǎn)換為pandas中的日期類型,加工出數(shù)值特征18train_bank['issue_date']=pd.to_datetime(train_bank['issue_date'])19#提取多尺度特征20train_bank['issue_date_y']=train_bank['issue_date'].dt.year21train_bank['issue_date_m']=train_bank['issue_date'].dt.month22#提取時間diff#轉(zhuǎn)換為天為單位23base_time=datetime.datetime.strptime('2000-01-01','%Y-%m-%d')#隨機設(shè)置初始的基準(zhǔn)時間24train_bank['issue_date_diff']=train_bank['issue_date'].apply(lambdax:x-base_time).dt.days25#可以發(fā)現(xiàn)earlies_credit_mon應(yīng)該是年份-月的格式,這里簡單提取年份26train_bank['earlies_credit_mon']=train_bank['earlies_credit_mon'].map(lambdax:int(sorted(x.split('-'))[0]))27print(train_bank.head())28利用以下程序分析某銀行個人貸款違約數(shù)據(jù)(“train_public.csv”)。程序通過對已有數(shù)據(jù)的分析和訓(xùn)練,生成LigthGBM模型。該模型可用于將來對銀行個人貸款客戶的違約情況進(jìn)行預(yù)測。14.5實訓(xùn)任務(wù):某銀行實際數(shù)據(jù)進(jìn)行貸款違約預(yù)測29#工作年限處理30train_bank['work_year'].fillna('10+years',inplace=True)3132work_year_map={'10+years':10,'2years':2,'<1year':0,'3years':3,'1year':1,33'5years':5,'4years':4,'6years':6,'8years':8,'7years':7,'9years':9}34train_bank['work_year']=train_bank['work_year'].map(work_year_map)3536train_bank['class']=train_bank['class'].map({'A':0,'B':1,'C':2,'D':3,'E':4,'F':5,'G':6})3738#缺失值處理39train_bank=train_bank.fillna('9999')4041#區(qū)分?jǐn)?shù)值或類別特征42drop_list=['isDefault','earlies_credit_mon','loan_id','user_id','issue_date']43num_feas=[]44cate_feas=[]45forcolintrain_bank.columns:46ifcolnotindrop_list:47try:48train_bank[col]=pd.to_numeric(train_bank[col])#轉(zhuǎn)為數(shù)值49num_feas.append(col)50except:51train_bank[col]=train_bank[col].astype('category')52cate_feas.append(col)5354print(cate_feas)55print(num_feas)5657利用以下程序分析某銀行個人貸款違約數(shù)據(jù)(“train_public.csv”)。程序通過對已有數(shù)據(jù)的分析和訓(xùn)練,生成LigthGBM模型。該模型可用于將來對銀行個人貸款客戶的違約情況進(jìn)行預(yù)測。58#ROC(ReceiverOperatingCharacteristic)曲線和AUC(AreaUndertheCurve)值59#常被用來評價一個二值分類器(binaryclassifier)的優(yōu)劣。60fromsklearn.metricsimportprecision_score,recall_score,f1_score,accuracy_score,\61roc_curve,auc,roc_auc_score,mean_squared_error6263importmatplotlib.pyplotasplt646566defmodel_metrics(model,x,y):67"""評估"""68yhat=model.predict(x)69yprob=model.predict_proba(x)[:,1]70fpr,tpr,_=roc_curve(y,yprob,pos_label=1)71metrics={'AUC':auc(fpr,tpr),'KS':max(tpr-fpr),72'f1':f1_score(y,yhat),'P':precision_score(y,yhat),'R':recall_score(y,yhat)}7374roc_auc=auc(fpr,tpr)#AUC(AreaunderCurve)75importmatplotlib7677#print(matplotlib.get_backend())會顯示正在使用的后端78#可行的backends有[‘GTK’,‘GTKAgg’,‘GTKCairo’,‘GTK3Agg’,‘GTK3Cairo’,‘MacOSX’,‘nbAgg’,‘Qt4Agg’,79#‘Qt4Cairo’,‘Qt5Agg’,‘Qt5Cairo’,‘TkAgg’,‘TkCairo’,‘WebAgg’,‘WX’,‘WXAgg’,‘WXCairo’,80#‘a(chǎn)gg’,‘cairo’,‘gdk’,‘pdf’,‘pgf’,‘ps’,‘svg’,‘template’]81#用這個TkAgg不會報警告錯誤,否則matplotlib3.6采用backend_interagg后端會報警告信息82matplotlib.use('TkAgg')8384#k表示黑色lw:線條寬度(linewidth)ls:線條風(fēng)格(linestyle)85plt.plot(fpr,tpr,color='k',label='ROC(area={0:.2f})'.format(roc_auc),lw=2,ls='--')8687plt.xlim([-0.05,1.05])#設(shè)置x、y軸的上下限,以免和邊緣重合,更好的觀察圖像的整體88plt.ylim([-0.05,1.05])89plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標(biāo)簽90plt.rcParams['axes.unicode_minus']=False#用來正常顯示負(fù)號91plt.xlabel('FalsePositiveRate(假陽性率)')92plt.ylabel('TruePositiveRate(真陽性率)')93plt.title('ROCCurve\n(接受者操作特征曲線ReceiverOperatingCharacteristic)')94plt.legend(loc="lowerright")9596returnmetrics979899#劃分?jǐn)?shù)據(jù)集:訓(xùn)練集和測試集100fromsklearn.model_selectionimporttrain_test_split101102train_x,test_x,train_y,test_y\103=train_test_split(train_bank[num_feas+cate_feas],train_bank.isDefault,104test_size=0.3,random_state=0)105#選擇模型--LigthGBM106#訓(xùn)練模型107(_________________________________________)108109#LGBMClassifier參數(shù)110#1.boosting_type=‘gbdt’#提升樹的類型gbdt,dart,goss,rf111#2.num_leavel=32#樹的最?葉?數(shù),對?xgboost?般為2^(max_depth)112#3.max_depth=-1#最?樹的深度113#4.learning_rate#學(xué)習(xí)率114#5.n_estimators=10:擬合的樹的棵樹,相當(dāng)于訓(xùn)練輪數(shù)115#6.subsample=1.0:訓(xùn)練樣本采樣率?116#7.colsample_bytree=1.0:訓(xùn)練特征采樣率列117#8.subsample_freq=1:?樣本頻率118#9.reg_alpha=0.0:L1正則化系數(shù)119#10.reg_lambda=0.0:L2正則化系數(shù)120#11.random_state=None:隨機種?數(shù)121#12.n_jobs=-1:并?運?多線程核?數(shù)122#13.silent=True:訓(xùn)練過程是否打印?志信息123#14.min_split_gain=0.0:最?分割增益124#15.min_child_weight=0.001:分?結(jié)點的最?權(quán)重125lgb=LGBMClassifier(n_estimators=5,num_leaves=5,class_weight='balanced',metric='AUC')126lgb.fit(train_x,train_y)127128print('train',(______________________________))129print('test',(______________________________))130plt.show()14.5實訓(xùn)任務(wù):某銀行實際數(shù)據(jù)進(jìn)行貸款違約預(yù)測131#lightGBM是2017年1月,微軟在GItHub上開源的一個新的梯度提升框架。132#在開源之后,就被別人冠以“速度驚人”、“支持分布式”、“代碼清晰易懂”、“占用內(nèi)存小”等屬性。#133#LightGBM主打的高效并行訓(xùn)練讓其性能超越現(xiàn)有其他boosting工具。在Higgs數(shù)據(jù)集上的試驗表明,134#LightGBM比XGBoost快將近10倍,內(nèi)存占用率大約為XGBoost的1/6。135#LightGBM是一個算法框架,包括GBDT模型、隨機森林和邏輯回歸等模型。通常應(yīng)用于二分類、多分類和排序等場景。136#LightGBM是一個梯度Boosting框架,使用基于決策樹的學(xué)習(xí)算法。137138importmatplotlib139matplotlib.use('TkAgg')#點擊圖形菜單選項調(diào)節(jié)圖片左邊距即可看到全圖140fromlightgbmimportplot_importance141142plt.rcParams['figure.figsize']=(38,4)143fig,ax=plt.subplots(figsize=(15,5))144plot_importance(lgb,#modelname145height=0.5,146ax=ax,147max_num_features=64)148plt.show()14915014.5實訓(xùn)任務(wù):某銀行實際數(shù)據(jù)進(jìn)行貸款違約預(yù)測課后習(xí)題629課后習(xí)題習(xí)題11.鳶尾花數(shù)據(jù)集Iris是機器學(xué)習(xí)和統(tǒng)計學(xué)中的一個經(jīng)典數(shù)據(jù)。假設(shè)有一朵鳶尾花數(shù)據(jù)為[6.6,2.5,4.3,1.3],請用模型預(yù)測它屬于哪一種類的鳶尾花。習(xí)題22.本練習(xí)將繼續(xù)對鳶尾花數(shù)據(jù)集進(jìn)行分析和建模,以幫助理解lightGBM的原生接口的概念。與xgboost類似,LightGBM包含原生接口和sklearn風(fēng)格接口兩種,并且二者都實現(xiàn)了分類和回歸的功能。運行l(wèi)ightgbm算法代碼顯示鳶尾花四大特征的重要性排序圖。課后習(xí)題30謝謝觀賞31第15章金融機構(gòu)電話營銷數(shù)據(jù)分析Python數(shù)據(jù)分析與應(yīng)用32機器學(xué)習(xí)CONTENTS15.1知識準(zhǔn)備15.2任務(wù)介紹15.3代碼演示15.4代碼補全和知識拓展目錄15.5實訓(xùn)任務(wù)33知識準(zhǔn)備134基于金融預(yù)測的比賽在Kaggle上較為常見:分別是JPX的東京證券交易所預(yù)測,Ubiquant的市場預(yù)測以及G-Research的加密預(yù)測。Python是競賽獲勝者的首選語言,而成功參賽者的工具選擇往往是:Python、Pydata、Pytorch和梯度提高的決策樹。深度學(xué)習(xí)仍未完全取代梯度增強的決策樹。入門機器學(xué)習(xí)和深度學(xué)習(xí)Kaggle(/)平臺成立于2010年,是一個進(jìn)行數(shù)據(jù)發(fā)掘和預(yù)測競賽的在線競賽平臺。企業(yè)或者研究者可以在平臺上發(fā)布有獎競賽項目。即通過將競賽數(shù)據(jù)集、問題描述、期望的解決結(jié)果和評價指標(biāo)發(fā)布到Kaggle平臺上,以競賽的形式向廣大的數(shù)據(jù)專家和愛好者征集解決方案,類似于KDD-CUP(國際知識發(fā)現(xiàn)和數(shù)據(jù)挖掘競賽)。15.1.1Kaggle數(shù)據(jù)建模大賽阿里云平臺素以舉辦“國際化”、“高端化”、“智能化”的算法比賽在行業(yè)著稱,自2014年推出以來,已相繼有98個國家、30萬開發(fā)者參與,成為一個電商、金融、物流、電力、工業(yè)制造、醫(yī)療等領(lǐng)域創(chuàng)新方案的新發(fā)源地?!鞍⒗镌铺斐亍贝筚愭溄訕I(yè)界最新的技術(shù),提供行業(yè)真實一手賽題和數(shù)據(jù),非常值得學(xué)界關(guān)注15.1.2中國的競賽平臺:阿里云天池大賽知識準(zhǔn)備任務(wù)介紹236以電話營銷為例,銀行營銷經(jīng)理經(jīng)常需要撥打電話給潛在客戶推薦銀行的各類產(chǎn)品,但是也常常遇到多數(shù)接到電話的客戶對所推銷的產(chǎn)品并不感興趣,往往不接聽電話或者即便接聽之后也很快在幾秒鐘之后就掛斷了電話。為了提升營銷的效率,實現(xiàn)精準(zhǔn)營銷,需要提升銀行經(jīng)理撥打電話的接聽率,同時也可以節(jié)省撥打無謂的電話浪費的人力成本。任務(wù)介紹葡萄牙銀行采用機器學(xué)習(xí)方法優(yōu)化了電話營銷的流程,具體的做法是在撥打電話之前,首先從4萬多潛在客戶中挑選出具有極大概率會接聽電話的客戶,營銷經(jīng)理只給這些機器選出的接聽成功率高的客戶撥打電話開展?fàn)I銷活動,而不是像傳統(tǒng)營銷一樣,不進(jìn)行任何分析直接給4萬多客戶逐一撥打電話,可以極大提升營銷效率、獲得較優(yōu)的營銷效果。本次任務(wù)的目的就是要建立一個客戶是否接受存款產(chǎn)品的模型,而這個模型的建立是通過機器學(xué)習(xí)的方式,使用已有的數(shù)據(jù)對模型進(jìn)行訓(xùn)練而完成的。簡單而言就是用數(shù)據(jù)訓(xùn)練模型,然后獲得一個有預(yù)測能力的模型。本次訓(xùn)練模型將使用的數(shù)據(jù)集來自葡萄牙銀行機構(gòu)的(電話)直銷活動的真實數(shù)據(jù),經(jīng)過脫敏之后可以被公開使用。本次電話直銷活動的數(shù)據(jù)分析目標(biāo)是對4萬多客戶進(jìn)行分類,目的是預(yù)測客戶是否會接聽電話之后認(rèn)購定期存款(設(shè)定目標(biāo)變量為y,即y=1表示客戶會認(rèn)購銀行的定期存款,y=0則客戶不會認(rèn)購)。該數(shù)據(jù)集名稱為“bankadditionalfull.csv”,它由41188條數(shù)據(jù)組成,其中含有20個自變量。銀行客戶數(shù)據(jù)20個自變量(其中10個是數(shù)字特征,10個是分類特征)代碼演示3382312代碼演示一般在建模之前,通常需要對數(shù)據(jù)本身進(jìn)行一些了解、考察和分析,這被稱為EDA(ExploratoryDataAnalysis)#=========================================#1.ExploratoryDataAnalysis(探索性數(shù)據(jù)分析)#=========================================plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標(biāo)簽plt.rcParams['axes.unicode_minus']=False#用來正常顯示負(fù)號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('人數(shù)占比(總?cè)藬?shù)約4萬)')plt.show()2312代碼演示一般在建模之前,通常需要對數(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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論