尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
银行客户逾期预测:XGBoost+LR与GBDT+LR模型实战
简介面向计算机专业毕业设计与课程设计的机器学习实战项目完整覆盖银行客户逾期行为预测的建模流程项目已获导师指导并高分通过。项目内置训练集、测试集与标准提交示例已通过严格调试并可直接运行适合高年级学生用于毕设参考或项目实战练习。压缩包共十个文件核心包括三个CSV数据文件、三个Jupyter Notebook分析脚本并有字段说明表、使用说明文本和Python辅助脚本辅助理解与复现整体大小约127.3MB。Notebook分为数据探索、XGBoostLR、GBDTLR三个阶段清晰呈现从探索性数据分析、特征工程到模型对比与融合预测的完整方案。读者可借助完整数据集、可运行代码和字段字典快速定位关键步骤降低调参与排错成本目前已有229人学习下载资源结构清晰适合需要尽快落地模型的开发者。1. 银行客户逾期行为预测这个毕设源码包到底解决什么问题银行客户逾期预测是典型的机器学习二分类问题也是风控场景里最常拿来练手的实战题目。这份基于机器学习的银行客户逾期行为预测源码包把「数据探索 → 特征工程 → 模型训练 → 结果提交」整条链路都补齐了train.csv、test.csv、submission.csv 和三个 notebook 一一对应不是那种只有算法片段的教学代码。对正在做毕业设计、课程设计或者想练项目实战的从业者来说这套源码最大的价值在于它是一份能直接跑通的项目模板数据是现成的特征处理逻辑是完整的XGBoostLR 和 GBDTLR 两条模型路线都给你写好了。你不用从零搭环境、找数据、调参拿到 zip 解压之后按使用说明.txt 走一遍就能看到结果。2. 项目文件与数据主线从 train.csv 到 submission.csv 怎么衔接2.1 目录结构每个文件在流程里的位置先看这份源码的目录结构它比大多数网上流传的「源码包」要完整得多。. ├── data │ ├── 字段说明.xlsx │ ├── train.csv │ ├── test.csv │ └── submission.csv ├── notebook │ ├── 用户逾期_EDA.ipynb │ ├── XGBoostLR.ipynb │ └── GBDTLR.ipynb ├── 使用说明.txt └── .gitignoredata 目录下四个文件的分工很明确字段说明.xlsx 是数据字典train.csv 带标签用于训练与验证test.csv 是待预测样本submission.csv 是标准提交格式。notebook 目录下三个 ipynb 是核心代码其中 EDA 负责探索性分析后面两个分别对应不同的模型组合。我拿到这类项目第一步永远是打开 使用说明.txt 和 字段说明.xlsx先把数据字典和运行顺序搞清楚再去看代码不然很容易跑偏。2.2 数据字典字段说明.xlsx 决定特征方向字段说明.xlsx 是这份资源里最容易被忽略、实际价值最高的文件。它把 train.csv 里每一列的字段名、类型和业务含义都列出来了。以银行逾期场景的通用数据形态来说通常包含客户基础信息年龄、性别、职业类型、信用历史历史逾期次数、征信查询次数、负债情况负债率、贷款金额以及目标变量是否逾期但具体列名以你解压后的字段说明.xlsx 为准。训练集和测试集拿到手第一步是确认字段对齐。常见做法是先把两边的列名集合对比一遍import pandas as pd train pd.read_csv(data/train.csv) test pd.read_csv(data/test.csv) train_cols set(train.columns) test_cols set(test.columns) # 找出两边不一致的列通常是目标变量和用户ID print(只在train中出现的列, train_cols - test_cols) print(只在test中出现的列, test_cols - train_cols)这段代码用来验证训练集和测试集的特征列是否一致。只在 train 中出现的列一般是标签列只在 test 中出现的列通常是 ID 列这两类在建模时都要单独处理。参数方面不需要额外设置只要保证 train.csv 和 test.csv 的读取路径正确。2.3 完整建模流程三个 notebook 怎么衔接使用说明.txt 里建议的运行顺序是先跑 EDA 理解数据再跑 XGBoostLR 或 GBDTLR 其中一个模型。注意这两个建模 notebook 是并列关系不是先后依赖关系你选一条路线执行即可。实际跑的时候我会多做一个动作把 EDA 里发现的缺失值分布、类型分布结论记在旁边然后在建模 notebook 里对照验证。比如 EDA 发现某个类别特征有大量空值建模时就要决定是填充还是单独分一档。流程上大致是「EDA 产出洞察 → 特征工程 → 五折交叉验证训练 → 预测 test.csv → 生成 submission.csv」。整个链条在 XGBoostLR.ipynb 里是完整闭环的这一点在毕设答辩时也非常好讲。3. EDA 先行用户逾期_EDA.ipynb 里的分布检查与缺失值处理3.1 逾期率与样本不平衡先看目标变量用户逾期_EDA.ipynb 第一个关键输出是目标变量的分布。银行逾期场景几乎必然面临样本不平衡问题——逾期客户占比通常远低于正常客户占比可能只有个位数到十几个百分点。如果上来直接建模模型会倾向把所有样本预测为「不逾期」AUC 可能看着还行但实际业务价值很低。先做分布统计import pandas as pd import matplotlib.pyplot as plt train pd.read_csv(data/train.csv) # 假设目标列名是 is_overdue以实际字段说明.xlsx为准 target_col is_overdue rate train[target_col].mean() print(f逾期样本占比{rate:.4f}) train[target_col].value_counts().plot.bar() plt.title(Target Distribution) plt.show()这个输出决定了后续要不要做采样处理。mean 值如果低于 0.2就属于不平衡场景常见的处理方向是调 class_weight、用 AUC 做评估指标、或者做 SMOTE 过采样。我一般不建议一上来就重采样优先试 class_weight 和评估指标调整效果不够再考虑生成样本。3.2 缺失值和类型字段两个方向要分清楚EDA notebook 里一定会做缺失值统计和类型分布检查。缺失值处理的方向取决于字段含义连续型变量用均值或中位数填充类别型变量要么填充众数要么把缺失单独归为一档。银行数据里「拒绝贷款」「查询次数缺失」这类情况很常见缺失本身可能就是有效信息。# 缺失率统计 missing_ratio train.isnull().mean().sort_values(ascendingFalse) print(missing_ratio[missing_ratio 0]) # 类型字段单独看 cat_cols train.select_dtypes(include[object]).columns for col in cat_cols: print(f{col}: {train[col].nunique()} 个类别)缺失率高的列如果超过 50%我会倾向于直接删掉而不是填充除非业务上明确说这个字段很重要。类型字段看 nunique 是为了判断是应该做 one-hot 还是 label encoding——类别数少于 10 的用 one-hot 不心疼超过 20 个类别的就要考虑 frequency encoding 或者 embedding否则维度爆炸。3.3 特征筛选方向从 EDA 里读出建模优先级EDA 的终点是产出特征清单。常见做法是把字段按「强相关、弱相关、噪声」分三档强相关字段直接进入建模弱相关字段先保留让模型自己筛噪声字段直接剔除。银行逾期场景里历史逾期次数、负债率、征信查询次数通常属于强相关特征这类字段在 EDA 里往往能看出明显的分布差异。做过一轮 EDA 之后你会得到一个重要结论这份数据的特征工程重点在「组合特征」而不是「堆特征」。这也是后面 XGBoostLR 和 GBDTLR 两个 notebook 存在的意义——用树模型自动做特征组合再喂给线性模型。4. XGBoostLRGBDT 特征变换与逻辑回归的训练细节4.1 为什么用 XGBoostLR 而不是单独 XGBoostXGBoostLR 这个组合的核心思路来自 Facebook 的经典论文用 GBDT 做特征变换把原始特征映射到叶子节点的编号上生成高阶组合特征再用逻辑回归做最终分类。单独用 XGBoost 的问题是树模型对特征分布不敏感逻辑回归的强项是线性可解释两者结合既拿到了树的非线性表达能力又保留了线性模型的稳定性。原理层面的关键点GBDT 生成的是叶子索引不是叶子值。每个样本落到哪片叶子就形成一个 one-hot 编码的新特征。举例说明一棵深度为 3 的树有 8 片叶子一棵树就能产生 8 个候选特征位多棵树拼接之后特征维度是「树的数量 × 叶子数」。4.2 核心代码叶子索引做特征变换import xgboost as xgb import numpy as np from sklearn.linear_model import LogisticRegression def gbdt_lr_transform(X_train, y_train, X_test, n_estimators100, max_depth4): # 用 XGBoost 训练一个用于特征变换的模型 xgb_model xgb.XGBClassifier( n_estimatorsn_estimators, max_depthmax_depth, learning_rate0.1, subsample0.8, colsample_bytree0.8, random_state42 ) xgb_model.fit(X_train, y_train) # 拿到训练集和测试集落到每棵树的叶子索引 train_leaves xgb_model.apply(X_train) test_leaves xgb_model.apply(X_test) print(f训练集特征变换后的形状: {train_leaves.shape}) # 叶子索引拼接成字符串再用 OneHotEncoder 编码 from sklearn.preprocessing import OneHotEncoder enc OneHotEncoder(handle_unknownignore) train_trans enc.fit_transform(train_leaves) test_trans enc.transform(test_leaves) lr LogisticRegression(C0.1, max_iter500) lr.fit(train_trans, y_train) return lr, enc, train_trans, test_trans这段代码有几个关键参数要解释。n_estimators 和 max_depth 控制树的复杂度和叶子总数树的棵数越多、深度越大组合特征维度越高但这个维度不是越高越好——在实际项目里 100 棵树、深度 4 会产生上万维稀疏特征这时候 C 值要相应调小防止过拟合。subsample 和 colsample_bytree 都是防过拟合的参数取值 0.8 是比较稳的默认值。apply 方法和 predict 不同它返回的是每个样本在每棵树上的叶子节点编号这一步是特征变换的核心。OneHotEncoder 的 handle_unknownignore 很关键因为测试集可能出现训练集没见过的叶子组合这个参数避免了对未知类别的报错。4.3 训练与评估五折交叉验证的细节XGBoostLR.ipynb 里做的是五折交叉验证每折先拿训练部分训练 GBDT做特征变换再训练 LR对验证部分做同样的变换后评估 AUC。这个流程有个容易踩的坑GBDT 是在每一折的 train 部分重新训练的不是在全部数据上预先训练好的否则会造成数据泄露。Notebook 里用交叉验证的方式把 GBDT 的特征变换也纳入验证流程这种做法是对的。训练之后评估指标要看 AUC 和 KS。银行领域更看重 KS 是因为它衡量的是模型区分好坏客户的最大差距营销和风控都有实际意义。5. GBDTLR 对照实验与常见问题排查5.1 GBDT 版本差异sklearn 与 lightgbm 的区别GBDTLR.ipynb 里的 GBDT 可能来自 sklearn 的 GradientBoostingClassifier也可能用了 lightgbm 的 LGBMClassifier。两者在特征变换上的思路一致但工程细节差异不小。sklearn 的 GBDT 训练慢叶子索引需要 apply 方法lightgbm 更快但需要额外处理类别特征并且在拿到叶子索引时的 API 是 predict(X, pred_leafTrue)。如果你在别的项目里做过 GBDTLR这里大概率遇到过 API 不一致的问题。5.2 两个模型的效果对照与耗时对比按照项目使用说明.txt 的描述XGBoostLR 和 GBDTLR 在训练完成后预测的结果都写入 submission.csv 格式对应的位置。实际做对照实验时我会把两个模型在交叉验证集上的 AUC 和训练耗时记录成一张表模型训练耗时验证集 AUC稀疏特征维度XGBoostLR约 3 分钟略高约 5000 维GBDTLR约 1 分钟接近约 5000 维具体数值以你自己跑出来的结果为准不要照搬。耗时差距的根源是 XGBoost 默认用贪心算法找最佳分裂点而 lightgbm 用直方图算法在数据量大时后者快很多。选择哪个当主模型我的习惯是看验证集差异是否超过 0.005超过就用高的没超过用快的。5.3 常见问题排查逾期预测里五个典型坑第一个坑是数据泄露。现象交叉验证 AUC 很高但提交后分数明显偏低。原因特征工程里用了全量数据的统计信息比如用 train 和 test 一起做 fillna 或标准化。解决所有统计量只从训练集计算测试集用训练集的统计量做变换。第二个坑是类别特征处理不一致。现象训练集正常测试集报错特征数量不匹配或者 predict 崩溃。原因训练集和测试集类别分布不同one-hot 之后列数对不上。解决用 pd.get_dummies 时先 concat 再拆开或者用 sklearn 的 ColumnTransformer 统一处理保证两边走同一套变换逻辑。第三个坑是时间顺序被忽略。现象测试集的时间比训练集晚模型泛化能力差。原因训练集和测试集如果按时间划分数据存在时序依赖直接随机划分会高估模型效果。解决用时间切分代替随机切分前 80% 时间做训练后 20% 做验证。第四个坑是逾期样本占比极低时预测结果全为 0。现象提交的 submission.csv 里概率全部接近 0没有区分度。原因逻辑回归对正负样本比例敏感GBDT 的叶子索引维度太高导致 LR 欠拟合。解决先给 LR 加 class_weightbalanced或者把 C 值调大一点让模型有更强的拟合能力。第五个坑是 zip 包解压后路径带中文或空格。现象pd.read_csv 报错找不到文件。原因Windows 默认编码和路径解析问题。解决解压后把目录重命名为纯英文路径读取文件时用原始字符串 rdata/train.csv 防止转义问题。6. 进阶技巧从预测概率到逾期决策的调整习惯拿到 submit.csv 只是流程终点但做风控模型的人都知道概率输出到业务决策之间还有一段路要走。这份源码包已经帮你走完了从数据到模型的完整链路剩下这一段我可以分享一个执行习惯。第一评估模型不要只看 AUC把所有阈值下的结果算一遍。AUC 是综合指标实际业务里你可能只需要在特定阈值下有区分度。用 PR 曲线找到召回率在 0.5 左右的最优阈值这个操作在信贷风控里比 AUC 更贴近业务。第二回归基础数据分布。模型上线前重新做一遍 train.csv 的单变量分布统计与建模时对比有没有漂移。常见做法是算 PSI 指标PSI 超过 0.2 说明分布变化明显模型需要重新训练。我一般会在建模完成一周后再跑一次这个检查很多模型离线 AUC 不差、上线效果差问题就出在这里。第三刻意验证 submission.csv 的格式。用 pd.read_csv 读回来确认行数与 test.csv 一致、概率值在 0 到 1 之间。这个动作看起来多余我吃过一次亏——某次交付时 ID 列没保持顺序导致全部预测结果错位从那以后我每次跑完都强制走一遍格式校验。现在我也建议你拿到这套源码后先把这一步的习惯建立起来。这份资源本身质量不错从 EDA 到双模型对照到提交格式都是完整的拿来当毕设或项目实战都够用。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

CrewAI智能体S3写入工具封装指南:让模型结果可靠落盘

CrewAI智能体S3写入工具封装指南:让模型结果可靠落盘

先说个背景:我最近在做一批 CrewAI 智能体项目时,遇到一个非常普遍的需求——让智能体把最终结果“落盘”到对象存储里。一开始我直接在智能体的任务里让模型打印 JSON,再用外部脚本去抓取,结果又乱又不可靠。后来把“写入 S3”封…

📅 2026/9/28 12:17:17
Launch4j实战:Java应用打包成Windows双击EXE的完整指南

Launch4j实战:Java应用打包成Windows双击EXE的完整指南

Launch4j这个工具,我断断续续用了大概七八年。最早接触是在给单位做一个内部台账小工具的时候,好不容易把功能写完,结果同事一句"怎么双击打不开"直接把我说懵了——后来才明白,不是程序有问题,是对方电脑上…

📅 2026/9/28 12:12:17
用Docker部署CoolMonitor:轻量级监控平台从零到一实战指南

用Docker部署CoolMonitor:轻量级监控平台从零到一实战指南

前阵子朋友塞给我一台2C4G的小机器,说让我帮忙“盯起来”。开始我没当回事,结果真要装监控的时候才发现,Prometheus全家桶装完内存先干掉一大半;用Zabbix又嫌太重,配置起来没有一两个晚上下不来。翻了一圈,…

📅 2026/9/28 12:12:17
MORE NEWS

更多资讯

📰

嘉立创EDA专业版原理图绘制实战:从网络标签到模块化设计

前阵子有个新人问我:嘉立创EDA专业版画原理图,为什么我画出来总是乱得像毛线团,明明连线都接对了,可一到PCB设计阶段就四处漏风。这个问题我太有感触了。PCB设计的起点不是布线,而是原理图。一张清晰的原理图不仅是电气…

📰

卡丁车语音控制实战:硅麦选型、I²S配置与指令优化

1. 为什么卡丁快跑组的语音控制总“听不懂”——从麦克风选型开始就踩了第一个坑全国大学生智能车竞赛里,“卡丁快跑组”这几年越来越火,规则明确允许语音指令作为辅助控制手段,但真正跑通、稳定、上赛道不翻车的队伍不到三成。我连续带了四届…

📰

Java毕设实战:宠物商务智慧管理系统全解析

毕设季一到,"宠物商务智慧管理系统"这类题目几乎成了Java方向选题的常客。听起来既有电商的商务属性,又带着"智慧"俩字的光环,还能光明正大地上传一份源码——但真上手做的时候,很多人连需求都没理清就开始写…

📰

TCP/UDP网络调试助手源码解析:C++与C#双语言实现与调试避坑

简介:这是一份TCP与UDP网络调试助手的完整资源包,内含可运行的SocketTool工具及C/C#源码实现,适合网络编程初学者与开发者调试TCP、UDP通信场景。压缩包共62个文件、18.71MB,以Qt动态库(dll)、C源码&#x…

📰

Blender建模模式+动态网格编辑+Geometry Script联动工作流详解

做三维内容这些年,我从 Edit Mode 一路用到 Geometry Nodes,见过太多人在“看得见的网格”和“算出来的网格”之间反复横跳。最近几版 Blender 把 Modeling Tools、Mesh Editing 和节点的边界敲掉了一大块:几何节点编辑器的 Modeling Mode 让…

📰

游戏引擎架构的本质:团队分工如何决定底层架构

1. 这不是教科书,是十年引擎团队踩出来的路“游戏引擎架构 001:从团队分工到底层架构”——这个标题里藏着一个被太多教程忽略的真相:引擎不是写出来的,而是长出来的。它不是某个人在深夜敲出的一堆C类,而是一群人、在…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬