Voting_Averaging算法预测银行客户流失率

描述

为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大。以便银行的客户服务部门更加有针对性的去挽留这些流失的客户。

本任务的实践内容包括:

1、学习并熟悉Voting/Averaging算法原理。

2、使用Voting、Averaging算法预测银行客户流失率。

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04
  • 工具软件:Anaconda3 2019、Python3.7
  • 硬件环境:无特殊要求
  • 依赖库列表
scikit-learn	1.0.2
numpy           1.19.3
pandas          1.3.5

分析

本任务涉及以下环节:

A)熟悉Voting/Averaging算法原理

B)加载并观察银行客户

C)创建随机森林模型、梯度提升算法模型、极端随机森林模型、XGBoost模型、AdaBoost模型并对以上模型进行训练和预测

D)基于以上模型创建Voting模型,并进行训练和预测,评估模型性能

E)实现Averaging算法的预测结果

实施

1、Voting/Averaging算法原理

1.1 Voting算法

Voting就是投票的意思。这种集成算法一般应用于分类问题。思路很简单。假如用6种机器学习模型来进行分类预测,就拥有6个预测结果集,那么6种模型,一种模型一票。如果是猫狗图像分类,4种模型被认为是猫,2种模型被认为是狗,那么集成的结果会是猫。当然,如果出现票数相等的情况(3票对3票),那么分类概率各为一半。

1.2 Averaging算法

Averaging更为简单粗暴,其思想就是完全独立地进行几种机器学习模型的训练,训练好之后生成预测结果,最后把各个预测结果集进行平均。

以下分别用两种算法实现银行客户流失问题的预测。

2、加载分析银行客户数据集

import numpy as np # 基础线性代数扩展包
import pandas as pd # 数据处理工具箱
df_bank = pd.read_csv("../dataset/BankCustomer.csv") # 读取文件
df_bank.head() # 显示文件前5行

结果如下:

基于机器学习的银行客户流失预测 银行客户流失率_基于机器学习的银行客户流失预测

数据集特征说明:

  • name:客户姓名
  • Gender:客户性别
  • Age:客户年龄
  • City:城市
  • Tenure:用户时长
  • ProductsNo:使用产品数量
  • HasCard:是否拥有信用卡
  • ActiveMember:是否为活跃会员
  • Credit:信用评分
  • AccountBal:账户余额
  • Salary:薪资
  • Exited(标签):是否流失,1代表流失,0代表没有流失

3、数据处理

将二元数据文本化,创建数据集。

# 把二元类别文本数字化
df_bank['Gender'].replace("Female",0,inplace = True)
df_bank['Gender'].replace("Male",1,inplace=True)

# 显示数字类别
print("Gender unique values",df_bank['Gender'].unique())

# 把多元类别转换成多个二元哑变量,然后贴回原始数据集
d_city = pd.get_dummies(df_bank['City'], prefix = "City")
df_bank = [df_bank, d_city]
df_bank = pd.concat(df_bank, axis = 1)

# 构建特征和标签集合
y = df_bank['Exited']
X = df_bank.drop(['Name', 'Exited', 'City'], axis=1)
X.head() #显示新的特征集

结果如下:

基于机器学习的银行客户流失预测 银行客户流失率_基于机器学习的银行客户流失预测_02

4、拆分数据集

使用sklearn.model_selection.train_test_split()方法将数据集划分为训练集和测试集。

from sklearn.model_selection import train_test_split # 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                   test_size=0.2, random_state=0)

5、随机森林模型

创建随机森林模型,对模型进行训练和预测。

from sklearn.ensemble import RandomForestClassifier # 导入随机森林分类器
from sklearn.model_selection import GridSearchCV # 导入网格搜索工具
from sklearn.metrics import (f1_score, confusion_matrix) # 导入评估标准
from sklearn.tree import DecisionTreeClassifier # 导入决策树分类器
rf = RandomForestClassifier() # 随机森林模型
# 使用网格搜索优化参数
rf_param_grid = {"max_depth": [None],
              "max_features": [1, 3, 10],
               "min_samples_split": [2, 3, 10],
               "min_samples_leaf": [1, 3, 10],
              "bootstrap": [True,False],
              "n_estimators" :[100,300],
              "criterion": ["gini"]}
rf_gs = GridSearchCV(rf,param_grid = rf_param_grid, 
                     scoring="f1", n_jobs= 10, verbose = 1)
rf_gs.fit(X_train,y_train) # 拟合模型
rf_gs = rf_gs.best_estimator_ # 最佳模型
y_pred1 = rf_gs.predict(X_test) # 进行预测

6、梯度提升算法模型

创建梯度提升算法模型,对模型进行训练和预测。

from sklearn.ensemble import RandomForestClassifier # 导入随机森林分类器
from sklearn.model_selection import GridSearchCV # 导入网格搜索工具
from sklearn.metrics import (f1_score, confusion_matrix) # 导入评估标准
from sklearn.tree import DecisionTreeClassifier # 导入决策树分类器
rf = RandomForestClassifier() # 随机森林模型
# 使用网格搜索优化参数
rf_param_grid = {"max_depth": [None],
              "max_features": [1, 3, 10],
               "min_samples_split": [2, 3, 10],
               "min_samples_leaf": [1, 3, 10],
              "bootstrap": [True,False],
              "n_estimators" :[100,300],
              "criterion": ["gini"]}
rf_gs = GridSearchCV(rf,param_grid = rf_param_grid, 
                     scoring="f1", n_jobs= 10, verbose = 1)
rf_gs.fit(X_train,y_train) # 拟合模型
rf_gs = rf_gs.best_estimator_ # 最佳模型
y_pred1 = rf_gs.predict(X_test) # 进行预测

7、极端随机森林模型

创建极端随机森林模型,对模型进行训练和预测。

from sklearn.ensemble import ExtraTreesClassifier # 导入极端随机森林模型
ext = ExtraTreesClassifier() # 极端随机森林模型
# 使用网格搜索优化参数
ext_param_grid = {"max_depth": [None],
              "max_features": [1, 3, 10],
              "min_samples_split": [2, 3, 10],
              "min_samples_leaf": [1, 3, 10],
              "bootstrap": [True,False],
              "n_estimators" :[100,300],
              "criterion": ["gini"]}
ext_gs = GridSearchCV(ext,param_grid = ext_param_grid, scoring="f1", 
                     n_jobs= 4, verbose = 1)
ext_gs.fit(X_train,y_train) # 拟合模型
ext_gs = ext_gs.best_estimator_ # 最佳模型
y_pred3 = ext_gs.predict(X_test) # 进行预测

8、XGBoost模型

创建XGBoost模型,对模型进行训练和预测。

from xgboost import XGBClassifier # 导入XGB分类器
xgb = XGBClassifier() # XGB分类器
# 使用网格搜索优化参数
xgb_param_grid = {'min_child_weight': [1, 5, 10],
                  'gamma': [0.5, 1, 1.5, 2, 5],
                  'subsample': [0.6, 0.8, 1.0],
                  'colsample_bytree': [0.6, 0.8, 1.0],
                  'max_depth': [3, 4, 5]}
xgb_gs = GridSearchCV(xgb,param_grid = xgb_param_grid,  
                     scoring="f1", n_jobs= 10, verbose = 1)
xgb_gs.fit(X_train,y_train) # 拟合模型
xgb_gs = xgb_gs.best_estimator_ # 最佳模型
y_pred4 = xgb_gs.predict(X_test) # 进行预测

9、AdaBoost模型

创建AdaBoost模型,对模型进行训练和预测。

from sklearn.ensemble import AdaBoostClassifier # 导入AdaBoost模型
dt = DecisionTreeClassifier() # 选择决策树分类器作为AdaBoost的基准算法
ada = AdaBoostClassifier(dt) # AdaBoost模型
# 使用网格搜索优化参数
ada_param_grid = {"base_estimator__criterion" : ["gini", "entropy"],
                  "base_estimator__splitter" :   ["best", "random"],
                  "base_estimator__random_state" :   [7,9,10,12,15],
                  "algorithm" : ["SAMME","SAMME.R"],
                  "n_estimators" :[1,2,5,10],
                  "learning_rate":  [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3,1.5]}
ada_gs = GridSearchCV(ada,param_grid = ada_param_grid, 
                        scoring="f1", n_jobs= 10, verbose = 1)
ada_gs.fit(X_train,y_train) # 拟合模型
ada_gs = ada_gs.best_estimator_ # 最佳模型
y_pred5 = ada_gs.predict(X_test) # 进行预测

10、Voting算法实现

创建Voting算法模型,集合上述随机森林模型、梯度提升算法模型、极端随机森林模型、XGBoost模型、AdaBoost模型。对模型进行训练和预测,得出模型的准确率和F1分数。

from sklearn.ensemble import VotingClassifier

voting = VotingClassifier(estimators=[('rf', rf_gs), ('gb', gb_gs), ('ext', ext_gs), ('xgb', xgb_gs), ('ada', ada_gs)], voting='soft', n_jobs=10)
voting = voting.fit(X_train, y_train) # 拟合模型
y_pred = voting.predict(X_test)  # 进行预测

print("Voting测试准确率:{:.2f}%".format(voting.score(X_test, y_test) * 100))
print("Voting测试F1分数:{:.2f}%".format(f1_score(y_test, y_pred) * 100))

结果如下:

Voting测试准确率:86.05%
Voting测试F1分数:59.39%

11、Averaging算法实现

Averaging算法是对上述模型的预测结果进行平均,代码如下:

pred_final = (y_pred1 + y_pred2 + y_pred3 + y_pred4 + y_pred5) / 5  # 对预测结果进行平均
pred_final = np.around(pred_final)    # 因为平均后的值为浮点数,而标签为整数,所以进行四舍五入,四舍五入后的数据仍然为浮点
pred_final = pred_final.astype(int)   # 转换为整形

for i in pred_final:
    print(i)

输出结果为银行客户是否会流失的预测标签,后续可以继续计算客户流失判断的准确率和流失率。