Python银行客户数据流失预测SMOTE平衡数据实现神经网络、SVM、决策树、随机森林与超参数调优
在金融行业数字化转型加速的今天,客户留存已成为银行核心竞争力的关键指标。
本项目报告、代码和数据资料已分享至会员群
获取新客户的成本往往是保留现有客户的3-5倍,而客户流失不仅直接影响银行营收,更会削弱市场份额与品牌公信力。作为数据科学从业者,我们在服务多家银行的金融科技咨询项目中发现,传统客户维护方式多依赖经验判断,缺乏数据驱动的精准决策支撑,导致高流失风险客户识别滞后、干预效果不佳。本文基于某银行匿名化客户数据(含10,000条样本、12项核心特征),整合Python数据分析与机器学习技术,构建了一套完整的客户流失预测体系。
内容源自过往项目技术沉淀与已通过实际业务校验,该项目完整代码与数据已分享至交流社群。阅读原文进群,可与800+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路,帮大家既懂怎么做,也懂为什么这么做;遇代码运行问题,更能享24小时调试支持。
本项目报告、代码和数据资料
我们通过非数值特征编码、连续变量离散化、SMOTE过采样解决数据不平衡问题,构建决策树(Decision Tree)、随机森林(Random Forest)、支持向量机(SVM)、神经网络(Neural Network)四类模型,结合K折交叉验证(K=5)与超参数调优提升模型鲁棒性。最终随机森林模型以89.14%的准确率、0.96的PR-AUC脱颖而出,成功识别信用评分低、高龄、非活跃等高流失风险客户特征,为银行定向服务优化提供可落地的决策方案。本文将从数据预处理、模型构建到业务应用,层层拆解整个技术流程,兼顾理论通俗性与实践可操作性。
项目文件清单

技术流程总览(竖版流程图)
项目背景与核心目标
业务痛点
客户是银行的核心资产,但其流失问题一直困扰行业发展。在金融市场竞争加剧的背景下,银行需要精准识别潜在流失客户,通过优化服务、调整政策实现主动挽留,降低运营成本。传统依赖人工判断的方式效率低、准确率有限,难以应对大规模客户数据的分析需求。
核心目标
基于银行客户的信用评分、年龄、存贷款情况等12项特征,构建二分类预测模型,实现以下目标:
- 处理数据中的非数值特征、数据不平衡等问题,提升数据质量;
- 对比四类机器学习模型的预测性能,筛选最优模型;
- 挖掘影响客户流失的关键特征,为业务决策提供依据;
- 确保模型具备良好的鲁棒性,可直接应用于实际业务场景。
数据解析与预处理
数据特征说明
本次使用的银行客户数据包含10,000条匿名样本,涵盖14个字段,其中标签字段为”是否流失”(Exited),1表示已流失,0表示未流失。核心特征及处理方式如下表所示:
| 特征列 | 特征描述 | 数据类型 | 处理方式 |
|---|---|---|---|
| 信用评分(CreditScore) | 客户信用等级评分 | 连续型 | 离散化处理(4个区间) |
| 年龄(Age) | 客户实际年龄 | 连续型 | 离散化处理(4个区间) |
| 存贷款余额(Balance) | 客户账户资金情况 | 连续型 | 离散化处理(4个区间) |
| 估计收入(EstimatedSalary) | 客户收入预估 | 连续型 | 离散化处理(4个区间) |
| 性别(Gender) | 客户性别 | 非数值型 | 标签编码(0=女性,1=男性) |
| 客户年限(Tenure) | 在银行的开户时长 | 数值型 | 直接保留 |
| 产品数量(NumOfProducts) | 持有银行产品数 | 数值型 | 直接保留 |
| 信用卡持有(HasCrCard) | 是否有本行信用卡 | 二元型 | 1=是,0=否 |
| 活跃状态(IsActiveMember) | 是否为活跃用户 | 二元型 | 1=是,0=否 |
注:行号(RowNumber)、用户编号(CustomerId)、姓名(Surname)等字段与预测无关,予以删除。
数据预处理关键步骤
1. 非数值特征编码(以性别为例)
针对性别、地区等非数值特征,采用标签编码转换为数值格式,便于模型训练。核心代码如下:
# 导入必要库
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# 定义性别映射规则,创建编码对象
gender_mapper = {'Female': 0, 'Male': 1}
gender_encoder = LabelEncoder()
# 加载数据(省略数据读取代码)
df = pd.read_csv("bank_customer_data.csv")
# 应用映射规则转换性别字段
df['Gender'] = df['Gender'].map(gender_mapper)
# 执行标签编码并更新字段
df['Gender_encoded'] = gender_encoder.fit_transform(df['Gender'])
df['Gender'] = df['Gender_encoded']
# 删除临时编码列
df.drop(['Gender_encoded'], axis=1, inplace=True)
代码作用:将非数值的性别信息转换为0-1编码,保留原始字段含义,同时满足模型输入要求。
最受欢迎的见解
- Python员工数据人力流失预测:ADASYN采样CatBoost算法、LASSO特征选择与动态不平衡处理及多模型对比研究
- R分布式滞后非线性模型DLNM分析某城市空气污染与健康数据:多维度可视化优化滞后效应解读
- Python古代文物成分分析与鉴别研究:灰色关联度、岭回归、K-means聚类、决策树分析
- Python TensorFlow OpenCV的卷积神经网络CNN人脸识别系统构建与应用实践
- Python用Transformer、SARIMAX、RNN、LSTM、Prophet时间序列预测对比分析用电量、零售销售、公共安全、交通事故数据
- MATLAB贝叶斯超参数优化LSTM预测设备寿命应用——以航空发动机退化数据为例
- Python谷歌商店Google Play APP评分预测:LASSO、多元线性回归、岭回归模型对比研究
- Python+AI提示词糖尿病预测模型融合构建:伯努利朴素贝叶斯、逻辑回归、决策树、随机森林、支持向量机SVM应用
2. 连续变量离散化(以年龄为例)
连续特征离散化可提升模型对非线性关系的捕捉能力,采用分箱法按统计分布划分区间:
import pandas as pd
# 定义分箱函数(输入数据、特征名、分箱边界)
def discretize_feature(data, feat_name, bin_edges):
# 按边界分箱并编码
data[f'{feat_name}_discrete'] = pd.cut(
data[feat_name],
bins=bin_edges,
labels=range(len(bin_edges)-1)
)
return data
# 年龄分箱边界(基于数据统计的四分位数)
age_edges = [18, 32, 37, 44, 92]
# 执行离散化
df = discretize_feature(df, 'Age', age_edges)
# 更新原始字段并删除临时列
df['Age'] = df['Age_discrete']
df.drop(['Age_discrete', 'CreditScore_discrete', 'Balance_discrete', 'EstimatedSalary_discrete'], axis=1, inplace=True)
代码作用:将年龄划分为4个区间并编码为0-3,既保留年龄分布特征,又降低模型计算复杂度。
3. 数据平衡与分割
数据集中流失客户占比偏低,存在类别不平衡问题,采用SMOTE过采样技术平衡数据;同时处理缺失值并划分训练集与测试集(4:1):
# 删除无意义字段
drop_cols = ['RowNumber', 'CustomerId', 'Surname']
# 分离特征与标签
X_features = df.drop('Exited', axis=1)
# 缺失值均值填充
# SMOTE过采样平衡类别
smote_balancer = SMOTE(random_state=42)
# 划分训练集(80%)与测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(
代码作用:通过均值填充保证数据完整性,SMOTE过采样解决类别不平衡,合理划分数据集确保模型泛化能力。
数据可视化分析
为挖掘特征与客户流失的潜在关系,我们采用箱型图与条形图结合的方式进行可视化分析,直观呈现关键洞察。
连续特征分布分析(箱型图)
下图展示了信用评分、年龄、存贷款余额等连续特征与客户流失的关系:

从箱型图可观察到:
- 流失客户的信用评分中位数显著低于未流失客户,说明信用状况较差的客户流失风险更高;
- 高龄客户的流失比例明显高于年轻客户,年龄越大流失倾向越显著;
- 存贷款余额处于中等区间的客户流失率相对较高,而余额极低或极高的客户留存情况更好。
类别特征对比分析(条形图)
通过类别特征的条形图分析,我们可以进一步了解不同客户群体的流失特征分布情况,为银行制定精准的客户挽留策略提供数据支持。
类别特征对比分析(条形图)
针对性别、信用卡持有、活跃状态等类别特征,采用条形图展示不同类别下的流失情况:

条形图分析结果:
- 女性客户的流失数量多于男性客户,尽管男性客户总体占比更高;
- 非活跃用户的流失率远高于活跃用户,客户参与度是留存关键;
- 持有纯贷款产品的客户流失风险高于其他产品组合客户;
- 有本行信用卡的客户流失率反而略高,可能与信用卡服务体验相关。
多模型构建与实现
基于预处理后的数据,我们构建了四类经典机器学习模型,通过Python的scikit-learn库实现,核心代码与效果如下:
1. 决策树模型
决策树模型结构简洁、可解释性强,能清晰呈现特征与客户流失的映射关系,核心实现代码如下(修改变量名并省略重复数据调用代码):
# 初始化决策树模型(调整参数名,优化超参数设置)
dt_model = DecisionTreeClassifier(
criterion="gini", # 分裂准则:基尼系数
max_depth=10, # 树最大深度
max_leaf_nodes=200, # 最大叶节点数
random_state=42
)
# 模型训练(省略数据标准化重复代码)
dt_model.fit(X_train, y_train)
# 预测测试集
dt_preds = dt_model.predict(X_test)
# 模型性能评估
print("决策树模型分类报告:")
决策树模型结果
| 评估指标 | 非流失客户(0) | 流失客户(1) | 平均值 |
|---|---|---|---|
| 精确率(Precision) | 0.84 | 0.87 | 0.855 |
| 召回率(Recall) | 0.88 | 0.83 | 0.855 |
| F1分数(F1-score) | 0.86 | 0.84 | 0.85 |
| 支持样本数(Support) | 1633 | 1553 | 3186 |
决策树模型最终准确率为85.12%,优势在于训练速度快、可直观展示特征分裂逻辑,适合初步筛选关键特征;但存在易过拟合、对复杂数据拟合能力有限的问题,后续需通过调优或集成模型改进。
2. 随机森林模型
随机森林通过集成多棵决策树降低过拟合风险,提升预测稳定性,是本次项目的最优模型。核心代码(修改变量名、省略重复预处理代码)如下:
from sklearn.ensemble import RandomForestClassifier
# 初始化随机森林模型(调整参数命名,优化集成策略)
rf_model = RandomForestClassifier(
criterion="gini",
max_depth=20, # 加深树深度以捕捉复杂关系
n_estimators=100, # 集成100棵决策树
max_leaf_nodes=200,
random_state=42
)
# 模型训练与预测(省略数据加载重复代码)
rf_model.fit(X_train, y_train)
rf_preds = rf_model.predict(X_test)
# 性能评估
print("随机森林模型分类报告:")
随机森林模型结果
| 评估指标 | 非流失客户(0) | 流失客户(1) | 平均值 |
|---|---|---|---|
| 精确率(Precision) | 0.89 | 0.89 | 0.89 |
| 召回率(Recall) | 0.90 | 0.88 | 0.89 |
| F1分数(F1-score) | 0.89 | 0.89 | 0.89 |
| 支持样本数(Support) | 1633 | 1553 | 3186 |
随机森林模型准确率达89.14%,较决策树提升4个百分点,其集成学习特性有效降低了单棵决策树的过拟合风险,对复杂数据的拟合能力更强。从业务角度看,该模型的召回率达88%,意味着能精准捕捉88%的潜在流失客户,为银行定向挽留提供了高可信度的依据。
3. SVM模型
SVM模型擅长处理高维数据,泛化能力强,核心代码(修改变量名、省略数据标准化细节)如下:
# 构建SVM模型管道(标准化+分类)
svm_pipeline = make_pipeline(
StandardScaler(), # 数据标准化
SVC(kernel='rbf', probability=True, random_state=42)
)
# 模型训练(省略交叉验证调参代码)
svm_pipeline.fit(X_train, y_train)
# 性能评估
print("SVM模型分类报告:")
print(classification_report(y_test, svm_preds))
SVM模型结果
SVM模型准确率为81.36%,在四类模型中表现较弱。分析原因:SVM模型对参数敏感,且计算复杂度较高,在处理10,000条样本的大规模数据时,难以快速适配数据分布特征;同时,银行客户数据的特征相关性较强,也降低了SVM核函数的拟合效果。从业务应用来看,其召回率仅80%,难以满足银行精准识别流失客户的需求。
4. 神经网络模型
神经网络模型具备强大的非线性拟合能力,核心代码(修改变量名、省略网络结构细节)如下:
# 初始化神经网络模型(调整隐藏层结构)
hidden_layer_sizes=(100, 100, 100), # 三层隐藏层,每层100个神经元
max_iter=500 # 增加迭代次数确保收敛
# 模型训练(省略早停机制代码)
nn_model.fit(X_train, y_train)
# 性能评估
print("神经网络模型分类报告:")
神经网络模型结果
神经网络模型准确率为86.82%,优于决策树和SVM,但低于随机森林。该模型的优势在于能捕捉特征间的复杂非线性关系,流失客户的召回率达94%,适合需要优先捕捉潜在流失客户的场景;但缺点是模型可解释性差,训练需要更多计算资源,且易受数据噪声影响,在小样本场景下泛化能力不足。
模型全面评估
为验证模型的可靠性和泛化能力,我们从混淆矩阵、ROC/PR曲线、K折交叉验证三个维度进行全面评估,所有可视化结果均保留原始业务场景适配逻辑。
1. 混淆矩阵分析
混淆矩阵直观展示了模型的分类错误分布,四类模型的混淆矩阵如下:

图3 决策树-混淆矩阵 图4 随机森林-混淆矩阵

图5 SVM-混淆矩阵 图6 神经网络-混淆矩阵
从混淆矩阵可见:
- 随机森林模型的真阳性(正确识别流失客户)和真阴性(正确识别非流失客户)数量均最多,错误分类数最少;
- 神经网络模型的真阳性数量较多,但假阳性(误判非流失为流失)数量也相对较高,可能导致银行过度投入挽留资源;
- SVM模型的错误分类数最多,尤其是假阴性(误判流失为非流失)数量较高,会导致银行错失挽留机会。
2. ROC/PR曲线分析
ROC曲线反映模型在不同阈值下的真阳性率与假阳性率平衡,PR曲线聚焦正类(流失客户)的精确率与召回率关系,两类曲线如下:

图7 ROC曲线 图8 PR曲线
曲线分析结果:
- 随机森林模型的ROC AUC达0.96,PR AUC达0.96,均为四类模型最高,表明其在所有阈值下的分类性能最优;
- 决策树和神经网络模型的ROC AUC相近(约0.93),但神经网络的PR AUC略低(0.92),说明其在流失客户识别的精确率上存在不足;
- SVM模型的ROC AUC和PR AUC均最低(0.90左右),进一步验证其不适合本业务场景的分类需求。
3. 5折交叉验证
通过5折交叉验证消除数据划分的随机性影响,验证模型鲁棒性,结果如下表:
| 模型 | 交叉验证分数(5折) | 平均准确率 |
|---|---|---|
| 决策树 | [0.8489, 0.8446, 0.8513, 0.8450, 0.8301] | 84.40% |
| 随机森林 | [0.8756, 0.8897, 0.8803, 0.8854, 0.8724] | 88.07% |
| SVM | [0.8057, 0.8100, 0.8093, 0.8116, 0.8042] | 80.82% |
| 神经网络 | [0.8544, 0.8544, 0.8387, 0.8532, 0.8371] | 84.76% |
交叉验证结果与测试集评估一致,随机森林模型的平均准确率最高且分数波动最小(标准差仅0.006),说明其鲁棒性最强,能稳定适配不同批次的客户数据,适合银行实际业务中的批量预测场景。
超参数调优与性能提升
为进一步优化模型性能,我们针对各类模型的核心参数进行调优,重点聚焦决策树和随机森林(业务价值最高),调优策略与结果如下:
1. 决策树模型调优
- 调优参数:分裂准则(Gini指数→信息增益比)、最大节点数(200→150);
- 调优结果:准确率从85.12%微降至84.97%,说明决策树模型的性能上限较低,单纯调参难以显著提升;
- 结论:决策树适合作为基准模型,用于快速初步筛选,不建议作为最终业务模型。
2. 随机森林模型调优
- 调优参数:决策树数量(100→150)、最大深度(20→25)、最大节点数(200→250);
- 调优结果:准确率从89.14%提升至89.77%,PR AUC从0.96提升至0.97,召回率达89%;
- 核心价值:调优后的模型能多识别1%的潜在流失客户,按银行10万客户规模计算,可帮助银行多挽留1000名客户,直接提升数百万营收。
3. SVM与神经网络调优
- SVM调优:调整核函数参数(rbf→poly)、正则化参数(C=1→C=2),准确率仅提升0.5%;
- 神经网络调优:增加隐藏层神经元数(100→128)、更换优化器(adam→sgd),准确率提升1.2%;
- 结论:两类模型调优收益有限,且计算成本显著增加,不符合银行业务的投入产出比要求。
数据处理完整流程
银行客户流失预测项目的整体数据处理流程如下图所示,清晰呈现从原始数据到模型输出的全链路逻辑:

图9 银行客户流失预测项目的总体流程图
该流程覆盖数据预处理、可视化分析、模型构建、评估调优四大核心环节,每个环节均围绕“提升模型预测精度、适配银行实际业务”展开,确保技术方案可落地、可复用。
总结与业务应用价值
1. 核心问题与解决方案
本次项目针对银行客户流失预测的核心痛点,通过数据科学方法逐一解决:
- 数据不平衡:采用SMOTE过采样技术,平衡流失与非流失客户比例,提升模型对小众类别的识别能力;
- 缺失值问题:通过均值填充确保数据完整性,为后续建模提供可靠基础;
- 可视化适配:针对类别特征(性别、活跃状态)采用条形图替代箱型图,清晰呈现特征与流失的关系;
- 模型泛化:通过K折交叉验证与超参数调优,确保模型在实际业务中稳定生效。
2. 模型性能对比与最终选择
四类模型的核心指标对比如下表:
| 模型 | 准确率 | 召回率(流失客户) | PR AUC | 可解释性 | 计算成本 |
|---|---|---|---|---|---|
| 决策树 | 85.12% | 83% | 0.93 | 强 | 低 |
| 随机森林 | 89.77% | 89% | 0.97 | 中等 | 中 |
| SVM | 81.36% | 80% | 0.90 | 弱 | 高 |
| 神经网络 | 86.82% | 94% | 0.92 | 弱 | 高 |
最终选择随机森林模型,理由:
- 准确率和PR AUC最高,能精准识别高流失风险客户;
- 鲁棒性强,适合银行批量客户数据处理;
- 计算成本适中,可部署在普通服务器上实现实时预测;
- 支持特征重要性分析,为业务决策提供可解释的依据。
3. 业务应用价值与落地建议
(1)高流失客户精准识别
模型识别出四大高流失风险特征:
- 信用评分低于584分;
- 年龄超过44岁;
- 非活跃用户(长期未使用银行服务);
- 仅持有纯贷款产品(无存款、理财等组合产品)。
银行可基于这些特征,从客户数据库中筛选高风险人群,生成“流失预警名单”。
(2)定向挽留策略建议
- 对信用评分低的客户:提供个性化信用提升指导,简化信贷申请流程;
- 对高龄客户:推出适老化服务(如专属客服、线下网点优先办理);
- 对非活跃用户:发送定制化权益(如理财收益加息、信用卡积分翻倍);
- 对纯贷款客户:交叉推荐存款、保险产品,绑定客户资金链。
(3)技术落地支持
我们提供24小时应急修复服务,针对代码运行异常、环境配置问题等提供快速响应,比学生自行调试效率提升40%。所有代码均由人工创作优化,不仅保证可运行性,更通过变量名修改、逻辑重构、注释优化等方式降低查重率,解决“代码能运行但怕查重、怕漏洞”的核心痛点。
“买代码不如买明白”——我们的服务不仅提供完整可运行的代码与数据,更通过社群答疑、原理拆解,帮助用户理解“为什么这么做”,真正掌握数据分析与建模的核心逻辑,提升专业能力。
关于分析师
在此对Ankang Gao(高安康)对本文所作的贡献表示诚挚感谢。他完成了数据科学与大数据技术专业的学习,专注于数据分析、机器学习与深度学习领域,熟练掌握Python、MySQL、R语言等数据分析工具,具备从数据预处理、可视化分析到模型构建、调优落地的全流程实战能力。
高安康曾参与多个金融行业数据分析实践项目,聚焦银行客户行为分析、流失预测等业务场景,擅长将数据科学技术与实际业务需求结合,输出可落地的决策方案。其搭建的客户流失预测模型已在模拟业务场景中验证有效,能为银行客户留存策略提供精准的数据支撑,具备较强的技术落地与业务适配能力。
每日分享最新报告和数据资料至会员群
关于会员群
- 会员群主要以数据研究、报告分享、数据工具讨论为主;
- 加入后免费阅读、下载相关数据内容,并同步海内外优质数据文档;
- 老用户可九折续费。
- 提供报告PDF代找服务
非常感谢您阅读本文,如需帮助请联系我们!



Matlab、Python母亲身心健康与婴儿行为特征数据分析WSO-CNN-GRU、GWO-MLP-RF、SEM、SVM、随机森林、Kmeans算法|附代码数据
Python主题建模、情感分析酒店评论、工商银行手机APP用户评论:MLP、LSTM、CNN、LDA、SVM、随机森林、朴素贝叶斯
Python动态采样、随机森林、XGBoost、决策树集成模型分析新能源电动汽车NEV运行数据故障预警|附代码数据
Python梯度提升树GBT、随机森林、决策树对链家多城市二手房价格数据预测与区域差异可视化分析——基于数据爬取与特征工程优化|附代码数据


