python-客戶流失預(yù)警預(yù)測建模分析(實戰(zhàn))

項目實施目的:

當(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末证九,一起剝皮案震驚了整個濱河市删豺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愧怜,老刑警劉巖呀页,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拥坛,居然都是意外死亡蓬蝶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門猜惋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸氛,“玉大人,你說我怎么就攤上這事惨奕⊙┪唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵梨撞,是天一觀的道長雹洗。 經(jīng)常有香客問我,道長卧波,這世上最難降的妖魔是什么时肿? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮港粱,結(jié)果婚禮上螃成,老公的妹妹穿的比我還像新娘。我一直安慰自己查坪,他們只是感情好寸宏,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偿曙,像睡著了一般氮凝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上望忆,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天罩阵,我揣著相機(jī)與錄音,去河邊找鬼启摄。 笑死稿壁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歉备。 我是一名探鬼主播傅是,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了落午?” 一聲冷哼從身側(cè)響起谎懦,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肚豺,失蹤者是張志新(化名)和其女友劉穎溃斋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吸申,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梗劫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了截碴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳侨。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖日丹,靈堂內(nèi)的尸體忽然破棺而出走哺,到底是詐尸還是另有隱情,我是刑警寧澤哲虾,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布丙躏,位于F島的核電站,受9級特大地震影響束凑,放射性物質(zhì)發(fā)生泄漏晒旅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一汪诉、第九天 我趴在偏房一處隱蔽的房頂上張望废恋。 院中可真熱鬧,春花似錦扒寄、人聲如沸鱼鼓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄本。三九已至,卻和暖如春上渴,著一層夾襖步出監(jiān)牢的瞬間岸梨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工稠氮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留曹阔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓隔披,卻偏偏與公主長得像赃份,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348