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() #显示新的特征集
结果如下:
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)
输出结果为银行客户是否会流失的预测标签,后续可以继续计算客户流失判断的准确率和流失率。