当前位置: 首页 > ai >正文

【数学建模学习笔记】样本均衡

零基础小白入门:用 Imblearn 搞定样本均衡

如果你是刚接触数据分析的小白,不用怕!这篇总结会用 “大白话 + 步骤拆解”,带你搞懂 “样本均衡” 是什么、为什么要做,以及怎么用 Imblearn 工具轻松实现。

一、先搞懂 3 个基础问题:什么是样本均衡?为什么要做?

1. 什么是 “样本不均衡”?

简单说,就是数据里不同类别的样本数量差太多。
比如你要分析 “学生考试及格 / 不及格”,结果数据里有 900 个 “及格” 样本,只有 100 个 “不及格” 样本 —— 这就是典型的 “样本不均衡”。

咱们实验里用的 “鸢尾花数据集” 其实本来是均衡的(每种鸢尾花各 50 个样本),但实验是为了教我们 “遇到不均衡时该怎么办”。

2. 为什么样本不均衡会坑?

机器学习模型很 “懒”,会偏向数量多的类别。
比如上面的例子,模型哪怕把所有学生都预测成 “及格”,正确率也有 90%,但它完全没学会分辨 “不及格” 的学生 —— 这对我们要解决的问题(比如找出需要补课的学生)来说,根本没用!

3. 解决思路:3 种采样方法

核心就是让 “少数类” 和 “多数类” 的样本数量差不多,主要分 3 种思路:

  • 过采样:给少数类 “加样本”(比如把 100 个不及格样本变成 900 个)
  • 欠采样:给多数类 “减样本”(比如把 900 个及格样本变成 100 个)
  • 组合采样:又加少数类,又减多数类(比如把不及格样本加到 500 个,及格样本减到 500 个)

二、手把手教你用 Imblearn 实现 3 种采样(代码 + 效果)

首先要明确:所有操作都基于 “先拆分数据”—— 把数据分成 “特征”(比如鸢尾花的花萼长度、花瓣宽度,是模型用来判断的依据)和 “标签”(比如 “维吉尼亚鸢尾”,是模型要预测的结果)。
拆分代码很固定,记下来就行:

# 特征X:去掉“品种”列,剩下的都是判断依据
X = df.drop(columns=['品种'])
# 标签y:只有“品种”列,是要预测的类别
y = df['品种']

1. 过采样:给少数类 “加样本”

适合数据总量少的情况(比如总共就 1000 个样本,不想再删了),常用 2 种方法:

① 随机过采样(最简单)

原理:直接把少数类的样本 “复制” 几份,凑够和多数类一样的数量。
代码 + 效果:

# 1. 调用随机过采样工具
ros = RandomOverSampler()
# 2. 对特征和标签同时处理(必须一起处理!)
X_resampled, y_resampled = ros.fit_resample(X, y)
# 3. 看处理后每种鸢尾花的数量
pd.Series(y_resampled).value_counts()

结果:每种鸢尾花都是 50 个(因为原数据均衡,这里是模拟 “如果有少数类,就复制到 50 个”)。

② SMOTE 过采样(更智能)

原理:不是直接复制,而是在 “少数类样本之间” 生成新的、类似的样本(比如少数类有 2 个样本 A 和 B,就生成一个介于 A 和 B 之间的新样本)。
优点:避免 “复制样本” 导致的模型 “记答案”(过拟合)问题。
代码 + 效果:

# 1. 调用SMOTE工具
smote = SMOTE()
# 2. 处理数据
X_resampled, y_resampled = smote.fit_resample(X, y)
# 3. 看结果
pd.Series(y_resampled).value_counts()

结果和随机过采样一样(每种 50 个),但生成的样本是 “新的”,更适合实际场景。

2. 欠采样:给多数类 “减样本”

适合数据总量多的情况(比如有 10 万样本,删一些不影响),常用 2 种方法:

① 随机欠采样(最简单)

原理:从多数类里 “随机删掉” 一些样本,凑够和少数类一样的数量。
代码 + 效果:

# 1. 调用随机欠采样工具
rus = RandomUnderSampler()
# 2. 处理数据
X_resampled, y_resampled = rus.fit_resample(X, y)
# 3. 看结果
pd.Series(y_resampled).value_counts()

结果:每种鸢尾花都是 17 个(这里模拟 “如果少数类是 17 个,就把多数类删到 17 个”)。

② 聚类删除(更智能)

原理:先把多数类的样本分成几个 “小簇”(比如把多数类分成 10 个簇),然后每个簇只留一个 “代表样本”(簇中心),这样既减少了数量,又保留了多数类的特征。
代码 + 效果:

# 1. 调用聚类删除工具
cc = ClusterCentroids()
# 2. 处理数据
X_resampled, y_resampled = cc.fit_resample(X, y)
# 3. 看结果
pd.Series(y_resampled).value_counts()

结果也是每种 17 个,但比随机删除更能保留多数类的 “关键信息”(不会删掉重要样本)。

3. 组合采样:又加又减,兼顾两者

适合样本不均衡特别严重的情况(比如多数类 10000 个,少数类 100 个),常用 2 种方法:

① SMOTE + ENN(过采样 + 删噪声)

原理:先用水 SMOTE 给少数类加样本,再用 “ENN 算法” 删掉一些 “可疑样本”(比如和其他类别混在一起的样本,这些是噪声,留着会坑模型)。
代码 + 效果:

# 1. 调用SMOTEENN工具
smote_enn = SMOTEENN()
# 2. 处理数据
X_resampled, y_resampled = smote_enn.fit_resample(X, y)
# 3. 看结果
pd.Series(y_resampled).value_counts()

结果:山鸢尾 50 个、维吉尼亚鸢尾 50 个、变色鸢尾 46 个(因为删掉了 4 个可疑的变色鸢尾样本)。

② SMOTE + Tomek(过采样 + 删边界)

原理:先用水 SMOTE 给少数类加样本,再用 “Tomek 算法” 删掉 “两类边界上的样本”(这些样本容易让模型混淆,删掉后类别更清晰)。
代码 + 效果:

# 1. 调用SMOTETomek工具
smote_tomek = SMOTETomek()
# 2. 处理数据
X_resampled, y_resampled = smote_tomek.fit_resample(X, y)
# 3. 看结果
pd.Series(y_resampled).value_counts()

结果:山鸢尾 50 个、维吉尼亚鸢尾 49 个、变色鸢尾 49 个(删掉了 2 个边界样本)。

三、小白必记:3 种方法怎么选?(优缺点 + 适用场景)

采样类型优点缺点适合场景
过采样不丢数据,能利用所有信息可能复制 / 生成相似样本,导致模型过拟合(记答案)数据总量少,不想删样本
欠采样速度快,不会有重复样本会丢数据,可能删掉重要信息数据总量多,删一点不影响
组合采样兼顾 “加少数类” 和 “去噪声”,效果更稳步骤多,对电脑算力稍高样本不均衡严重,追求更好的模型效果

四、总结:零基础入门的 3 个关键

  1. 先看数据:拿到数据先算 “每个类别的样本数量”(用pd.Series(y).value_counts()),判断是否不均衡。
  2. 选对方法:数据少用 “过采样”,数据多用 “欠采样”,不均衡严重用 “组合采样”。
  3. 工具固定:Imblearn 库的用法很固定 —— 先 “调用工具”(比如smote = SMOTE()),再 “处理数据”(fit_resample(X,y)),最后 “看结果”(value_counts())。
http://www.xdnf.cn/news/19675.html

相关文章:

  • (一)基础复习(委托)
  • Python-Flask企业网页平台深度Q网络DQN强化学习推荐系统设计与实现:结合用户行为动态优化推荐策略
  • 902作业
  • @Value注解底层原理(二)
  • Redis 的整数集合:像分类收纳盒一样的整数专属存储
  • Obsidian本地笔记工具:构建知识网络关联笔记,支持Markdown与插件生态及知识图谱生成
  • LoRA至今历程回顾(74)
  • 《水浒智慧》第二部 “英雄是怎么炼成的” (上篇)读书笔记
  • Linux文本处理工具
  • 机器算法(五)模型选择与调优
  • 基于SpringBoot的广科大在线图书管理系统设计与实现(代码+数据库+LW)
  • 探索JavaScript机器学习:几款流行的库推荐
  • Leetcode 3670. Maximum Product of Two Integers With No Common Bits
  • HTML第四课:个人简介页面开发
  • 下载速度爆表,全平台通用,免费拿走!
  • DaemonSet Job CronJob 概念理解
  • XML在线格式化 - 加菲工具
  • Leetcode二分查找(3)
  • 移动硬盘删除东西后,没有释放空间
  • 【机器学习入门】5.2 回归的起源——从身高遗传到线性模型的百年演变
  • 狄利克雷分布作用
  • CentOS 创建站点
  • 二进制流进行预览pdf、excel、docx
  • Cisco FMC利用sftp Server拷贝文件方法
  • 0902 C++类的匿名对象
  • 面试问题:c++的内存管理方式,delete的使用,vector的resize和reverse,容量拓展
  • uni-app 布局之 Flex
  • 基于STM32与华为云联动的智能电动车充电桩管理系统
  • QSlider 和 QProgressBar 的区别与实践
  • 【Linux基础】Linux系统启动:深入解析Linux系统启动完整流程