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

news/2024/4/27 13:55:42/文章来源:https://blog.csdn.net/qq_40186237/article/details/130147915

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 VotingClassifiervoting = 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.luyixian.cn/news_show_286466.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt Quick - 分隔器综述

Qt Quick - 分隔器综述一、概述二、MenuSeparator 控件1. 用法:三、ToolSeparator 控件1. 用法一、概述 Qt Quick Controls 提供了多种分隔符,其实就是分割一下MenuBar和ToolBar里面的内容。 控件功能MenuSeparator将菜单中的一组项目与相邻项目分开To…

高效部署Redis Sentinel模式(哨兵模式),手把手教学

Redis Sentinel模式部署前言一、服务器部署同版本的redis1、换软件源在yum拉取包的时候启用remi源二、修改配置文件1.修改/etc/redis.conf2.配置/etc/redis/sentinel.conf三、启动redis服务1、启动服务2、连接redis3、检查redis前言 这里就不过多的解释高可用的好处了&#xf…

一文吃透Http协议

Http 协议 1. 初始 Http Http 协议 , 是应用层最为广泛使用的协议 , Http 就是浏览器和服务器之间的桥梁. Http 是基于 TCP 协议实现的 , 通常我们输入搜索框中的网址 (URL) , 浏览器就会根据这个 URL 构造出一个 Http 请求 , 发送给服务器. 服务器就会返回一个 Http 响应(包…

计组2.4——加法器的设计

计组:2.4算术逻辑单元异或门实现奇偶校验的原理串行加法器&&并行加法器并行加法器的优化算术逻辑单元 控制信号: 当M0时表示算术运算 当M1时表示逻辑运算 S0~ S3表示做什么运算,因此ALU可以表示16种算数运算和16种逻辑运算 Ai,Bi代表…

JVM 垃圾收集器详解

一、垃圾收集器 如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚…

Java中Cookie的属性介绍

Name和Value Name和Value是一个键值对。 Name是Cookie的名称,Cookie一旦创建,名称便不可更改,一般名称不区分大小写; Value是该名称对应的Cookie的值,如果值为Unicode字符,需要为字符编码。 如果值为二进制…

优思学院|质量大师的那些名言(一)【质量是免费的】

名言是一种短小精悍、言简意赅的语言表达方式,它们通常包含着深刻的哲理和智慧,可以为我们提供指导和启示。 优思学院会在这个《质量大师的那些名言》系列中让大家透过那些名言,用最简单、直接,和深刻的方法来学习质量和六西格玛…

商城系统开发方案分析

互联网的不断发展,电商行业已经成为了当前最重要的商业形式之一。商城系统的开发也因此而备受关注。商城系统的开发是针对B2C、B2B2C等多种商业模式,如用户熟知的SHOP、商派等一系列商城系统,将商品和服务进行在线销售的一个综合性平台。那么…

字节面试体验值拉满~

今天分享一位读者春招的字节二面面经,岗位是后端开发。 一个编程语言都没问,都是问网络项目mysqlredis。 问题记录 使用消息中间件降低消息持久化的压力是怎么做的,为什么可以降低? 读者答:在突发大量消息的情况下…

云桌面初体验 之 爱上无影云桌面

什么是无影云桌面 无影云桌面 (Elastic Desktop Service),一台长在云上的“超级电脑”,是基于云计算和虚拟化技术的云上桌面服务。 支持桌面环境的快速创建、部署、统一管控与运维;在便捷性、弹性、安全、高性能等方面&#xff…

polygraphy深度学习模型调试器使用教程

深度学习系列文章目录 文章目录深度学习系列文章目录Polygraphy介绍一、安装源码安装:简单安装安装依赖二、简单使用三、使用教程2 、polygtaphy使用示例Polygraphy介绍 Polygraphy在我进行模型精度检测和模型推理速度的过程中都有用到,因此在这做一个简…

腾讯云GPU服务器NVIDIA P40 GPU、P4、T4和GPU自由卡详解

腾讯云GPU云服务器,GPU云服务器实例可选GN8机型、GN6S机型、GN7机型等规格,搭载 NVIDIA P40 GPU,最长可3年,云服务器吧来详细说下腾讯云GPU云服务器: 目录 腾讯云GPU云服务器 腾讯云GPU自由卡 腾讯云GPU云服务器 腾…

归并排序(递归+非递归)

目录一、什么是归并排序?二、归并排序(递归)三、归并排序(非递归)一、什么是归并排序? 归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer&a…

epoll 反应堆模型(Libevent库核心思想)

epoll 反应堆模型是从 libevent 库里面抽取的核心代码。 epoll ET模式 非阻塞、轮询 void *ptr 代码流程 原来的代码: socket、bind、listen efd epoll_create 创建监听(红黑树) epoll_ctl 向树上添加一个监听 fd for(;;) { 满足数组…

4.12~4.13学习总结

File 相对路径和绝对路径的区别: 相对路径不带盘符,绝对路径带盘符 小知识点:1KB1024字节,1MB1024KB,1GB1024MB; File对象就表示一个路径,可也是文件的路径,也可以是文件夹的路径 这个路径可以是存在的也可…

MongoDB 介绍和基本操作

一、MongoDB数据库 1、MongoDB是一种非关系型数据库,是用C语言编写的。其特点是高性能、易部署、易使用,存储数据方便。 2、MongoDB特点: 面向集合存储,易于存储对象类型数据;支持动态查询,支持完全索引&…

计算机网络第1章(概述)

文章目录1.1、计算机网络在信息时代的作用1.2、因特网概述1、网络、互连网(互联网)和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成1.3 三种交换方式1、电路交换(Circuit Switching)2、分组交换&#xff08…

JSON Web Tokens (JWT) — the only explanation you will ever need

本文摘抄自 Ariel Weinberger 博客JSON Web Tokens (JWT) — the only explanation you will ever need | by Ariel Weinberger | MediumJSON Web Tokens (JWT) — the only explanation you will ever need JSON Web Tokens are changing the world for the better. Acting as…

第1章-JVM与Java体系结构

1、本系列博客,主要是面向Java8的虚拟机。如有特殊说明,会进行标注。 2、本系列博客主要参考尚硅谷的JVM视频教程,整理不易,所以图片打上了一些水印,还请读者见谅。后续可能会加上一些补充的东西。 3、尚硅谷的有些视频…

国家出手管人工智能AI了

我是卢松松,点点上面的头像,欢迎关注我哦! 全球都在封杀AI,国家也出手了,人工智能AI的强监管来了!这次反应速度算是很快了。国家出手,AI必须管。 国家网信办拟针对生成式人工智能服务出台管理办法&#…