python-客户流失预警预测建模分析(实战)

项目实施目的:

当前行业竞争异常激烈,获客成本愈来愈昂贵,公司本着最大化增加营收,较少支出的前提下开始促销活动,为了全量了解客户增长情况,阶段性去关怀老客户,最终想看下那些用户会有流失倾向,及具备那些流失特征。

项目实施流程:
(1):导入相关库及数据
(2):做特征工程处理
(3):建模型比较:逻辑回归/朴素贝叶斯/支持向量机/决策树/随机森林/XGBoost
(4):模与模型评估
(5):提取流失重要特征
(6):输出流失结论清单

2.2 导入相关库及数据

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

显示全部特征

df = pd.read_csv('D:\曾海峰\回归分析相关\新建文件夹\bankload.csv',encoding='gbk')
df.head()

查看数据维度

df.shape

查看数据类型

df.info()

查看缺失值占比

df.isnull().mean()

查看标签分布

df['违约'].value_counts()

描述性统计

df.describe()

三、特征工程

将数据copy一份

rawdf=df.copy()

3.1 数据预处理

3.1.1 数据类型转换

3.4 数据标准化

数据标准化

from sklearn.preprocessing import StandardScaler

y=rawdf['违约']
x=rawdf.drop('违约',axis=1)

scaler = StandardScaler()
scaler.fit(x)

X= scaler.transform(x)

四、建模与模型评估

数据集的划分原则上应当在缺失值和异常值处理之前就进行,也就是说从数据预处理阶段开始,验证集和测试集就不应参与到模型构建的各个阶段中来,而应仅使用训练集得到的信息,这样才能有效严谨的保证模型验证和评估不会出现潜在的过拟合问题。

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) # 训练模型
y_prob = lr.predict_proba(X_test)[:,1] # 预测1类的概率
y_pred = lr.predict(X_test) # 模型对测试集的预测结果
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) # 模型准确率
print('模型准确率为:{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) # 训练模型
y_prob = gnb.predict_proba(X_test)[:,1] # 预测1类的概率
y_pred = gnb.predict(X_test) # 模型对测试集的预测结果
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) # 模型准确率
print('模型准确率为:{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 支持向量机

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) # 模型对测试集的预测结果
fpr_svc,tpr_svc,threshold_svc = metrics.roc_curve(y_test,y_prob) # 获取真阳率、伪阳率、阈值
auc_svc = metrics.auc(fpr_svc,tpr_svc) # 模型准确率
score_svc = metrics.accuracy_score(y_test,y_pred)
print('模型准确率为:{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) # 训练模型
y_prob = dtc.predict_proba(X_test)[:,1] # 预测1类的概率
y_pred = dtc.predict(X_test) # 模型对测试集的预测结果
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('模型准确率为:{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 随机森林

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier() # 建立随机森林分类器
rfc.fit(X_train,y_train) # 训练随机森林模型
y_prob = rfc.predict_proba(X_test)[:,1] # 预测1类的概率
y_pred=rfc.predict(X_test) # 模型对测试集的预测结果
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) # 模型准确率
print('模型准确率为:{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

读入训练数据集和测试集

dtrain=xgb.DMatrix(X_train,y_train)
dtest=xgb.DMatrix(X_test)

设置xgboost建模参数

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}

训练模型

watchlist = [(dtrain,'train')]
bst=xgb.train(params,dtrain,num_boost_round=500,evals=watchlist)

输入预测为正类的概率值

y_prob=bst.predict(dtest)

设置阈值为0.5,得到测试集的预测结果

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) # 模型准确率
print('模型准确率为:{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)) # 支持向量机
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)) # 随机森林
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:\曾海峰\回归分析相关\新建文件夹\模型比较图.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:\曾海峰\回归分析相关\新建文件夹\.重要特征图.jpg',dpi=400, bbox_inches='tight')
plt.show()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335