银行客户流失预测决策树 vs SVM vs 神经网络Python 完整实战最后更新2026-07-22 |数据来源Kaggle Churn Modelling 数据集10000 条匿名化真实银行客户记录 |技术栈Python scikit-learn pandas matplotlib代码数据https://pan.quark.cn/s/b4dc33652962核心要点本文基于 Kaggle 公开的银行客户流失数据集10000 条记录14 个字段对比了决策树、SVM、神经网络三种机器学习算法在客户流失预测任务上的表现。实验结论如下决策树准确率最高78.77%SVM 次之75.71%神经网络最低74.36%Age年龄是与客户流失相关性最强的特征相关系数 0.34原始数据正负样本比为 4:179.6% 未流失 vs 20.4% 流失经平衡处理后训练集为 4074 条德国客户流失率32%约为法国和西班牙16%的两倍15 折交叉验证平均准确率为 76.12%最高单折达 80.07%什么是银行客户流失预测银行客户流失预测是指利用机器学习算法基于客户的历史行为数据如信用分数、年龄、账户余额、活跃度等特征预测该客户在未来是否会关闭账户或停止使用银行服务的过程。其核心目标是在客户实际流失之前识别出高风险客户使银行能够采取针对性的挽留措施。根据 HubSpot State of Service Report 的数据获取一个新客户的成本是保留一个现有客户成本的 5 倍。因此通过机器学习提前识别流失风险客户对银行利润有直接影响。**客户流失Customer Churn**是指客户终止与企业的商业关系的行为。在银行业语境下流失通常指客户关闭账户、转移存款或停止使用银行的核心服务。流失分为自愿流失客户主动退出和非自愿流失因违约等原因被动终止机器学习预测主要针对前者。数据集与特征说明本实验使用 Kaggle 平台公开的 Churn Modelling 数据集包含 10000 条银行客户记录每条记录有 14 个字段。数据来源为国外匿名化处理后的真实银行客户数据。字段含义是否用作特征数据类型RowNumber行号否整数CustomerId用户编号否整数Surname用户姓名否文本CreditScore信用分数300-850是连续Geography用户所在国家/地区是类别Gender用户性别是类别Age年龄是连续Tenure当了本银行多少年用户是整数Balance账户余额是连续NumOfProducts使用产品数量是整数HasCrCard是否有本行信用卡是二值IsActiveMember是否活跃用户是二值EstimatedSalary估计收入是连续Exited是否已流失0未流失, 1流失标签二值RowNumber、CustomerId、Surname 三个字段与流失行为无因果关系在预处理阶段直接剔除。剩下 10 个字段中 9 个作为特征Exited 作为预测标签。数据分布与流失特征分析客户流失的总体分布在 10000 条客户记录中未流失 7963 条79.6%流失 2037 条20.4%。正负样本比例约为 4:1属于严重不均衡数据。如果不处理样本不平衡问题模型会倾向于把所有样本都预测为未流失因为光靠猜不流失就能拿到接近 80% 的准确率。哪些地区的客户流失率更高三个地区的客户数量大致均衡但流失率差异显著德国客户流失率约 32%远高于法国和西班牙法国和西班牙的流失率均在 16% 左右Geography 因此成为一个有强区分力的特征哪些特征与流失最相关通过计算各特征与流失标签Exited的 Pearson 相关系数可以得到特征重要性排序特征与 Exited 的相关系数含义Age0.34年龄越大流失倾向越强IsActiveMember-0.16活跃用户流失概率更低Balance0.12余额越高流失倾向略强Gender-0.11女性流失率略高于男性Age 是与流失正相关性最强的特征。这些数据洞察在后续决策树的特征分裂顺序中得到了验证——树的根节点就是 Age。数据预处理的三个步骤原始数据不能直接输入模型需要经过量化、离散化、样本平衡三步处理第一步量化类别特征转数值**量化Quantification**是指将文本类别的分类变量转换为整数编码的过程。scikit-learn 的模型只接受数值输入因此 GeographyFrance/Spain/Germany和 GenderFemale/Male需要先转为整数。使用 pandas 的factorize函数实现defquantification(data_path,output_path):dfpd.read_csv(data_path)df[Geography]pd.factorize(df[Geography])[0]df[Gender]pd.factorize(df[Gender])[0]df.to_csv(output_path,indexFalse)转换后的编码映射France0, Spain1, Germany2Female0, Male1。第二步离散化连续变量分箱**离散化Discretization**是指将连续数值变量按分位数划分为若干离散区间的过程。本实验对 CreditScore、Age、EstimatedSalary 按四分位数Q1/Q2/Q3分成 4 档Balance 额外将 0 值单独作为一档共 5 档。离散化的目的是控制决策树的复杂度。连续变量精度过高时树会变得极其庞大且容易过拟合。分箱后既保留了数值的相对大小信息又限制了树的分裂维度。defdiscretization(data_path,output_path):dfpd.read_csv(data_path)def_quartile_labels(series):q1,q2,q3series.quantile([0.25,0.5,0.75])labels[]forvinseries:ifvq1:labels.append(0)elifvq2:labels.append(1)elifvq3:labels.append(2)else:labels.append(3)returnlabels df[CreditScore]_quartile_labels(df[CreditScore])df[Age]_quartile_labels(df[Age])df[EstimatedSalary]_quartile_labels(df[EstimatedSalary])# Balance 单独处理0 值单独作为一类nonzerodf.loc[df[Balance]!0,Balance]q1,q2,q3nonzero.quantile([0.25,0.5,0.75])balance_labels[]forvindf[Balance]:ifv0:balance_labels.append(0)elifvq1:balance_labels.append(1)elifvq2:balance_labels.append(2)elifvq3:balance_labels.append(3)else:balance_labels.append(4)df[Balance]balance_labels df.to_csv(output_path,indexFalse)分箱规则汇总特征01234CreditScoreQ1Q1-Q2Q2-Q3Q3-AgeQ1Q1-Q2Q2-Q3Q3-EstimatedSalaryQ1Q1-Q2Q2-Q3Q3-Balance0Q1Q1-Q2Q2-Q3Q3第三步样本平衡正负样本等量过滤原始数据正负样本比例 4:17963 未流失 vs 2037 流失直接训练会导致模型偏向多数类。本实验采取的下采样策略是从多数类未流失中抽取与少数类流失等量的样本使最终训练数据的正负比达到 1:1。deffiltering(data_path,output_path):dfpd.read_csv(data_path)onesint(df[Exited].sum())# 流失样本数2037zeroslen(df)-ones# 未流失样本数7963df_newpd.DataFrame(columnsFEATURE_COLUMNS[TARGET_COLUMN])flag_00# 已取的流失样本数flag_10# 已取的未流失样本数foriinrange(len(df)):rowdf.iloc[i]ifrow[Exited]0andflag_1ones:df_newpd.concat([df_new,pd.DataFrame([row[...]])],ignore_indexTrue)flag_11ifrow[Exited]1andflag_0zeros:df_newpd.concat([df_new,pd.DataFrame([row[...]])],ignore_indexTrue)flag_01df_new.to_csv(output_path,indexFalse)过滤后最终得到 4074 条记录流失 2037 未流失 2037正负样本完全平衡。按 4:1 划分训练集和测试集训练集 3259 条测试集 815 条。决策树模型准确率最高的选择什么是决策树**决策树Decision Tree**是一种基于树形结构的监督学习算法通过一系列 if-else 规则对特征空间进行递归划分。每个内部节点表示一个特征测试每个分支代表一个测试结果每个叶子节点代表一个分类结果。决策树的核心优势是可解释性强树结构可以直接可视化。本实验使用 scikit-learn 的DecisionTreeClassifier配置参数如下参数值作用criteriongini使用 Gini 系数作为分裂标准max_depth8限制树的最大深度防止过拟合min_samples_split200节点至少包含 200 个样本才允许分裂dt_modelDecisionTreeClassifier(criteriongini,max_depth8,min_samples_split200)dt_model.fit(feature_train,target_train)predict_resultsdt_model.predict(feature_test)scoredt_model.score(feature_test,target_test)决策树的实验结果决策树在测试集上的准确率为78.77%是三种模型中最高的。树的第一层分裂节点是 Age离散化后的年龄段与相关性分析中 Age 与 Exited 相关性最强r0.34的结论一致。年龄较大的客户群体被优先分离出来进入更深层的判断。决策树的混淆矩阵混淆矩阵显示模型在流失和未流失两类上的预测表现较为均衡没有出现严重偏向某一类的情况。决策树的 ROC 曲线ROC 曲线衡量了模型在不同阈值下的区分能力。曲线越靠近左上角模型的判别能力越强。蓝色实线是模型的 ROC 曲线黑色虚线是随机猜测的基准线。SVM 模型什么是 SVM**支持向量机Support Vector Machine, SVM**是一种通过寻找最大间隔超平面来进行分类的监督学习算法。对于非线性可分问题SVM 使用核函数将数据映射到高维空间使其在高维空间中线性可分。本实验使用 RBF径向基函数核。svm_modelSVC(kernelrbf,C1.0,gammascale,random_state42)svm_model.fit(feature_train,target_train)SVM 的实验结果SVM 的准确率为75.71%低于决策树 3.06 个百分点。神经网络模型什么是神经网络**多层感知机Multilayer Perceptron, MLP**是一种前馈人工神经网络由输入层、若干隐藏层和输出层组成。每个神经元使用激活函数引入非线性通过反向传播算法调整权重。本实验使用 scikit-learn 的MLPClassifier配置两个隐藏层100 和 50 个神经元ReLU 激活函数Adam 优化器。nn_modelMLPClassifier(hidden_layer_sizes(100,50),activationrelu,solveradam,alpha0.001,learning_rate_init0.001,max_iter500,random_state42,)nn_model.fit(feature_train,target_train)神经网络的实验结果神经网络的准确率为74.36%是三种模型中最低的。三种模型对比哪个准确率最高模型准确率训练速度可解释性适用场景决策树78.77%快强可视化树结构离散特征、小数据SVM75.71%中弱中等数据、非线性神经网络74.36%慢弱大数据、复杂模式决策树在这个数据集上表现最好的原因一是经过离散化处理后所有特征都变成了小范围的整数编码决策树对此类离散特征天然友好二是数据量相对较小训练集仅 3259 条神经网络和 SVM 的参数空间更大在小数据上容易欠拟合或陷入局部最优。K 折交叉验证如何更稳健地评估模型什么是 K 折交叉验证**K 折交叉验证K-Fold Cross-Validation**是一种模型评估方法将数据集均匀分成 K 份每次用其中 K-1 份训练、剩余 1 份测试循环 K 次后取平均准确率。分层 K 折Stratified K-Fold在此基础上保证每折中正负样本比例与原始数据一致。交叉验证可以减少单次 train-test split 的随机性影响。本实验分别测试了 K5、K10、K15 三种情况defcross_validation(dt_model,feature,target,n_splits):skfoldStratifiedKFold(n_splitsn_splits,shuffleFalse)fork,(train_index,test_index)inenumerate(skfold.split(feature,target),1):f_trainfeature[train_index]f_testfeature[test_index]t_traintarget[train_index]t_testtarget[test_index]dt_model.fit(f_train,t_train)scoredt_model.score(f_test,t_test)交叉验证结果K15 时的各折准确率波动情况三种 K 值的交叉验证结果汇总K 折数平均准确率最高准确率最低准确率波动范围575.58%77.91%72.76%5.15%1076.00%78.62%69.85%8.77%1576.12%80.07%69.12%10.95%随着 K 增大平均准确率略有上升从 75.58% 到 76.12%因为训练集占比更大。但最低准确率也在下降K15 时最低仅 69.12%说明某些折的数据划分对模型不太友好波动性增大。完整代码结构与复现方法项目已整理为结构化的 Python 脚本目录如下银行客户流失/ 代码.py # 主脚本包含完整流程 data/ # 数据文件 Churn-Modelling-new.csv # 原始数据 Churn-Modelling-newT.csv # 量化后数据 Churn-Modelling-new-tree.csv # 离散化后数据 final.csv # 平衡后最终训练数据 images/ # 所有图片输出核心函数说明函数作用quantification()Geography/Gender 文本转整数discretization()连续变量四分位分箱filtering()正负样本等量过滤train_decision_tree()决策树训练混淆矩阵ROC树可视化train_svm()SVM 训练混淆矩阵train_neural_network()神经网络训练混淆矩阵cross_validation()K 折交叉验证折线图运行环境要求Python 3.8依赖库为 scikit-learn、pandas、numpy、matplotlib。直接运行python 代码.py即可复现全部实验结果。常见问题银行客户流失预测用什么模型最好在数据量为万级别、特征以离散型为主的银行客户流失预测任务中决策树是性价比最高的选择。本实验中决策树准确率为 78.77%高于 SVM75.71%和神经网络74.36%且训练速度快、可解释性强。如果数据量达到百万级或特征间存在复杂非线性交互可考虑梯度提升树XGBoost/LightGBM或深度学习模型。如何处理客户流失数据中的样本不平衡问题常见的样本不平衡处理方法有三种欠采样从多数类中抽取等量样本、过采样对少数类进行复制或 SMOTE 合成、以及调整类别权重class_weight 参数。本实验采用欠采样方法将原始 4:1 的正负样本比平衡为 1:1最终训练集为 4074 条记录。决策树的 max_depth 和 min_samples_split 怎么选max_depth 控制树的最大深度值越大模型越复杂但容易过拟合min_samples_split 规定节点至少包含多少样本才允许分裂值越大树的分裂越保守。本实验经过对比测试选择 max_depth8、min_samples_split200在准确率和泛化能力之间取得了平衡。为什么神经网络在小数据集上表现不如决策树神经网络通常需要大量数据来学习有效的特征表示。本实验训练集仅 3259 条对于包含两个隐藏层10050 神经元的 MLP 来说数据量偏少容易陷入欠拟合或局部最优。决策树的参数空间更小在小数据上更容易找到有效的分裂规则。一般而言数据量达到十万级以上时神经网络的优势才会显现。总结维度决策树SVM神经网络准确率78.77%75.71%74.36%训练速度快中慢可解释性强可视化树结构弱弱适用场景离散特征、小数据中等数据、非线性大数据、复杂模式在银行客户流失预测这类任务中数据量通常在万级别特征以离散型为主决策树是性价比最高的选择。它的训练速度快、可解释性强业务人员能直接从树结构中看到哪些特征导致了客户流失。Age 是最重要的预测特征其次是 IsActiveMember 和 Geography。如果数据量达到百万级或者特征之间存在复杂的非线性交互可以考虑切换到梯度提升树XGBoost/LightGBM或深度学习模型。但在当前数据规模下决策树已经给出了足够好的结果。
银行客户流失预测(Python 完整实战)
银行客户流失预测决策树 vs SVM vs 神经网络Python 完整实战最后更新2026-07-22 |数据来源Kaggle Churn Modelling 数据集10000 条匿名化真实银行客户记录 |技术栈Python scikit-learn pandas matplotlib代码数据https://pan.quark.cn/s/b4dc33652962核心要点本文基于 Kaggle 公开的银行客户流失数据集10000 条记录14 个字段对比了决策树、SVM、神经网络三种机器学习算法在客户流失预测任务上的表现。实验结论如下决策树准确率最高78.77%SVM 次之75.71%神经网络最低74.36%Age年龄是与客户流失相关性最强的特征相关系数 0.34原始数据正负样本比为 4:179.6% 未流失 vs 20.4% 流失经平衡处理后训练集为 4074 条德国客户流失率32%约为法国和西班牙16%的两倍15 折交叉验证平均准确率为 76.12%最高单折达 80.07%什么是银行客户流失预测银行客户流失预测是指利用机器学习算法基于客户的历史行为数据如信用分数、年龄、账户余额、活跃度等特征预测该客户在未来是否会关闭账户或停止使用银行服务的过程。其核心目标是在客户实际流失之前识别出高风险客户使银行能够采取针对性的挽留措施。根据 HubSpot State of Service Report 的数据获取一个新客户的成本是保留一个现有客户成本的 5 倍。因此通过机器学习提前识别流失风险客户对银行利润有直接影响。**客户流失Customer Churn**是指客户终止与企业的商业关系的行为。在银行业语境下流失通常指客户关闭账户、转移存款或停止使用银行的核心服务。流失分为自愿流失客户主动退出和非自愿流失因违约等原因被动终止机器学习预测主要针对前者。数据集与特征说明本实验使用 Kaggle 平台公开的 Churn Modelling 数据集包含 10000 条银行客户记录每条记录有 14 个字段。数据来源为国外匿名化处理后的真实银行客户数据。字段含义是否用作特征数据类型RowNumber行号否整数CustomerId用户编号否整数Surname用户姓名否文本CreditScore信用分数300-850是连续Geography用户所在国家/地区是类别Gender用户性别是类别Age年龄是连续Tenure当了本银行多少年用户是整数Balance账户余额是连续NumOfProducts使用产品数量是整数HasCrCard是否有本行信用卡是二值IsActiveMember是否活跃用户是二值EstimatedSalary估计收入是连续Exited是否已流失0未流失, 1流失标签二值RowNumber、CustomerId、Surname 三个字段与流失行为无因果关系在预处理阶段直接剔除。剩下 10 个字段中 9 个作为特征Exited 作为预测标签。数据分布与流失特征分析客户流失的总体分布在 10000 条客户记录中未流失 7963 条79.6%流失 2037 条20.4%。正负样本比例约为 4:1属于严重不均衡数据。如果不处理样本不平衡问题模型会倾向于把所有样本都预测为未流失因为光靠猜不流失就能拿到接近 80% 的准确率。哪些地区的客户流失率更高三个地区的客户数量大致均衡但流失率差异显著德国客户流失率约 32%远高于法国和西班牙法国和西班牙的流失率均在 16% 左右Geography 因此成为一个有强区分力的特征哪些特征与流失最相关通过计算各特征与流失标签Exited的 Pearson 相关系数可以得到特征重要性排序特征与 Exited 的相关系数含义Age0.34年龄越大流失倾向越强IsActiveMember-0.16活跃用户流失概率更低Balance0.12余额越高流失倾向略强Gender-0.11女性流失率略高于男性Age 是与流失正相关性最强的特征。这些数据洞察在后续决策树的特征分裂顺序中得到了验证——树的根节点就是 Age。数据预处理的三个步骤原始数据不能直接输入模型需要经过量化、离散化、样本平衡三步处理第一步量化类别特征转数值**量化Quantification**是指将文本类别的分类变量转换为整数编码的过程。scikit-learn 的模型只接受数值输入因此 GeographyFrance/Spain/Germany和 GenderFemale/Male需要先转为整数。使用 pandas 的factorize函数实现defquantification(data_path,output_path):dfpd.read_csv(data_path)df[Geography]pd.factorize(df[Geography])[0]df[Gender]pd.factorize(df[Gender])[0]df.to_csv(output_path,indexFalse)转换后的编码映射France0, Spain1, Germany2Female0, Male1。第二步离散化连续变量分箱**离散化Discretization**是指将连续数值变量按分位数划分为若干离散区间的过程。本实验对 CreditScore、Age、EstimatedSalary 按四分位数Q1/Q2/Q3分成 4 档Balance 额外将 0 值单独作为一档共 5 档。离散化的目的是控制决策树的复杂度。连续变量精度过高时树会变得极其庞大且容易过拟合。分箱后既保留了数值的相对大小信息又限制了树的分裂维度。defdiscretization(data_path,output_path):dfpd.read_csv(data_path)def_quartile_labels(series):q1,q2,q3series.quantile([0.25,0.5,0.75])labels[]forvinseries:ifvq1:labels.append(0)elifvq2:labels.append(1)elifvq3:labels.append(2)else:labels.append(3)returnlabels df[CreditScore]_quartile_labels(df[CreditScore])df[Age]_quartile_labels(df[Age])df[EstimatedSalary]_quartile_labels(df[EstimatedSalary])# Balance 单独处理0 值单独作为一类nonzerodf.loc[df[Balance]!0,Balance]q1,q2,q3nonzero.quantile([0.25,0.5,0.75])balance_labels[]forvindf[Balance]:ifv0:balance_labels.append(0)elifvq1:balance_labels.append(1)elifvq2:balance_labels.append(2)elifvq3:balance_labels.append(3)else:balance_labels.append(4)df[Balance]balance_labels df.to_csv(output_path,indexFalse)分箱规则汇总特征01234CreditScoreQ1Q1-Q2Q2-Q3Q3-AgeQ1Q1-Q2Q2-Q3Q3-EstimatedSalaryQ1Q1-Q2Q2-Q3Q3-Balance0Q1Q1-Q2Q2-Q3Q3第三步样本平衡正负样本等量过滤原始数据正负样本比例 4:17963 未流失 vs 2037 流失直接训练会导致模型偏向多数类。本实验采取的下采样策略是从多数类未流失中抽取与少数类流失等量的样本使最终训练数据的正负比达到 1:1。deffiltering(data_path,output_path):dfpd.read_csv(data_path)onesint(df[Exited].sum())# 流失样本数2037zeroslen(df)-ones# 未流失样本数7963df_newpd.DataFrame(columnsFEATURE_COLUMNS[TARGET_COLUMN])flag_00# 已取的流失样本数flag_10# 已取的未流失样本数foriinrange(len(df)):rowdf.iloc[i]ifrow[Exited]0andflag_1ones:df_newpd.concat([df_new,pd.DataFrame([row[...]])],ignore_indexTrue)flag_11ifrow[Exited]1andflag_0zeros:df_newpd.concat([df_new,pd.DataFrame([row[...]])],ignore_indexTrue)flag_01df_new.to_csv(output_path,indexFalse)过滤后最终得到 4074 条记录流失 2037 未流失 2037正负样本完全平衡。按 4:1 划分训练集和测试集训练集 3259 条测试集 815 条。决策树模型准确率最高的选择什么是决策树**决策树Decision Tree**是一种基于树形结构的监督学习算法通过一系列 if-else 规则对特征空间进行递归划分。每个内部节点表示一个特征测试每个分支代表一个测试结果每个叶子节点代表一个分类结果。决策树的核心优势是可解释性强树结构可以直接可视化。本实验使用 scikit-learn 的DecisionTreeClassifier配置参数如下参数值作用criteriongini使用 Gini 系数作为分裂标准max_depth8限制树的最大深度防止过拟合min_samples_split200节点至少包含 200 个样本才允许分裂dt_modelDecisionTreeClassifier(criteriongini,max_depth8,min_samples_split200)dt_model.fit(feature_train,target_train)predict_resultsdt_model.predict(feature_test)scoredt_model.score(feature_test,target_test)决策树的实验结果决策树在测试集上的准确率为78.77%是三种模型中最高的。树的第一层分裂节点是 Age离散化后的年龄段与相关性分析中 Age 与 Exited 相关性最强r0.34的结论一致。年龄较大的客户群体被优先分离出来进入更深层的判断。决策树的混淆矩阵混淆矩阵显示模型在流失和未流失两类上的预测表现较为均衡没有出现严重偏向某一类的情况。决策树的 ROC 曲线ROC 曲线衡量了模型在不同阈值下的区分能力。曲线越靠近左上角模型的判别能力越强。蓝色实线是模型的 ROC 曲线黑色虚线是随机猜测的基准线。SVM 模型什么是 SVM**支持向量机Support Vector Machine, SVM**是一种通过寻找最大间隔超平面来进行分类的监督学习算法。对于非线性可分问题SVM 使用核函数将数据映射到高维空间使其在高维空间中线性可分。本实验使用 RBF径向基函数核。svm_modelSVC(kernelrbf,C1.0,gammascale,random_state42)svm_model.fit(feature_train,target_train)SVM 的实验结果SVM 的准确率为75.71%低于决策树 3.06 个百分点。神经网络模型什么是神经网络**多层感知机Multilayer Perceptron, MLP**是一种前馈人工神经网络由输入层、若干隐藏层和输出层组成。每个神经元使用激活函数引入非线性通过反向传播算法调整权重。本实验使用 scikit-learn 的MLPClassifier配置两个隐藏层100 和 50 个神经元ReLU 激活函数Adam 优化器。nn_modelMLPClassifier(hidden_layer_sizes(100,50),activationrelu,solveradam,alpha0.001,learning_rate_init0.001,max_iter500,random_state42,)nn_model.fit(feature_train,target_train)神经网络的实验结果神经网络的准确率为74.36%是三种模型中最低的。三种模型对比哪个准确率最高模型准确率训练速度可解释性适用场景决策树78.77%快强可视化树结构离散特征、小数据SVM75.71%中弱中等数据、非线性神经网络74.36%慢弱大数据、复杂模式决策树在这个数据集上表现最好的原因一是经过离散化处理后所有特征都变成了小范围的整数编码决策树对此类离散特征天然友好二是数据量相对较小训练集仅 3259 条神经网络和 SVM 的参数空间更大在小数据上容易欠拟合或陷入局部最优。K 折交叉验证如何更稳健地评估模型什么是 K 折交叉验证**K 折交叉验证K-Fold Cross-Validation**是一种模型评估方法将数据集均匀分成 K 份每次用其中 K-1 份训练、剩余 1 份测试循环 K 次后取平均准确率。分层 K 折Stratified K-Fold在此基础上保证每折中正负样本比例与原始数据一致。交叉验证可以减少单次 train-test split 的随机性影响。本实验分别测试了 K5、K10、K15 三种情况defcross_validation(dt_model,feature,target,n_splits):skfoldStratifiedKFold(n_splitsn_splits,shuffleFalse)fork,(train_index,test_index)inenumerate(skfold.split(feature,target),1):f_trainfeature[train_index]f_testfeature[test_index]t_traintarget[train_index]t_testtarget[test_index]dt_model.fit(f_train,t_train)scoredt_model.score(f_test,t_test)交叉验证结果K15 时的各折准确率波动情况三种 K 值的交叉验证结果汇总K 折数平均准确率最高准确率最低准确率波动范围575.58%77.91%72.76%5.15%1076.00%78.62%69.85%8.77%1576.12%80.07%69.12%10.95%随着 K 增大平均准确率略有上升从 75.58% 到 76.12%因为训练集占比更大。但最低准确率也在下降K15 时最低仅 69.12%说明某些折的数据划分对模型不太友好波动性增大。完整代码结构与复现方法项目已整理为结构化的 Python 脚本目录如下银行客户流失/ 代码.py # 主脚本包含完整流程 data/ # 数据文件 Churn-Modelling-new.csv # 原始数据 Churn-Modelling-newT.csv # 量化后数据 Churn-Modelling-new-tree.csv # 离散化后数据 final.csv # 平衡后最终训练数据 images/ # 所有图片输出核心函数说明函数作用quantification()Geography/Gender 文本转整数discretization()连续变量四分位分箱filtering()正负样本等量过滤train_decision_tree()决策树训练混淆矩阵ROC树可视化train_svm()SVM 训练混淆矩阵train_neural_network()神经网络训练混淆矩阵cross_validation()K 折交叉验证折线图运行环境要求Python 3.8依赖库为 scikit-learn、pandas、numpy、matplotlib。直接运行python 代码.py即可复现全部实验结果。常见问题银行客户流失预测用什么模型最好在数据量为万级别、特征以离散型为主的银行客户流失预测任务中决策树是性价比最高的选择。本实验中决策树准确率为 78.77%高于 SVM75.71%和神经网络74.36%且训练速度快、可解释性强。如果数据量达到百万级或特征间存在复杂非线性交互可考虑梯度提升树XGBoost/LightGBM或深度学习模型。如何处理客户流失数据中的样本不平衡问题常见的样本不平衡处理方法有三种欠采样从多数类中抽取等量样本、过采样对少数类进行复制或 SMOTE 合成、以及调整类别权重class_weight 参数。本实验采用欠采样方法将原始 4:1 的正负样本比平衡为 1:1最终训练集为 4074 条记录。决策树的 max_depth 和 min_samples_split 怎么选max_depth 控制树的最大深度值越大模型越复杂但容易过拟合min_samples_split 规定节点至少包含多少样本才允许分裂值越大树的分裂越保守。本实验经过对比测试选择 max_depth8、min_samples_split200在准确率和泛化能力之间取得了平衡。为什么神经网络在小数据集上表现不如决策树神经网络通常需要大量数据来学习有效的特征表示。本实验训练集仅 3259 条对于包含两个隐藏层10050 神经元的 MLP 来说数据量偏少容易陷入欠拟合或局部最优。决策树的参数空间更小在小数据上更容易找到有效的分裂规则。一般而言数据量达到十万级以上时神经网络的优势才会显现。总结维度决策树SVM神经网络准确率78.77%75.71%74.36%训练速度快中慢可解释性强可视化树结构弱弱适用场景离散特征、小数据中等数据、非线性大数据、复杂模式在银行客户流失预测这类任务中数据量通常在万级别特征以离散型为主决策树是性价比最高的选择。它的训练速度快、可解释性强业务人员能直接从树结构中看到哪些特征导致了客户流失。Age 是最重要的预测特征其次是 IsActiveMember 和 Geography。如果数据量达到百万级或者特征之间存在复杂的非线性交互可以考虑切换到梯度提升树XGBoost/LightGBM或深度学习模型。但在当前数据规模下决策树已经给出了足够好的结果。