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