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 KNeighborsClassifiermodel1 = 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 LogisticRegressiondf = 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

Stacking算法预测银行客户流失率相关推荐

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

    Voting_Averaging算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大.以 ...

  2. Boosting算法预测银行客户流失率

    Boosting算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大.以便银行的客户服务 ...

  3. Bagging算法预测银行客户流失率

    Bagging算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大.以便银行的客户服务部 ...

  4. 用Keras单层网络预测银行客户流失率

    用Keras单层网络预测银行客户流失率 描述 已知一批客户数据,来预测某个银行的客户是否流失.通过学习历史数据,如果机器能判断出哪些客户很有可能在未来两年内结束在银行的业务(这当然是银行所不希望看到的 ...

  5. 使用深度学习预测员工流失率

    墨西哥的员工流动率在全球排名第八,平均每年约17%的流失率 - 一些行业(如餐饮服务)的流失率高达50%. 根据Catalyst的一项研究,平均而言,替换员工的成本约为员工年薪的50%至75%. 考虑 ...

  6. 如何利用简单的Excel操作来预测用户流失?!

    什么是用户流失率?我们为什么需要关注用户流失率? 简单来说,用户流失率是指用户的流失数量与全部使用/消费产品(或服务)用户的数量的比例,是用户流失的定量表述,以及判断用户流失的主要指标,直接反映了产品 ...

  7. 基于分类方法的银行客户流失预测

    一.绪论 近年来,随着支付宝.微信等第三方支付平台的流行和经济体制改革的深化,银行同业间的竞争出现了恶化的趋势,客户流失率的与日俱增也使得银行机构的经营变得紧张.其次,在"互联网+" ...

  8. 深度学习(1):BP神经网络实现银行客户流失预测

    目的:针对银行客户行为和统计数据实现客户流失预测任务. 一. 数据准备 1. 数据集: "select-data.csv"作为训练样本,数据预处理方式:归一化.数值化. Credi ...

  9. 论文笔记1《基于ID3决策树改进算法的客户流失预测分析》

    <计算机科学> 2010年 部分摘要:指出了该算法的取指偏向性以及运算效率不高等缺点,在此基础上提出了改进的ID3算法,该算法通过引入先验知识度参数,有效克服ID3算法中的取值偏向性和运算 ...

最新文章

  1. 周末思考:浅谈如何成为技术一号位?
  2. django 登陆增加除了用户名之外的手机和邮箱登陆
  3. NET问答: 如何在 dynamic 集合上使用 Linq ?
  4. 收藏!最强行人检测算法思维导图
  5. 牛B装备 XSS 漏洞利用工具[使用教程]
  6. 切图html 在线,网页制作/前端开发/网页切图/网站切图/PSD转html
  7. window清理系统垃圾文件代码
  8. gif 格式图片详细解析
  9. js实现xml转json和json转xml
  10. 项目管理(课程总结1)Week1 澳大利亚维多利亚大学VIT1203 Introduction to Project Management
  11. Android中MVVM架构设计模式面试问题讲解
  12. 一点关于应届毕业生找工作的建议。
  13. 【安卓开发系列 -- 开发环境】Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具)
  14. 【CF #781 Div2】A-C
  15. 新绝代双骄3终极全攻略5
  16. 微信小程序中如何引用weUI(踩坑记录)
  17. android支付宝支付微信支付封装,如何在Android App中集成支付宝和微信支付功能
  18. android qq 分享代码,Android将内容分享到QQ和微信实例代码
  19. python 统计多个json文件中某个标签的数量
  20. 【笑傲江湖】编译可用c++源码

热门文章

  1. 【校招VIP】[推电影项目]商业项目的竞品分析和需求分析
  2. 读文献实用网站:ChatPDF一键整理PDF论文摘要,轻松回答重点问题
  3. 钻石小鸟的钻石怎么样?
  4. XILINX 7系列FPGA_SelectIO篇
  5. MySQL 数据库(Python 连接数据库)
  6. Python判断字符串是否为数字
  7. 爱奇艺奇遇VR再推新品:发布奇遇Dream尊享版 深化消费级市场布局
  8. 【咖啡の知识】什么是精品咖啡
  9. rivet(... )
  10. 为变现赋能 ,运营商大数据建模的五个方向