分类建模实战:交叉验证调参、下采样与 SMOTE 过采样解决样本失衡问题
前言在做分类任务时我们经常会遇到两个头疼的问题一是模型参数怎么调才靠谱二是数据集类别极度不平衡怎么办。今天就通过贷款资格检测这个经典数据集把交叉验证调参、下采样和过采样三种方法从头到尾走一遍。在银行信贷风控场景中最典型的问题就是样本不平衡绝大多数申请人会正常还款真正违约的用户只占极小比例。直接用原始数据训练模型往往整体准确率能到 99%但对违约样本的识别能力几乎为零完全达不到风控预警的要求。本文基于某银行脱敏后的贷款申请数据集从基础的交叉验证调参讲起再到下采样、SMOTE 过采样两种不平衡处理方案一步步落地实现。所有代码均附带详细注释可直接复现运行。一、交叉验证调参我们平时把数据切成训练集和测试集用训练集训模型、测试集看效果这种方法有个问题单次划分的结果偶然性很大换个随机种子可能准确率就变了。交叉验证的思路很简单把训练集分成 K 份轮流用 K-1 份训练、剩下 1 份验证重复 K 次后取平均得分。这样得到的模型性能评估更稳定调参也更可信。1.2 完整代码与逐段讲解① 导入工具包与混淆矩阵绘图函数import pandas as pd import numpy as np from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt # 混淆矩阵可视化函数 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), horizontalalignmentcenter, verticalalignmentcenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt这里封装了一个混淆矩阵绘图函数后面三个 demo 都会用到作用是把预测结果直观地展示成热力图每个格子里标上具体样本数。② 数据读取与预处理# 读取数据 data pd.read_csv(creditcard.csv) # 对 Amount 字段做标准化 from sklearn.preprocessing import StandardScaler scaler StandardScaler() data[Amount] scaler.fit_transform(data[[Amount]]) # 删除 Time 列对分类无帮助 data data.drop([Time], axis1) # 划分特征与标签 x data.drop([Class], axis1) y data[Class] # 划分训练集和测试集 7:3 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test train_test_split( x, y, test_size0.3, random_state0 )知识点StandardScaler把数据缩放到均值为 0、方差为 1逻辑回归对特征尺度敏感必须做标准化。Time列是交易发生的时间戳对欺诈检测没有直接意义直接删掉。random_state0固定随机种子保证每次运行划分结果一致方便复现。③ 交叉验证调参核心部分from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score scores [] c_param_range [0.01, 0.1, 1, 10, 100] for i in c_param_range: lr LogisticRegression(Ci, solverlbfgs, max_iter1000) # 8折交叉验证评估指标为准确率 score cross_val_score(lr, x_train, y_train, cv8, scoringaccuracy) score_mean sum(score) / len(score) scores.append(score_mean) print(score_mean) # 选出最优的 C 值 best_c c_param_range[np.argmax(scores)] print(f最优惩罚因子为{best_c})关键知识点C 参数逻辑回归中的正则化系数。C 越小正则化越强模型越简单越不容易过拟合C 越大正则化越弱模型越复杂。cv8表示 8 折交叉验证把训练集切成 8 份跑 8 次取平均。scoringaccuracy用准确率作为评估指标。最后用np.argmax(scores)找到得分最高对应的 C 值④ 模型训练与结果评估# 用最优参数训练最终模型 lr LogisticRegression(Cbest_c, max_iter1000) lr.fit(x_train, y_train) from sklearn import metrics # 训练集表现 train_predicted lr.predict(x_train) print(metrics.classification_report(y_train, train_predicted)) cm_plot(y_train, train_predicted).show() # 测试集表现 test_predicted lr.predict(x_test) print(metrics.classification_report(y_test, test_predicted, digits6)) cm_plot(y_test, test_predicted).show()classification_report会输出精确率、召回率、F1 值等指标。跑完你会发现整体准确率特别高99%但少数类老赖的召回率其实很低 —— 这就是类别不平衡带来的问题也是后面两个 demo 要解决的。二、下采样处理类别不平衡2.1 什么是下采样银行贷款数据集中正常贷款占 99% 以上老赖贷款只有不到 1%模型哪怕全预测为正常也能有 99% 的准确率但毫无实际意义。下采样Undersampling的做法是从数量多的类别里随机抽取一部分让正负样本数量相等。简单粗暴但缺点是会丢失大量多数类信息。2.2 核心代码① 下采样实现# 先把标签拼回训练集方便采样 x_train[Class] y_train data_train x_train # 分离正负样本 positive_eg data_train[data_train[Class] 0] # 正常交易 negative_eg data_train[data_train[Class] 1] # 欺诈交易 # 从多数类中随机抽取与少数类数量相同的样本 positive_eg positive_eg.sample(len(negative_eg)) # 拼接得到平衡数据集 data_c pd.concat([positive_eg, negative_eg]) x data_c.drop([Class], axis1) y data_c[Class]核心就是sample(len(negative_eg))这一行从正常交易里随机抽出和欺诈交易一样多的样本实现 1:1 平衡。② 交叉验证调参 训练评估from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score scores [] c_param_range [0.01, 0.1, 1, 10, 100] for i in c_param_range: lr LogisticRegression(Ci, solverlbfgs, max_iter2000) score cross_val_score(lr, x, y, cv8) score_mean sum(score) / len(score) scores.append(score_mean) print(score_mean) best_c c_param_range[np.argmax(scores)] print(f最优惩罚因子为{best_c}) # 训练最终模型 lr LogisticRegression(Cbest_c, solverlbfgs, max_iter2000) lr.fit(x, y)注意交叉验证是在下采样后的平衡数据集上做的但最终评估一定要在原始测试集上跑这样才能反映真实场景的效果。from sklearn import metrics # 在原始训练集上评估 train_predicted lr.predict(x_train.drop([Class], axis1)) print(metrics.classification_report(y_train, train_predicted)) cm_plot(y_train, train_predicted).show() # 在原始测试集上评估 test_predicted lr.predict(x_test) print(metrics.classification_report(y_test, test_predicted)) cm_plot(y_test, test_predicted).show()下采样后你会发现整体准确率下降了但老赖贷款的召回率明显提升了 —— 这才是我们真正关心的指标毕竟漏掉一笔老赖贷款的代价远大于误判一笔正常交易。三、SMOTE 过采样demo03 核心讲解3.1 什么是过采样下采样是减少多数类过采样Oversampling则是增加少数类。最简单的过采样是直接复制少数类样本但容易过拟合。SMOTESynthetic Minority Oversampling Technique是更智能的做法在少数类样本之间插值人工合成新的少数类样本既平衡了数据集又不容易过拟合。3.2 核心代码① SMOTE 过采样实现from imblearn.over_sampling import SMOTE oversample SMOTE(random_state0) os_x_train, os_y_train oversample.fit_resample(x_train, y_train)就这三行代码imblearn库直接帮你完成 SMOTE 算法输出的os_x_train和os_y_train就是平衡后的训练集正负样本 1:1。使用前需要先安装pip install imbalanced-learn② 交叉验证调参 训练评估from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score scores [] c_param_range [0.01, 0.1, 1, 10, 100] for i in c_param_range: lr LogisticRegression(Ci, solverlbfgs, max_iter1000) score cross_val_score(lr, os_x_train, os_y_train, cv5) score_mean sum(score) / len(score) scores.append(score_mean) print(score_mean) best_c c_param_range[np.argmax(scores)] print(f最优惩罚因子为{best_c}) lr LogisticRegression(Cbest_c, solverlbfgs, max_iter1000) lr.fit(os_x_train, os_y_train)同样评估要在原始测试集上进行from sklearn import metrics train_predicted lr.predict(x_train) print(metrics.classification_report(y_train, train_predicted)) cm_plot(y_train, train_predicted).show() test_predicted lr.predict(x_test) print(metrics.classification_report(y_test, test_predicted)) cm_plot(y_test, test_predicted).show()对比下采样和过采样的结果SMOTE 通常在保留数据信息上更有优势实际工业界用得也更多。四、小案例寝室分配数据把同样的流程套用到寝室分配数据集上整体流程和前面完全一致读取数据 → 标准化 → 划分训练测试集 → SMOTE 过采样 → 交叉验证调参 → 评估。唯一区别是数据格式不同用np.loadtxt读取 txt 文件核心逻辑和前面一模一样。五、方法对比与总结最后把三种方法的核心要点整理一下⚠️ 提一下采样操作只能在训练集上做测试集必须保持原始分布不动否则评估结果没有参考价值。

相关新闻

05:MITM 的五脏六腑——中间人的里里外外

05:MITM 的五脏六腑——中间人的里里外外

大家好,我是毛衣哥。前四期铺垫了那么多,这一期终于到实战环节了。我们把中间人拆开,看看它肚子里到底塞了什么——堵路、分身、造假、偷看、传话,五步走完,你也能当个"白帽中间人"。前四篇我们把 HTTPS 的加…

2026/7/31 4:10:53 阅读更多 →
3步快速上手GraphvizOnline:在线图表编辑完整指南

3步快速上手GraphvizOnline:在线图表编辑完整指南

3步快速上手GraphvizOnline:在线图表编辑完整指南 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline 你是否曾为绘制复杂的流程图、组织结构图或网络拓扑图而烦恼?GraphvizO…

2026/7/31 4:10:53 阅读更多 →
51单片机矩阵键盘线反转法:高效IO扩展与按键识别实战

51单片机矩阵键盘线反转法:高效IO扩展与按键识别实战

1. 项目概述:从独立按键到矩阵键盘的必然选择在嵌入式开发,尤其是基于51单片机的项目中,人机交互是绕不开的一环。早期做项目,需要几个按键,就直接用几个IO口接上拉电阻和按键,这就是独立按键。但当你的需求…

2026/7/31 4:09:52 阅读更多 →

最新新闻

安卓手机安装完整Linux环境:Termux+Proot实战指南

安卓手机安装完整Linux环境:Termux+Proot实战指南

1. 项目概述:在移动端构建一个完整的Linux环境 如果你是一名开发者、运维工程师,或者只是一个对Linux世界充满好奇的技术爱好者,有没有想过,你的安卓手机除了刷微博、打游戏,还能变成一个随时可用的Linux工作站&#x…

2026/7/31 4:48:27 阅读更多 →
lvs原理及常见问题解决方案

lvs原理及常见问题解决方案

一、集群的定义:由多个独立的服务器/电脑组成的单个系统对外提供服务,统一调度。前端与后端互不认识,前端只知道调度器信息;集群能够接收更多流量、后端有故障机也不会影响前端访问。二、集群分类:集群常见类型有三种,分别是LB(负…

2026/7/31 4:48:27 阅读更多 →
全国大学生智能汽车竞赛视觉组:嵌入式视觉算法与运动控制实战解析

全国大学生智能汽车竞赛视觉组:嵌入式视觉算法与运动控制实战解析

1. 项目概述:从赛道到代码,一场视觉与控制的极限挑战全国大学生智能汽车竞赛,尤其是视觉组,早已不是简单的“小车跑圈”游戏。它是一场融合了机器视觉、嵌入式系统、运动控制与人工智能算法的综合性工程实践擂台。我作为多次参与指…

2026/7/31 4:48:27 阅读更多 →
MPU6050寄存器配置详解:从初始化到校准的嵌入式开发实践

MPU6050寄存器配置详解:从初始化到校准的嵌入式开发实践

1. 项目概述:从零开始驯服MPU6050搞嵌入式开发的,尤其是玩STM32的,陀螺仪MPU6050这个“老朋友”肯定绕不过去。它集成了三轴加速度计和三轴陀螺仪,成本低、资料多,是姿态感知、平衡车、无人机、云台这些项目的入门首选…

2026/7/31 4:48:27 阅读更多 →
私有RAG知识库实战:LangChain与ChromaDB构建指南

私有RAG知识库实战:LangChain与ChromaDB构建指南

1. 项目概述:为什么你需要一个私有RAG知识库? 在信息爆炸的时代,我们每天接触的知识量远超大脑处理能力。作为技术从业者,我经常遇到这样的困境:上周才看过的技术方案细节,今天需要用时却怎么都想不起来&am…

2026/7/31 4:48:27 阅读更多 →
光纤通信四波混频效应MATLAB仿真实现

光纤通信四波混频效应MATLAB仿真实现

1. 光纤通信中的四波混频现象解析四波混频(Four-Wave Mixing, FWM)是光纤通信系统中一种重要的非线性光学效应。当多个不同波长的光波在光纤中共同传输时,由于介质的非线性极化特性,会产生新的频率分量。这种现象在波分复用(WDM)系统中尤为显著&#xff…

2026/7/31 4:47:27 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻