机器学习:交叉验证、下采样、过采样(银行贷款案例)
一、前言今天系统学习了逻辑回归在金融风控中的实战应用核心解决银行贷款预测中最经典的问题数据集类别不平衡 模型评估不准。在银行贷款数据中绝大多数用户正常还款负样本/多数类极少数用户违约坏账正样本/少数类如果直接训练模型逻辑回归会“摆烂”直接预测全部为不违约准确率很高、但是完全没有业务价值。因此今天重点掌握了三个核心工具下采样对多数样本做减法过采样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通过合成少数样本优化模型。交叉验证解决模型评估不稳定、参数选择盲目问题是建模的标准流程。工业级最重要准则先划分数据集、再训练集采样、测试集绝对保真杜绝数据泄露。

相关新闻

STM32F103外部晶振从8MHz升级16MHz:硬件匹配、软件配置与系统验证全攻略

STM32F103外部晶振从8MHz升级16MHz:硬件匹配、软件配置与系统验证全攻略

1. 从8MHz到16MHz:一次看似简单却暗藏玄机的时钟升级最近在调试一块基于STM32F103C8T6的老项目板子,手头正好缺8MHz的晶振,翻箱倒柜只找到几颗16MHz的。一个念头冒出来:能不能直接把外部晶振从8MHz换成16MHz来用?毕竟S…

2026/10/13 20:45:42 阅读更多 →
C++11核心特性实战指南:从auto到智能指针的现代编程

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

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

2026/10/15 10:03:47 阅读更多 →
UART与USART核心区别:从异步通信到同步通信的硬件设计解析

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

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

2026/10/15 7:17:44 阅读更多 →

最新新闻

LED点阵显示任意汉字:从字模生成到串口协议全链路实现

LED点阵显示任意汉字:从字模生成到串口协议全链路实现

简介:本资源是一套完整的LED点阵汉字显示系统开发包,面向嵌入式初学者、单片机课程设计者及AVR实践爱好者,解决“如何让88或1616点阵动态显示任意GB2312汉字”这一典型硬件交互问题。压缩包共18个文件,含AVR下位机核心代码&#x…

2026/10/15 18:30:45 阅读更多 →
B样条刀具路径规划:解决数控加工曲率突变与连续性约束

B样条刀具路径规划:解决数控加工曲率突变与连续性约束

简介:本资源是一套面向数控加工与CAM算法学习者的MATLAB刀具路径规划实现方案,聚焦B样条曲线建模这一核心路径生成技术,适用于机械制造、自动化及控制工程方向的本科生、研究生及工程技术人员。压缩包共5个文件,全部为.m脚本&…

2026/10/15 18:30:45 阅读更多 →
虚拟机装Ubuntu全攻略:VMware从零到跑通,新手避坑指南

虚拟机装Ubuntu全攻略:VMware从零到跑通,新手避坑指南

很多刚开始折腾Linux的同学,第一件事就是想装个Ubuntu看看长什么样,但又不敢直接用家里的电脑冒险。这时候虚拟机就是最好的“试验场”——在现在的系统里开出一台虚拟电脑,随便折腾,装坏了大不了删掉重建,完全不影响宿…

2026/10/15 18:30:45 阅读更多 →
惠构思 AI|分层适配本硕博论文写作,打通学术创作全流程

惠构思 AI|分层适配本硕博论文写作,打通学术创作全流程

每到毕业季,不少学生会陷入论文困境:本科生纠结章节框架,硕士生卡在文献综述梳理,博士生发愁几十万字长文逻辑自洽。论文写作并非单纯文字堆砌,而是一套完整的学术论证工程。惠构思 AI 聚焦不同学历阶段论文差异化需求…

2026/10/15 18:30:45 阅读更多 →
AD5421源代码解析:工业4–20mA环路驱动与HART同步实战指南

AD5421源代码解析:工业4–20mA环路驱动与HART同步实战指南

简介:本资源为AD5421高精度12位DAC芯片的完整KEIL C嵌入式驱动源码包,面向工业控制、智能仪表与HART协议设备开发的嵌入式工程师及高校电类专业高年级学生,解决HART兼容DA转换器在实际项目中的底层驱动移植、通信协议实现与硬件协同调试等核心…

2026/10/15 18:30:45 阅读更多 →
Java实现微信企业付款到零钱(v3接口)实战指南

Java实现微信企业付款到零钱(v3接口)实战指南

简介:本资源是一份面向Java后端开发者的企业级微信支付实战代码包,聚焦微信企业付款到零钱核心功能,适用于工资发放、奖金结算、退款处理等真实业务场景。资源共2个Java源文件,总大小仅3KB,轻量精炼:其中Wx…

2026/10/15 18:29:44 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →