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

news2024/11/25 6:33:28

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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大型互联网应用轻量级架构实战の一】轻量级架构概述

1、轻量级架构概述 1.1.1、前言 当下,互联网应用呈高速发展的趋势,要想不被市场淘汰,就必须与时间赛跑,故而,快 就成了所有互联网公司产品的特征,只有率先推出产品,才能获取主动权。 1.1.2、…

大模型时代下的paper生存= =

第一类:PEFT类论文 (我还挺喜欢的,不知道自己什么时候可以搞出这种工作 (为什么中英文穿插,利于自己写论文:) COMPOSITIONAL P ROMPT T UNING WITH M OTIONC UES FOR O PEN - VOCABULARY V ID…

构建数字时代下的必要防线 消除医疗行业数据安全建设“盲区”

4月7日,由厦门市卫生健康信息学会和厦门大学附属第一医院、厦门服云信息科技有限公司举办的医疗数据安全学术研讨会顺利开展。 作为国内云原生安全领导厂商,安全狗除了协助举办此次活动,还以数据安全治理专家的身份参与演讲分享。 厦门服云…

全网最详细,Jmeter性能测试-性能进阶, 无界面命令运行CLI模式(六)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 如果使用jmeter.bat…

代码随想录算法训练营第四十一天-动态规划3|343. 整数拆分 ,96.不同的二叉搜索树

343整数拆分,有两种解法,一种是数学的方法,利用当f>4时,2*(f - 2)2f - 4 > f的性质,将所有的因子都拆成3,最后的余数再乘进去。另外一种是动态规划,把前面的数拆了…

算法---文件的最长绝对路径

题目 假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例: 这里将 dir 作为根目录中的唯一目录。dir 包含两个子目录 subdir1 和 subdir2 。subdir1 包含文件 file1.ext 和子目录 subsubdir1;subdir2 包含子目录 subsubdir2&…

PHP快速入门11-文件操作,附写入文件、文件重命名等20个高频使用案例

文章目录前言一、文件操作介绍二、 20个文件操作的例子2.1 打开文件并写入数据2.2 读取文件中的一行数据2.3 读取文件中的一个字符2.4 读取整个文件内容2.5 向文件写入内容2.6 将整个文件读入一个数组中2.7 删除文件2.8 重命名文件2.9 复制文件2.10 判断是否为文件2.11 判断是否…

【致敬未来的攻城狮计划】RA2E1环境搭建点亮发光二极管

开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯和 瑞萨MCU (瑞萨电子 (Renesas Electronics Corporation) ) 联合发起的「 致敬未来的攻城狮计划 」的第 2 天,点击查看活动计划详情 ! 开发环境搭建 开…

React styled-components(三)—— 高级特性

styled-components 高级特性样式继承嵌套设置主题样式继承 新建 Demo.js 文件: import React, { Component } from react import styled from styled-components;const CustomStyle styled.divp { color: red;} const ContextBox styled(CustomStyle)width:…

Tableau-创建环状图:使用2个饼图

步骤 1:创建饼图 在“标记”下面,选择“饼图”标记类型。将分类拖到颜色。将任务总数拖到角度。再拖动一次任务总数,放到标签。根据需要调整饼图大小。 步骤 2:切换到双轴图表 右键点击任意一个字段,创建-->计算…

3年功能测试无情被裁,3个月学习自动化测试重新开始........

前言 不知不觉在软件测试行业工作了3年之久,虽然说我是主做的功能测试,但是我也一直是兢兢业业的呀,不曾想去年7月份无情被辞的消息让我感到一阵沉重。我曾经一直坚信自己的技能和经验足以支撑我在这个领域的未来,但现实却告诉我&…

考研数据结构——表达式的转换用栈实现表达式的概述

一、用表达式实现中缀表达式转后缀表达式 把括号里的符号移到括号外 二、用栈实现中缀表达式转后缀表达式 1、遇到字母写下来 2、遇到符号加入栈中 3、遇到成对括号才出栈 4、当前读取运算符要小于等于栈顶运算符优先级则出栈 从左向右扫描 三、表达式方法实现中缀表达式转…

Shader Graph9-世界空间、物体空间、相机空间、切线空间

一、World Space世界空间 在下用的Blender软件,新建了一个平面,中间的黄色小圆点表示的世界空间的原点,在世界空间的物体的位置,都是相对于这个原点来说的,红色箭头表示x轴,绿色箭头表示y轴,蓝…

算法 二叉树2 || 层序遍历 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111 二叉树的最小深度 222.完全二叉树的节点个数

102 二叉树的层序遍历 队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。 迭代法: /*** Definition for …

springboot和vue写个小项目

遵循“约定优于配置”的原则,只需要很少的配置或使用默认的配置。 能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件。 提供定制化的启动器Starters,简化Maveni配置,开箱即用。 纯)java配置,没有代码生成&#xf…

4月11日,每天30秒,昨夜今晨一览无余/我国首条“西氢东送”管道纳入国家规划/国际机构:中国经济蓬勃复苏,展现广阔投资

-> 昨天的世界(点击进入) <- http://mp.weixin.qq.com/s?__bizMzU4MzQ4Mzk0Nw&mid2247488724&idx1&snd19817d3c7fd9aeb521052090eb439e0&chksmfda90390cade8a864965c805b86acd253f5d74368ae8767b7f00b80d4af5bcc42feef7635641&scene21#wechat_redir…

Qt扫盲-Qt图表类综述

Qt支持图表类综述一、概述二、图表类型1. 折线图和柱状图2. 面积图和散点图3. 柱状图4. 饼图5. 盒须图6. 烛台图表7. 星座图图表三、坐标轴 Axes四、图例五、与图表交互1. 动态绘制数据2. 深入数据3. 缩放和滚动4. 鼠标悬停六、主题一、概述 Qt Charts支持创建时尚的、交互式的…

Jetpack Compose之对话框和进度条

概述 对话框和进度条其实并无多大联系&#xff0c;放在一起写是因为两者的内容都不多&#xff0c;所以凑到一起&#xff0c;对话框是我们平时开发使用得比较多的组件&#xff0c;像隐私授权&#xff0c;用户点击删除时给用户提示这是一个危险操作等&#xff0c;进度条的使用频…

一文吃透Elasticsearch

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 如果访问不了Github&#xff0c…

【自制】我造了一台 钢 铁 侠 的 机 械 臂 !【硬核】

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。