机器学习:交叉验证、下采样、过采样(银行贷款案例)

发布时间:2026/9/17 21:57:44

机器学习:交叉验证、下采样、过采样(银行贷款案例) 一、前言今天系统学习了逻辑回归在金融风控中的实战应用核心解决银行贷款预测中最经典的问题数据集类别不平衡 模型评估不准。在银行贷款数据中绝大多数用户正常还款负样本/多数类极少数用户违约坏账正样本/少数类如果直接训练模型逻辑回归会“摆烂”直接预测全部为不违约准确率很高、但是完全没有业务价值。因此今天重点掌握了三个核心工具下采样对多数样本做减法过采样SMOTE对少数样本做加法交叉验证稳定评估模型、选择最优参数二、业务场景为什么贷款数据必须做采样1. 类别不平衡问题银行贷款是极度不平衡二分类任务。逻辑回归的损失函数是全局平均损失样本数量多的类别会主导训练过程导致模型严重偏向多数类预测不违约违约样本识别率极低召回率差看似准确率很高实际风控完全失效2. 普通划分数据集的缺陷单纯 train_test_split 一次划分结果随机性大无法代表模型真实水平所以必须引入K 折交叉验证。三、三大核心技术原理1. 交叉验证K 折 CV核心作用避免单次数据集划分的偶然性稳定评估模型泛化能力自动筛选逻辑回归最优正则参数 C有效检测过拟合2. 下采样欠采样—— 减少多数类样本原理随机抽取部分正常用户样本让正负样本比例 1:1。优点训练速度快、彻底平衡样本、解决模型偏置。缺点丢失大量正常客户信息容易欠拟合。适用大数据量场景。3. 过采样SMOTE—— 扩增少数类样本原理不是简单复制违约样本而是根据近邻特征合成全新违约样本。优点不丢失任何原始数据、缓解过拟合、提升少数类识别能力。缺点极少数样本时容易生成虚假数据。适用金融风控主流首选方案。四、注意严禁全局采样正确流程先划分训练集、测试集只对训练集做下采样/过采样测试集保持原始真实分布原因测试集必须模拟真实业务场景不能人为平衡否则评估结果虚高、上线翻车。五、完整代码下采样 交叉验证import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, classification_report 绘制混淆矩阵 def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), hacenter, vacenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt 1. 读取数据与预处理 data pd.read_csv(r./creditcard.csv) scaler StandardScaler() data[Amount] scaler.fit_transform(data[[Amount]]) data data.drop([Time], axis1) 2. 划分训练集、测试集 X data.drop(Class, axis1) y data[Class] x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state0) 3. 下采样平衡训练集 train_data x_train.copy() train_data[Class] y_train major train_data[train_data[Class] 0] minor train_data[train_data[Class] 1] major_down major.sample(len(minor), random_state0) train_bal pd.concat([major_down, minor]) x_train_bal train_bal.drop(Class, axis1) y_train_bal train_bal[Class] 4. 交叉验证选最优 C c_list [0.01, 0.1, 1, 10, 100] scores [] for c in c_list: lr LogisticRegression(Cc, max_iter1000) res cross_val_score(lr, x_train_bal, y_train_bal, cv8, scoringrecall) scores.append(res.mean()) print(fC{c}, 召回率均值: {res.mean():.4f}) best_c c_list[np.argmax(scores)] print(最优惩罚因子 C:, best_c) 5. 训练模型 lr_final LogisticRegression(Cbest_c, max_iter1000) lr_final.fit(x_train_bal, y_train_bal) 评估 train_pred lr_final.predict(x_train_bal) print(训练集报告) print(classification_report(y_train_bal, train_pred)) cm_plot(y_train_bal, train_pred).show() test_pred lr_final.predict(x_test) print(测试集报告) print(classification_report(y_test, test_pred, digits6)) cm_plot(y_test, test_pred).show()六、完整代码过采样 SMOTE 交叉验证import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, classification_report from imblearn.over_sampling import SMOTE def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), hacenter, vacenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt 数据预处理 data pd.read_csv(r./creditcard.csv) scaler StandardScaler() data[Amount] scaler.fit_transform(data[[Amount]]) data data.drop([Time], axis1) X data.drop(Class, axis1) y data[Class] x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state0) SMOTE 过采样 smote SMOTE(random_state0) os_x_train, os_y_train smote.fit_resample(x_train, y_train) 交叉验证调参 c_list [0.01, 0.1, 1, 10, 100] scores [] for c in c_list: lr LogisticRegression(Cc, max_iter1000) res cross_val_score(lr, os_x_train, os_y_train, cv8, scoringrecall) scores.append(res.mean()) print(fC{c}, 召回率均值: {res.mean():.4f}) best_c c_list[np.argmax(scores)] print(最优惩罚因子 C:, best_c) 训练评估 lr_final LogisticRegression(Cbest_c, max_iter1000) lr_final.fit(os_x_train, os_y_train) train_pred lr_final.predict(os_x_train) print(过采样训练集报告) print(classification_report(os_y_train, train_pred)) cm_plot(os_y_train, train_pred).show() test_pred lr_final.predict(x_test) print(原始测试集报告) print(classification_report(y_test, test_pred, digits6)) cm_plot(y_test, test_pred).show()七、下采样 VS 过采样 对比方法核心思路优点缺点贷款场景推荐下采样删减多数类训练快、分布均衡丢失样本信息、易欠拟合大数据量可用SMOTE 过采样合成少数类不丢数据、效果更好少量样本易造伪数据金融场景首选交叉验证多折训练取平均评估稳定、精准调参计算量增大必用八、今日学习总结银行贷款预测是典型的不平衡二分类问题直接建模只会追求高准确率毫无业务意义。下采样通过删减多数样本平衡数据过采样 SMOTE通过合成少数样本优化模型。交叉验证解决模型评估不稳定、参数选择盲目问题是建模的标准流程。工业级最重要准则先划分数据集、再训练集采样、测试集绝对保真杜绝数据泄露。
延伸阅读

更多相关文章

2026/9/13 7:11:41

C++11核心特性实战指南:从auto到智能指针的现代编程

1. 项目概述:为什么C11值得你投入时间?如果你还在用着老旧的C98标准,或者对C的印象还停留在“复杂”、“难用”、“内存管理噩梦”的阶段,那C11对你来说,可能是一次认知上的彻底刷新。我刚开始接触C11时,感…

2026/9/14 0:06:37

UART与USART核心区别:从异步通信到同步通信的硬件设计解析

1. 项目概述:从“串口”说起,为何要区分UART和USART?搞嵌入式开发或者玩单片机的朋友,对“串口”这个词肯定不陌生。它就像设备之间最基础的“对话”通道,调试信息输出、模块数据交换、固件升级,哪一样都离…

2026/9/17 21:55:50

Pentagi:五阶段引导式交互,让AI Agent长链路任务稳定可控

我去年年底接手了一个半成品的 Agent 项目,核心痛点就一句话:模型一旦要在多步骤任务里连番调用工具,状态就乱成一锅粥。后来我把整套交互流程按“五个阶段”重构了一版,顺手开源了它,名字就叫 pentagi。这个名字我拆着…

2026/9/17 21:55:50

SIB严重障碍量表电子化:从.doc解析到计分入库与随访

简介:《严重障碍量表SIB.doc》是一份面向临床医生、护理人员、老年精神科研究者及临床试验从业者的专业评估文档,用于系统测量晚期阿尔茨海默病患者的认知功能水平,帮助判断损伤程度并支持个体化照护方案与疗效跟踪。量表共51个条目&#xff…

2026/9/17 21:55:50

模式识别实战指南:从原理到工业落地的七道关卡

1. 从“认出这张脸”开始:模式识别不是算法黑箱,而是人类认知的工程化复刻你早上刷手机时,相册自动把“家人”“宠物”“旅行”分好类;进小区闸机前,摄像头扫一眼就抬杆放行;甚至点外卖时,系统推…

2026/9/17 21:55:50

PCA9546A硬件I²C多路复用器原理与实战

1. 这颗芯片到底解决了什么实际问题?——从“总线打架”说起你有没有遇到过这样的场景:STM32主控上已经接了OLED、温湿度传感器、EEPROM三路IC设备,地址分别是0x3C、0x40、0x50,一切正常;某天你加了个新的IC压力传感器…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码