項目實施目的:
當(dāng)前行業(yè)競爭異常激烈,獲客成本愈來愈昂貴,公司本著最大化增加營收,較少支出的前提下開始促銷活動,為了全量了解客戶增長情況溯乒,階段性去關(guān)懷老客戶观腊,最終想看下那些用戶會有流失傾向,及具備那些流失特征外恕。
項目實施流程:
(1):導(dǎo)入相關(guān)庫及數(shù)據(jù)
(2):做特征工程處理
(3):建模型比較:邏輯回歸/樸素貝葉斯/支持向量機(jī)/決策樹/隨機(jī)森林/XGBoost
(4):模與模型評估
(5):提取流失重要特征
(6):輸出流失結(jié)論清單
2.2 導(dǎo)入相關(guān)庫及數(shù)據(jù)
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
顯示全部特征
df = pd.read_csv('D:\曾海峰\回歸分析相關(guān)\新建文件夾\bankload.csv',encoding='gbk')
df.head()
查看數(shù)據(jù)維度
df.shape
查看數(shù)據(jù)類型
df.info()
查看缺失值占比
df.isnull().mean()
查看標(biāo)簽分布
df['違約'].value_counts()
描述性統(tǒng)計
df.describe()
三牵署、特征工程
將數(shù)據(jù)copy一份
rawdf=df.copy()
3.1 數(shù)據(jù)預(yù)處理
3.1.1 數(shù)據(jù)類型轉(zhuǎn)換
3.4 數(shù)據(jù)標(biāo)準(zhǔn)化
數(shù)據(jù)標(biāo)準(zhǔn)化
from sklearn.preprocessing import StandardScaler
y=rawdf['違約']
x=rawdf.drop('違約',axis=1)
scaler = StandardScaler()
scaler.fit(x)
X= scaler.transform(x)
四、建模與模型評估
數(shù)據(jù)集的劃分原則上應(yīng)當(dāng)在缺失值和異常值處理之前就進(jìn)行凳枝,也就是說從數(shù)據(jù)預(yù)處理階段開始,驗證集和測試集就不應(yīng)參與到模型構(gòu)建的各個階段中來跋核,而應(yīng)僅使用訓(xùn)練集得到的信息岖瑰,這樣才能有效嚴(yán)謹(jǐn)?shù)谋WC模型驗證和評估不會出現(xiàn)潛在的過擬合問題。
from sklearn.model_selection import train_test_split, GridSearchCV
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size= 0.2,random_state=420)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn import metrics
4.1 邏輯回歸
lr = LogisticRegression() # 實例化一個LR模型
lr.fit(X_train,y_train) # 訓(xùn)練模型
y_prob = lr.predict_proba(X_test)[:,1] # 預(yù)測1類的概率
y_pred = lr.predict(X_test) # 模型對測試集的預(yù)測結(jié)果
fpr_lr,tpr_lr,threshold_lr = metrics.roc_curve(y_test,y_prob) # 獲取真陽率砂代、偽陽率蹋订、閾值
auc_lr = metrics.auc(fpr_lr,tpr_lr) # AUC得分
score_lr = metrics.accuracy_score(y_test,y_pred) # 模型準(zhǔn)確率
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_lr,auc_lr))
print('============================================================')
print(classification_report(y_test,y_pred,labels=None,target_names=None,sample_weight=None, digits=2))
4.2 樸素貝葉斯
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB() # 實例化一個LR模型
gnb.fit(X_train,y_train) # 訓(xùn)練模型
y_prob = gnb.predict_proba(X_test)[:,1] # 預(yù)測1類的概率
y_pred = gnb.predict(X_test) # 模型對測試集的預(yù)測結(jié)果
fpr_gnb,tpr_gnb,threshold_gnb = metrics.roc_curve(y_test,y_prob) # 獲取真陽率、偽陽率刻伊、閾值
auc_gnb = metrics.auc(fpr_gnb,tpr_gnb) # AUC得分
score_gnb = metrics.accuracy_score(y_test,y_pred) # 模型準(zhǔn)確率
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_gnb,auc_gnb))
print('============================================================')
print(classification_report(y_test, y_pred, labels=None, target_names=None, sample_weight=None, digits=2))
4.3 支持向量機(jī)
from sklearn.svm import SVC
svc = SVC(kernel='rbf',C=1,max_iter=100).fit(X_train,y_train)
y_prob = svc.decision_function(X_test) # 決策邊界距離
y_pred = svc.predict(X_test) # 模型對測試集的預(yù)測結(jié)果
fpr_svc,tpr_svc,threshold_svc = metrics.roc_curve(y_test,y_prob) # 獲取真陽率露戒、偽陽率、閾值
auc_svc = metrics.auc(fpr_svc,tpr_svc) # 模型準(zhǔn)確率
score_svc = metrics.accuracy_score(y_test,y_pred)
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_svc,auc_svc))
print('============================================================')
print(classification_report(y_test, y_pred, labels=None, target_names=None, sample_weight=None, digits=2))
4.4 決策樹
from sklearn import tree
dtc = tree.DecisionTreeClassifier() # 建立決策樹模型
dtc.fit(X_train,y_train) # 訓(xùn)練模型
y_prob = dtc.predict_proba(X_test)[:,1] # 預(yù)測1類的概率
y_pred = dtc.predict(X_test) # 模型對測試集的預(yù)測結(jié)果
fpr_dtc,tpr_dtc,threshod_dtc= metrics.roc_curve(y_test,y_prob) # 獲取真陽率捶箱、偽陽率智什、閾值
score_dtc = metrics.accuracy_score(y_test,y_pred)
auc_dtc = metrics.auc(fpr_dtc,tpr_dtc)
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_dtc,auc_dtc))
print('============================================================')
print(classification_report(y_test,y_pred,labels=None,target_names=None,sample_weight=None, digits=2))
4.5 隨機(jī)森林
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier() # 建立隨機(jī)森林分類器
rfc.fit(X_train,y_train) # 訓(xùn)練隨機(jī)森林模型
y_prob = rfc.predict_proba(X_test)[:,1] # 預(yù)測1類的概率
y_pred=rfc.predict(X_test) # 模型對測試集的預(yù)測結(jié)果
fpr_rfc,tpr_rfc,threshold_rfc = metrics.roc_curve(y_test,y_prob) # 獲取真陽率、偽陽率丁屎、閾值
auc_rfc = metrics.auc(fpr_rfc,tpr_rfc) # AUC得分
score_rfc = metrics.accuracy_score(y_test,y_pred) # 模型準(zhǔn)確率
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_rfc,auc_rfc))
print('============================================================')
print(classification_report(y_test,y_pred,labels=None,target_names=None,sample_weight=None, digits=2))
4.6 XGBoost
import xgboost as xgb
讀入訓(xùn)練數(shù)據(jù)集和測試集
dtrain=xgb.DMatrix(X_train,y_train)
dtest=xgb.DMatrix(X_test)
設(shè)置xgboost建模參數(shù)
params={'booster':'gbtree','objective': 'binary:logistic','eval_metric': 'auc',
'max_depth':8,'gamma':0,'lambda':2,'subsample':0.7,'colsample_bytree':0.8,
'min_child_weight':3,'eta': 0.2,'nthread':8,'silent':1}
訓(xùn)練模型
watchlist = [(dtrain,'train')]
bst=xgb.train(params,dtrain,num_boost_round=500,evals=watchlist)
輸入預(yù)測為正類的概率值
y_prob=bst.predict(dtest)
設(shè)置閾值為0.5荠锭,得到測試集的預(yù)測結(jié)果
y_pred = (y_prob >= 0.5)*1
獲取真陽率、偽陽率晨川、閾值
fpr_xgb,tpr_xgb,threshold_xgb = metrics.roc_curve(y_test,y_prob)
auc_xgb = metrics.auc(fpr_xgb,tpr_xgb) # AUC得分
score_xgb = metrics.accuracy_score(y_test,y_pred) # 模型準(zhǔn)確率
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_xgb,auc_xgb))
print('============================================================')
print(classification_report(y_test,y_pred,labels=None,target_names=None,sample_weight=None, digits=2))
4.7 模型比較
plt.style.use('bmh')
plt.figure(figsize=(13,10))
plt.plot(fpr_lr,tpr_lr,label='lr: {0:.3f}'.format(score_lr)) # 邏輯回歸
plt.plot(fpr_gnb,tpr_gnb,label='gnb:{0:.3f}'.format(score_gnb)) # 樸素貝葉斯
plt.plot(fpr_svc,tpr_svc,label='svc:{0:.3f}'.format(score_svc)) # 支持向量機(jī)
plt.plot(fpr_dtc,tpr_dtc,label='dtc:{0:.3f}'.format(score_dtc)) # 決策樹
plt.plot(fpr_rfc,tpr_rfc,label='rfc:{0:.3f}'.format(score_rfc)) # 隨機(jī)森林
plt.plot(fpr_rfc,tpr_rfc,label='xgb:{0:.3f}'.format(score_xgb)) # XGBoost
plt.legend(loc='lower right',prop={'size':25})
plt.xlabel('偽陽率')
plt.ylabel('真陽率')
plt.title('ROC曲線')
plt.savefig('D:\曾海峰\回歸分析相關(guān)\新建文件夾\模型比較圖.jpg',dpi=400, bbox_inches='tight')
plt.show()
4.8 重要特征
from xgboost import plot_importance
fig,ax = plt.subplots(figsize=(15,15))
plot_importance(bst,height=0.5,ax=ax,max_num_features=40,color='chocolate')
plt.savefig('D:\曾海峰\回歸分析相關(guān)\新建文件夾\.重要特征圖.jpg',dpi=400, bbox_inches='tight')
plt.show()