资讯动态

贷款风控数据挖掘实战:多维特征融合与客户聚类预警

发布时间:2026/10/27 19:05:53 来源:尧图企业网站定制
把基于多维特征融合的互联网贷款客户聚类与风险预警研究和基于数据挖掘的互联网贷款用途与风险定价可视化研究这两行题目拆开看其实就是一套完整的风控数据挖掘流水线左边是客户聚类和风险预警右边是贷款用途分析与风险定价中间用数据挖掘和可视化串起来。不少同学拿到这个毕设题目之后第一反应是慌因为标题里全是概念不知道从哪下手。我按自己跑通这套流程的实际经验告诉你它没有想象中那么玄核心就是 Pandas Sklearn ECharts 这一条线把数据洗好、聚类做对、模型能解释、可视化好看论文和答辩就都立住了。这篇文章面向的读者有两类一类是真要做这个毕设、需要能跑的代码 能讲的原理 能答辩的呈现的本科生另一类是想了解贷款风控中聚类和风险定价怎么结合的同学。我会从数据准备、特征融合、聚类选型、预警建模到可视化大屏把每一个环节的取舍和坑都讲透包括导师喜欢追问的细节也会一并说清楚。1. 毕设定题拆解贷款客户聚类和风险定价本质上是同一个问题1.1 从客户是谁到客户值不值得放款聚类在风控链路里的位置银行和互联网贷款平台每天会产生大量用户行为数据和申请数据。过去传统的做法是给每个客户单独打分看一个人的逾期概率高不高。但这里有个隐藏问题单客户视角下你很难看出哪一类客户整体上有共性风险。比如自由职业 短期小额借款 借款用途为旅游这一群人和企业主 大额借款 用途为经营周转这一群人他们内部的行为模式差异很大老模型把所有特征摊平了算风险信号反而被稀释。聚类在这里解决的就是从看一个点变成看一群点。把客户按照多维特征聚成若干簇之后每一簇内部高度相似、簇与簇之间差异明显。这时候再回头看风险预警就不是所有人用同一个阈值而是不同人群匹配不同的风险底线和定价策略。所以这题把聚类和风险定价放在一起逻辑上是一体的先分群再分别评估风险再给每个群定不同的价格。我在实际跑数据的时候最大的感受是聚类这部分做得干不干净直接决定后面风险模型的底线。簇分得不好后面算出来的违约概率再漂亮放到业务上也没法解释。反过来只要簇形状合理、每簇都有清晰的用户画像哪怕后面只用逻辑回归这种最朴素的模型出来的结果也足够写出一个有说服力的毕设。1.2 数据挖掘方法在这套系统里的完整分工这个题目里出现了一串关键词——多维特征融合、聚类、数据挖掘、可视化它们不是各干各的而是串成一条流水线特征工程阶段用数据挖掘里的清洗、编码、降维手段把原始申请记录变成能喂给算法的多维特征矩阵聚类阶段用无监督学习找出客户群体结构常见候选是 K-Means、层次聚类、DBSCAN风险预警阶段把聚类得到的簇标签当作新的输入信息结合历史还款表现做监督学习输出违约概率风险定价阶段把违约概率折算成利率或额度梯度可视化阶段把每一层的输出都落到图表上形成完整的故事线。这五个阶段对应你论文目录的五个核心章节也对应你代码仓库里五个目录。很多毕设翻车的原因不是算法不会调而是阶段之间脱节聚类做了个寂寞风险模型跟聚类结果完全没有关系可视化只是堆了几个图表。正确的做法是让每一阶段的输出都成为下一阶段的输入形成一个完整链条。后面我会按这个顺序逐段拆解。2. 多维特征融合这一步最费时间数据清洗、编码与降维的实操细节2.1 贷款数据里常见的四类特征以及它们怎么进入模型我见过太多人拿到数据集就开始跑 K-Means结果跑出来一团浆糊。原因基本都出在特征没处理好。贷款场景的特征通常可以分成四类处理方式完全不同特征类型典型字段处理方式备注连续数值型年龄、收入、借款金额、信用分缺失值填充 标准化/归一化直接进模型前必须缩放分类型职业、学历、婚姻状况、贷款用途标签编码或独热编码标签编码有序独热编码无序有序分类型信用等级 A/B/C、收入等级映射成数字保留顺序关系衍生特征负债收入比、近3月查询次数自行构造往往比原始特征更有效关于贷款用途这一点因为是基于数据挖掘的互联网贷款用途与风险定价可视化研究这个副标题的重心要特别留意。用途字段在原始数据里往往是字符串比如教育医疗装修购车周转。字符串不能直接喂给聚类算法一般做法是先用标签编码或者先做一步粗分类合类比如把购买家电购买手机合并为消费类把进货扩大经营合并为经营类。合类这一步不要偷懒因为用途和风险的相关性非常强消费类尤其是非必要消费通常对应更高的违约率。我个人的习惯是先写一个feature_engineer.py把所有的清洗和构造都收敛到一个函数里每次修改只动这个文件。后面聚类结果不好、想要回头看特征有没有问题只需跑这一份代码不用翻十几个 notebook。毕设写到论文里也好描述一个表格列清楚每个特征的处理方式即可。2.2 标准化方向容易踩的坑聚类算法大多基于距离计算比如欧氏距离。如果不做标准化收入这个字段动辄几万而借款期限只有几十收入直接主导了距离计算其他特征全部变成摆设。这一步几乎所有教程都会提但实际写代码时仍然容易踩两个坑。第一个坑是标准化的时机不对。很多人拿到数据先标准化再切分训练集测试集这是错的。正确流程是先用训练集的数据 fit 出一个 StandardScaler再对测试集做 transform避免测试集的信息提前泄漏到训练过程里。第二个坑是对不同类型特征用了同一套标准化。独热编码之后的 0/1 特征本身已经在同一尺度上不需要再缩放而连续值特征需要标准化。我见过一份代码把独热特征也塞进 StandardScaler结果原本的 0/1 结构被改变了聚类出来的簇怎么也解释不清。还有一个常被忽略的细节缺失值处理不要一上来就填中位数。贷款数据的缺失往往是有业务含义的比如收入缺失可能意味着收入不稳定或信息造假。可以先看看缺失率如果某个字段缺失超过 40%要么删除要么专门做一个是否缺失的指示特征。缺失率低的字段用中位数或众数填充并在论文里把这个处理理由写清楚。这个小点导师经常会问。2.3 降维PCA 什么时候用、什么时候别用多维特征融合之后特征维度通常会到三四十维甚至更高。高维数据直接聚类有两个问题一是距离计算被大量噪声维度干扰二是聚类结果没法可视化。这时候 PCA主成分分析往往被当成万能解法但它不是任何时候都该用。PCA 适合的场景是特征之间相关性高有明显的共线性且你只是想压缩到两三个维度做可视化和大致观察。它不适合的场景是你希望保留特征的可解释性来撰写风险评估报告。PCA 降维之后每个主成分都是原始特征的线性组合你很难对导师解释第五个主成分的业务含义是什么。我的建议是分两条路走建模之前先保留标准化后的全量特征做聚类对比实验聚完簇之后再用 PCA 把聚类结果降到两维或三维用于绘制散点图。这样既保证了模型信息量又兼顾了可视化。如果你担心特征太多导致聚类不稳定可以先做一步相关性分析把相关系数高于 0.8 的特征二选一删除这种留业务可解释性的降维比直接 PCA 更适合写在毕设里。3. 聚类算法实测记录K-Means、层次聚类和 DBSCAN 的三个对比3.1 K-Means 标准流程肘部法则和轮廓系数都别省K-Means 是贷款客户聚类最常用的算法没有之一。它的优点是快、实现简单、结果好解释缺点是必须预先指定簇数 K而且对初始中心点敏感。Sklearn 里KMeans(n_clustersk, n_init10, random_state42)基本够用n_init10表示跑 10 次选最优这点一定要设置否则结果不稳定论文里的图换了随机种子就变了答辩会很尴尬。确定 K 值最常用的方法是手肘法和轮廓系数。手肘法看的是簇内误差平方和SSE随着 K 增大 SSE 会下降下降速度在某个 K 值出现明显拐点这个拐点就是肘。轮廓系数则是综合衡量簇内紧凑度和簇间分离度取值范围 [-1,1]越大越好。实际操作中这两个指标给出的最优 K 经常不同处理方式是多测几个再综合判断优先选择轮廓系数较高、且簇大小不至于出现一个簇占了 70% 样本的 K 值。import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score sse [] silhouette_scores [] K_range range(2, 9) for k in K_range: km KMeans(n_clustersk, n_init10, random_state42) labels km.fit_predict(X_scaled) sse.append(km.inertia_) silhouette_scores.append(silhouette_score(X_scaled, labels)) # 画两个子图一个看肘部一个看轮廓系数聚类跑完别急着进入下一步。一定要把每个簇的各种特征均值拉出来形成簇画像表。比如簇 0 可能是低收入、低额度、借款用途集中为日常消费、平均年龄偏小簇 1 可能是高收入、高额度、用途主要是经营周转。簇画像表既是验证聚类效果的关键产物也是论文第四章和第五章的核心论据。如果某个簇画像看不出明显业务差异说明特征选择有问题回头调整特征比硬调参数更重要。3.2 层次聚类的可解释性和它被吐槽的计算瓶颈很多同学选层次聚类是被它的树状图吸引一眼看去就很有学术感。层次聚类Hierarchical Clustering的优点是结果呈现为树状谱系图可以从不同高度切割得到不同簇数可解释性和展示性都很强缺点是计算复杂度高在几千条贷款样本上跑还可以样本量到几万时明显变慢。Python 里做层次聚类通常用 SciPy 的linkage和dendrogram而不是 Sklearn因为画树状图只有 SciPy 原生支持。Sklearn 虽然有AgglomerativeClustering但画不了树状图很多人在这里卡住。from scipy.cluster.hierarchy import linkage, dendrogram, fcluster import matplotlib.pyplot as plt Z linkage(X_scaled, methodward) plt.figure(figsize(12, 6)) dendrogram(Z, truncate_modelevel, p5) plt.title(Hierarchical Clustering Dendrogram) plt.show() # 在某个高度切割 labels_hier fcluster(Z, t4, criterionmaxclust)在这个毕设里层次聚类不适合当主力模型跑全量数据但它非常适合作为方法对比章节的一部分。你可以用 K-Means 作为最终的分群方案用层次聚类的树状图来验证 K 值选择的合理性或者用层次聚类在小样本集上做展示。论文里专门有一小节做基于层次聚类的客户分群实证分析把树状图和簇特征对比表放进去导师会觉得你对算法掌握比较全面。实际跑的时候要注意methodward和其余方法的差异。Ward 法倾向于生成大小更均衡的簇适合贷款客户分群如果数据里有明显的拓扑结构可以换average或complete对比。另外树状图横轴如果直接画原始样本序号几万个样本的图会糊成一团用truncate_modelevel截断显示是实践经验这个小细节值得写到论文里。3.3 DBSCAN 对异常借款人的特殊价值K-Means 和层次聚类都属于基于距离的划分方法它们有个共同弱点对噪声点太敏感离群样本会被强行拉进某个簇结果把簇中心带偏。贷款数据里确实存在奇怪样本比如申请金额和收入完全不匹配的套现嫌疑客户、短时间内密集申请多笔贷款的客户这些样本在风控上恰恰是最需要关注的。DBSCAN 不像前两者它不需要指定簇数只需要两个参数eps邻域半径和min_samples最小邻居数把密度足够高的区域聚成簇密度很低或孤立的点直接标记为噪声。它天然能识别那些不该和任何正常人群混在一起的客户。我实测下来在贷款数据上直接用原始高维特征跑 DBSCAN 效果往往不好因为高维空间下密度定义会很脆弱。更实用的做法是先用 PCA 降维到二维或三维再跑 DBSCAN让密度变得有意义。eps可以用 K-距离图来选择绘制每个点到第min_samples近邻居的距离排序曲线找曲线肘部对应的距离。这个点比较细节能讲清楚就能在答辩里加分。DBSCAN 在这个毕设里的定位和层次聚类类似可以当作 K-Means 的对照组来用。最理想的输出是K-Means 得到了 4 个清晰的客户群DBSCAN 在这些客户之外识别出了 5% 左右的噪声客户而这部分客户的实际违约率远高于其他任何簇。这样一个结论等于把你的聚类和风险预警两个模块真正打通了。4. 风险预警怎么落地从簇标签到违约概率和定价梯度4.1 把聚类结果转成监督学习的输入特征聚类是无监督学习把客户分群之后并没有直接给出这个客户会不会违约的结论。风险预警需要监督学习所以第一步是给样本打标签。标签来源通常是历史还款记录字段可能是loan_status、is_default、overdue这一类。处理原则是明确什么算作风险样本逾期 30 天算不算逾期 90 天算不算还是直接看是否坏账这个定义必须在论文里写清楚因为不同定义会显著影响正负样本比例。按我的经验把 status 映射成 0/1 的时候尽量不要用逾没逾期过这种过于宽泛的标准不然正样本可能占到 40% 以上模型会失去区分度。相对合理的做法是逾期超过 60 天或进入催收状态才算 1其余算 0。聚类结果怎么参与监督学习很多人想不明白。有几种可行方式最简单的是把所属簇编号直接作为一个类别特征拼进特征矩阵更好一点的方式是把每个簇的特征画像比如簇均值、簇违约率作为簇级特征再加到每个样本上还有一种做法是分簇训练多个模型每个簇单独一个分类器。前两种适合毕设的体量第三种会让工作量翻倍但可以作为扩展点放在论文展望里。这里就体现出多维特征融合这个题眼的含义了。原始特征描述的是个体簇特征描述的是群体两者拼在一起模型既能看到单个人的风险又能看到他所处群体的系统性风险。我在实验里对比过加入簇特征之后模型的 AUC 通常有小幅提升更重要的是业务可解释性大幅增强——你一眼能看出这个簇的人整体违约率就是偏高。4.2 模型选型逻辑回归的可解释性 vs 树模型的上限风险预警模型候选方案无非逻辑回归、决策树、随机森林、XGBoost、LightGBM。毕设里怎么选要看你的论文故事线是什么。逻辑回归的最大优势是可解释性极强系数可以直接解读为收入每增加一个单位违约对数几率下降多少。这在贷款风控场景非常受用导师也会认可这种业务可解释性。缺点是拟合非线性关系的能力有限如果特征和违约率之间存在复杂的交互效应逻辑回归会吃亏。随机森林和 XGBoost 的优势是精度上限更高、能自动处理特征交互、还能输出特征重要性。缺点是可解释性弱一些。对于毕设来说推荐的做法是主模型用逻辑回归建立可解释的基准再用随机森林或 XGBoost 做对比实验证明一加一减的差异。注意 XGBoost 需要单独安装如果环境配置有问题用sklearn自带的GradientBoostingClassifier也能达到类似效果还省事。from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score lr LogisticRegression(max_iter1000, class_weightbalanced) rf RandomForestClassifier(n_estimators300, random_state42, class_weightbalanced) for name, model in [(Logistic Regression, lr), (Random Forest, rf)]: scores cross_val_score(model, X_train, y_train, cv5, scoringroc_auc) print(f{name}: {scores.mean():.4f} (/- {scores.std():.4f}))类别不平衡是贷款违约数据里的常态违约样本往往只占 5%~15%。如果不做处理模型会把所有人都预测成正常因为这样准确率就已经很高了。处理方式有几种class_weightbalanced是最简单的SMOTE 过采样也常用但要注意只在训练集上做不能动测试集还可以调低判断阈值让模型在召回率上有更好的表现。论文里记得同时报告准确率、召回率、F1、AUC不要只写准确率在正负样本不平衡的场景下准确率其实没有说服力。4.3 风险定价利率梯度怎样从模型输出里算出来风险定价是这个题目最容易被忽略的部分但恰恰是和贷款用途勾连得最紧的环节。风险定价的本质是违约概率高的客户理应承担更高的利率以补偿放贷方承担的额外风险。把模型输出的违约概率p映射到定价等级可以分成几个梯度。比如p 0.05给低利率档0.05 ≤ p 0.15给正常档p ≥ 0.15给高利率档或者更精细化地按分位数切分。定价公式可以简单做成定价利率 资金成本利率 运营成本率 预期损失率 目标利润率其中预期损失率就是违约概率 × (1 - 回收率)。回收率是坏账后还能收回的比例毕设里可以用一个固定假设比如 40%并且写出这个假设的依据。贷款用途在这个阶段能扮演什么角色在簇画像里我们可能发现用途为经营周转的簇平均违约率低于日常消费的簇。那么同样一笔一万元的借款两个簇的预期损失率不同定价利率就应当不同。这种人群差异反映到利率差异的结论用一张表格就能很直观地呈现出来。我建议在代码里搞一个pricing.py输入聚类标签和违约概率输出每个客户的风险定价等级。然后把不同用途、不同簇的平均定价差异用可视化展示出来。到了这一步模型就不是纸上谈兵了而是真正模拟了一个可落地的定价逻辑答辩时讲这个部分含金量会明显高于我调参调出了 0.9 的准确率。5. 可视化大屏怎么做才拿得出手从 ECharts 到 Flask 的轻量方案5.1 技术选型为什么不用重量级 BI可视化通常是毕设最后冲刺阶段做的东西也是最直观展示工作量的一项。常见的路线有几种纯静态 Jupyter 图表、BI 工具PowerBI、Tableau、Web 可视化大屏。Jupyter 图表适合过程展示但不能形成独立作品BI 工具拖拽方便但答辩演示的时候容易显得太傻瓜而且无法体现编程能力。我的建议是走 Web 大屏路线前端用 ECharts后端用 Flask 或 FastAPI两者都是轻量级的一个学计算机的本科生一个星期足够上手。ECharts 是目前国内可视化项目的事实标准图表类型丰富、交互流畅、文档中文友好拿它做贷款客户聚类和风险预警的可视化非常贴合题目里的可视化关键词。后端只需要提供一个数据读取接口前端拿到 JSON 渲染图表逻辑很清晰。from flask import Flask, jsonify import pandas as pd import json app Flask(__name__) app.route(/api/cluster_profile) def cluster_profile(): df pd.read_csv(cluster_profile.csv) return jsonify(json.loads(df.to_json(orientrecords))) if __name__ __main__: app.run(debugTrue)如果连 Flask 都不太熟还有个更省事的方案直接写一个静态 HTML 文件里面用 ECharts 的fetch或Ajax请求后端接口或者把 JSON 数据直接内嵌在 HTML 的script标签里。这样甚至不需要起一个完整后端服务双击就能打开省掉了环境部署的一堆麻烦。5.2 核心图表怎么选每一个都要有信息量可视化大屏最忌讳的是为了有图而有图。我见过一些毕设大屏挤了十几个图表信息互相重复一眼不知道重点在哪。正确做法是把前面几步的关键结论一屏之内讲清楚。针对这个题目我建议至少包含五类图表一个二维或三维散点图展示聚类后的客户分布PCA 降维后绘制不同簇用不同颜色这是整个大屏的主视觉一个雷达图展示不同簇在关键维度如收入、额度、逾期率上的画像对比让人一眼看出簇间差异一个柱状图或热力图展示不同贷款用途的违约率差异呼应副标题里的贷款用途与风险定价一张表格或条形图展示各簇的样本量占比和平均违约率一个桑基图或漏斗图展示风险评级从低到高的客户数量流动直观呈现定价梯度的结构。还有一个很多教程不会提醒的细节大屏图表之间的颜色体系必须统一。比如 K-Means 聚出 4 个簇那么散点图里 4 个簇的颜色、雷达图里 4 条折线的颜色、柱状图里 4 个图例的颜色必须一一对应。颜色一变跨图对比就没法做了答辩时导师很容易看出来是拼凑的。5.3 大屏布局和答辩演示的实操细节大屏的经典布局是顶部放标题和全局指标总客户数、总体违约率、平均定价利率中间放主视觉散点图左侧放雷达图和簇占比图右侧放贷款用途柱状图和风险等级桑基图。整个页面控制在 1920×1080 分辨率下的一个视口内不要滚动这是大屏和普通网页最大的区别。在实际动手之前先把cluster_profile.csv、risk_result.csv这类中间结果文件准备好每个文件对应几个图表。ECharts 的 option 配置里注意tooltip的formatter要能显示簇名称、违约率这些业务字段直接放英文列名给导师看会减分。答辩演示时的几个小技巧提前把图表的数据全部缓存成静态 JSON演示时千万不要现场请求数据库万一网络波动或端口没起整个呈现会崩准备两套配色方案深色背景适合大屏展示但投影仪上深色底往往反光严重可以临时切换成浅色底鼠标悬停交互和点击联动提前演示一遍让导师看到不是静态截图。这些细节看似和算法无关但直接影响答辩印象分。6. 毕设排期与代码组织的实战建议6.1 三个月的工作量分配这个题目体量不小但三个月时间是够用的前提是不要前松后紧。我的建议是这样拆分时间段任务产出第 1~2 周数据获取、清洗、特征工程可直接跑的数据集、特征说明表第 3~4 周聚类实验、K 值选择、簇画像K-Means/层次聚类/DBSCAN 对比结果第 5~6 周风险预警建模、模型对比混淆矩阵、AUC、特征重要性第 7 周风险定价逻辑和利率梯度计算定价结果表第 8~9 周ECharts 可视化大屏可交互的 Web 大屏第 10~12 周写论文、整理代码、答辩 PPT论文初稿和最终版很多人会在特征工程阶段卡很久反复调整清洗逻辑导致后面时间紧张。我的建议是第一版特征工程不要追求完美用常规的标准化 编码先跑通一版聚类后续再迭代优化。先有全流程再有空优化这个节奏比一步到位可靠得多。6.2 代码结构怎么组织才好在论文里写清楚代码组织的核心原则是论文每写一节代码仓库里就能找到一个对应文件。推荐结构如下loan_cluster_risk/ ├── data/ # 原始数据和中间结果 ├── src/ │ ├── feature_engineer.py # 特征工程 │ ├── cluster.py # 聚类实验 │ ├── risk_model.py # 风险预警模型 │ ├── pricing.py # 风险定价 │ └── visualize.py # 数据导出给前端 ├── web/ │ ├── app.py # Flask 后端 │ └── static/index.html # ECharts 大屏 └── docs/ ├── 需求说明.md └── 实验结果记录.md这样的结构在毕设源码文件里写得清清楚楚评阅老师看代码时不用猜某个功能在哪所有模块划分一目了然。每个.py文件首部的 docstring 写清楚输入输出关键函数加注释不要为了省事写一堆只有自己看得懂的缩写变量名。源码本身也是评分的一部分整洁的工程结构就是潜在的加分项。另一个很多人忽略的地方是把主要实验过程输出成 Markdown 或 CSV 日志比如每次聚类取了几类、轮廓系数多少、模型 AUC 多少。这些记录在写论文实验分析章节时特别好用不用回头重新跑代码回忆数据。6.3 答辩现场老师最常问的几个问题答辩预案是这套毕设最后一道工序。针对这个题目导师的提问基本集中在以下五个方向我把参考思路一并列出来为什么选 K-Means 而不是其他聚类算法 参考回答K-Means 计算效率高适合中等规模数据实测轮廓系数优于层次聚类在大样本上的表现且簇结果可解释DBSCAN 作为补充方法识别噪声客户。K 值怎么确定的为什么不选其他 K 参考回答综合肘部法则和轮廓系数K4 时二者折中最好同时簇画像差异明显业务上可解释。聚类和风险模型是什么关系为什么不直接用监督学习 参考回答聚类是无监督探索先刻画客户群体结构簇标签作为特征再进入监督学习提升模型性能并让结果具有业务语义。特征重要性里哪个特征最重要 参考回答可以根据随机森林的feature_importances_或逻辑回归系数回答并结合业务解释一定要提前准备好这个表。你的风险定价模型在真实业务中能用吗 参考回答坦诚说明是简化模拟设定了一定额度、期限、回收率假设真实业务中还需要引入资金成本、运营成本等理论框架是一致的。提前把这些问题写进答辩讲稿现场就会从容很多。尤其是为什么类问题这是这套题最容易暴露只调包不理解原理的地方。最后说一个我个人的体会这套题目看起来有两个半句实际上是一个完整故事——互联网贷款平台需要用数据挖掘理解客户、预测风险、制定价格可视化则让整个过程对决策者透明。做的时候不要把它拆成两个独立的模块硬凑按照我上面这条线索串起来代码、论文和答辩都会顺畅得多。祝写作顺利。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑