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

news2024/9/25 23:22:03

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

描述

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

本任务的实践内容包括:

1、学习并熟悉Stacking/Blending算法原理。

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

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	1.0.2
    numpy           1.19.3
    pandas          1.3.5
    

分析

本任务涉及以下环节:

A)熟悉Stacking/Blending算法原理

B)加载并观察银行客户

C)使用决策树分类器和KNN分类器模型,分别生成预测结果

D)把上面的预测结果连接成一个新的特征集,标签则保持不变,用回原始的标签集

E)最后使用逻辑回归算法对新的特征集进行分类预测

实施

1、Stacking/Blending算法原理

1.1 Stacking算法

Stacking算法的思路是使用初始训练集学习若干个基模型之后,用这几个基模型的预测结果作为新的训练集的特征来训练新模型。Stacking算法的流程如下图所示:

请添加图片描述

这些基模型在异质类型中进行选择,比如决策树、KNN、SVM或神经网络等,都可以组合在一起。

Stacking具体步骤如图:

请添加图片描述

Stacking具体步骤如下:

(1)通常把训练集拆成K折(请大家回忆第1课中介绍过的K折验证)

(2)利用K折验证的方法在K-1折上训练模型,在第K折上进行验证

(3)这样训练K次之后,用训练好的模型对训练集整体进行最终训练,得到一个基模型

(4)使用基模型预测训练集,得到对训练集的预测结果

(5)使用基模型预测测试集,得到对测试集的预测结果

(6)重复步骤(2)~(5),生成全部基模型和预测结果(比如CART、KNN、SVM以及神经网络,4组预测结果)

(7)只需要用训练集预测结果作为新训练集的特征,测试集预测结果作为新测试集的特征去训练新模型。新模型的类型不必与基模型有关联

1.2 Blending算法

Blending的思路和Stacking几乎是完全一样的,唯一的不同之处在于Blending的过程中不进行k折验证,而是只将原始样本训练集分为训练集和验证集,然后只针对验证集进行预测,生成的新训练集就只是对于验证集的预测结果,而不是对全部训练集生成的预测结果。Blending集成的流程如图所示:

请添加图片描述

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、Stacking算法实现

定义函数,实现Stacking算法流程。

from sklearn.model_selection import StratifiedKFold

'''
train:训练集特征
y:训练集标签
test:测试集
'''

def Stacking(model, train, y, test, n_fold):
    folds = StratifiedKFold(n_splits=n_fold, random_state=None)
    test_pred = np.empty((0, 1), float)
    train_pred = np.empty((0, 1), float)

    for train_indices, val_indices in folds.split(train, y.values):   # 将测试集特征和标签划分为n个子集
        X_train, x_val = train.iloc[train_indices], train.iloc[val_indices]   # X_train:训练集特征, x_val:验证集特征
        y_train, y_val = y.iloc[train_indices], y.iloc[val_indices]          # y_train:训练集标签, y_val:验证集标签
        model.fit(X=X_train, y=y_train)

        train_pred = np.append(train_pred, model.predict(x_val))  # 验证集预测
        test_pred = np.append(test_pred, model.predict(test))   # 传入的测试集预测

    return test_pred, train_pred

6、训练基模型

创建决策树分类器模型和KNN分类器模型,用刚才定义的Stacking函数训练两个模型:

from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

model1 = DecisionTreeClassifier(random_state=1)
test_pred1, train_pred1 = Stacking(model=model1, n_fold=10,
                                   train=X_train, test=X_test, y=y_train)
train_pred1 = pd.DataFrame(train_pred1)
test_pred1 = pd.DataFrame(test_pred1)

model2 = KNeighborsClassifier()
test_pred2, train_pred2 = Stacking(model=model2, n_fold=10,
                                   train=X_train, test=X_test, y=y_train)
train_pred2 = pd.DataFrame(train_pred2)
test_pred2 = pd.DataFrame(test_pred2)

7、分类预测

把上面的预测结果连接成一个新的特征集,标签则保持不变,用回原始的标签集。最后使用逻辑回归算法对新的特征集进行分类预测:

from sklearn.linear_model import LogisticRegression

df = pd.concat([train_pred1, train_pred2], axis=1)    # (8000,2)
df_test = pd.concat([test_pred1, test_pred2], axis=1)   # (20000,2)

a = y_test
for i in range(9):
    y_test = pd.concat([y_test, a], axis=0)

model = LogisticRegression(random_state=1)
model.fit(df, y_train)
print(model.score(df_test, y_test))

结果如下:

0.7915

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

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

相关文章

Android桌面长按图标快捷方式——Shortcuts

简介 当我们在长按Android应用的桌面图标时,一般回弹出一个列表,上面一般有应用信息、卸载应用等功能,并且部分应用在这里还添加了自己的快捷方式,今天主要介绍如何添加自定义的快捷方式。 长按桌面显示的快捷方式在Android中叫…

中小企业面临怎样的数字化转型局面

当前,我国经济长期向好的基本面没有改变,但承受着“需求收缩、供给冲击、预期减弱”的三重压力,中小企业的数字化转型之路较之以往更加艰难、曲折。为帮助中小企业纾困解难、平稳渡过危机,需进一步优化政策“组合拳”,…

单片机中常用的轻量级校验算法

UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息。 在自定义数据存储时,有经验的工程师都会添加一定校验信息。 你平时通信,或者数据存储时,你有用到校验信息吗?下面就介绍几种常见…

Java面试题总结 | Java面试题总结3-JVM模块(持续更新)

JVM 文章目录JVMJVM的内存组成模型java的内存模型定义了什么java的内存分布情况程序计数器是什么?堆、栈、方法区都存放的是什么堆和栈的区别类加载JMM主内存和本地内存交互操作volatile如何保证可见性volatile如何保证有序性happen-before了解过吗?内存…

【JS】BOM 详解(工作必备)

文章目录BOM一、History (浏览器记录)1.1、history.go(指定页)1.2、history.back(上一页)1.3、history.forword(下一页)二、Location(浏览器地址)2.1、操作属…

基于OpenCV的图片和视频人脸识别

目录 🥩前言 🍖环境使用 🍖模块使用 🍖模块介绍 🍖模块安装问题: 🥩人脸检测 🍖Haar 级联的概念 🍖获取 Haar 级联数据 🍗 1.下载所需版本 🍗 2.安…

前后端不分离项目如何使用elementUI

首先,去官网下载element 的js和css和字体等文件 其次,分别将js和css 引入到项目 然后就可以使用了,使用方法和vue中使用element方法一致、

5款最新最实用的小软件,让你的工作和生活更轻松

我喜欢发现和分享一些好用的软件,我觉得它们可以让我们的工作和生活更加轻松和快乐。今天给大家介绍五款我最近发现的软件, GIF录制工具——Screen To Gif Screen To Gif是一款完全免费的GIF录制神器,可以让你轻松地录制屏幕、摄像头或画板…

学生信息管理案例

效果图: 业务模块: 点击录入按钮可以录入数据点击删除可以删除当前的数据 注意:本次案例,我们尽量减少dom操作,采用操作数据的形式。增加和删除都是针对数组的操作,然后根据数组数据渲染页面 核心思路:…

5款办公神器软件推荐:提高效率,享受分享

给大家分享一些优秀的软件工具,是一件让人很愉悦的事情,今天继续带来5款优质软件。 图床管理——PicGo PicGo是一款图床管理工具,可以快速上传图片到各种图床,并生成链接。你可以使用PicGo来管理你的图片资源,或者作为Markdown编…

STM32F4_定时器输入捕获详解

目录 1. 输入捕获简介 2. 输入捕获框图 3. 输入捕获模式 4. 相关寄存器 4.1 TIMx_ARR、TIMx_PSC 4.2 捕获/比较寄存器1:TIMx_CCMR1 4.3 捕获/比较使能寄存器 TIMx_CCER 4.4 中断使能寄存器 TIMx_DIER 5. 库函数配置输入捕获高电平脉冲宽度 6. 实验程序 6…

【4.14】今天讲两道TCP面试题

文章目录TCP Keepalive 和HTTP Keep-Alive是一个东西吗?TCP协议有什么缺陷TCP Keepalive 和HTTP Keep-Alive是一个东西吗? 对于这个问题,我们要先知道这两个KeepAlive分别代表什么? TCP的Keepalive是由TCP层(内核层&a…

移远通信率先通过ISO/SAE 21434汽车网络安全管理体系认证

近日,移远通信车载前装BU获得了由国际独立第三方检测、检验和认证机构TV NORD颁发的ISO/SAE 21434汽车网络安全管理体系认证证书。 ISO/SAE 21434标准认证的通过,表明移远通信车载前装BU的网络安全风险管理满足了产品从概念设计、开发、生产、运营到售后…

我的面试八股(数据库)

数据库范式? 数据库范式有三种 1NF 第一范式,属性(对应表中的字段)不能再分割,就是这个字段只能是一个值,不能再分为多个其它字段了,1NF是所有关系型数据库的最基本要求。 2NF 第二范式&am…

Spring Security 02 搭建环境

搭建环境 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…

第31天-贪心-第八章 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

文章目录1. 买卖股票的最佳时机2. 跳跃游戏3. 跳跃游戏 ||1. 买卖股票的最佳时机 - LeetCode链接 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 …

docker安装jenkins安装流程(一)

1.下载安装jdk 官网&#xff1a;https://jdk.java.net/ https://www.oracle.com/java/technologies/downloads/ 上传到linux服务器 cd /usr mkdir jdk tar -zxvf 所要解压的文件名 编辑profile文件&#xff1a;vim /etc/profile 把光标移到最后一行&#xff0c;键盘按 i&…

技术分享 | 如何优雅的删除 Zabbix 的 history 相关历史大表

作者&#xff1a;徐文梁 爱可生DBA成员&#xff0c;一个执着于技术的数据库工程师&#xff0c;主要负责数据库日常运维工作。擅长MySQL,redis&#xff0c;其他常见数据库也有涉猎&#xff0c;喜欢垂钓&#xff0c;看书&#xff0c;看风景&#xff0c;结交新朋友。 本文来源&…

Vue动图数据表格,根据字段是否为空,控制表格列的隐藏和显示

所在前面的话&#xff0c;我是个前端小白&#xff0c;大佬请绕行&#xff0c;可能大佬觉得很简单&#xff0c;但是我真的花了好几个小时去解决&#xff0c;所以记录一下&#xff0c;下次也可以作为参考。 我主要是以第二种方式进行修改的 开门见山 简述问题&#xff1a;大家…

《这就是软件工程师》- 每位软件工程师值的看的一本书,尤其是刚刚步入IT行业的年轻人

文章目录第一部分&#xff5c;行业地图1、现实&#xff1a;为什么会有996&#xff1f;1&#xff09;行业处于特定的发展阶段2&#xff09;公司组织管理问题2、进阶&#xff1a;软件工程师的四大台阶1&#xff09;新手阶段【执行力】2&#xff09;进阶阶段【设计能力】3&#xf…