【机器学习】--过采样原理及代码详解

过采样(Oversampling)是一个在多个领域都有应用的技术,其具体含义和应用方法会根据领域的不同而有所差异。以下是对过采样技术的详细解析,主要从机器学习和信号处理两个领域进行阐述。

一、机器学习中的过采样

在机器学习中,过采样是一种处理样本不平衡问题的方法。具体来说,它通过增加少数类别的样本数量,以平衡训练数据集中各个类别之间的比例,从而提高机器学习模型对少数类别的分类性能。

过采样的优点在于能够提高模型对少数类别的分类性能,降低误分类率。然而,过度依赖过采样可能导致模型对训练数据过拟合,从而在未知数据上表现不佳。因此,在实施过采样时需要注意适度和合理性,避免过度泛化。

二、过采样SMOTE算法

SMOTE算法的基本思想是对少数类样本进行分析并根据这些样本人工合成新样本添加到数据集中,从而使得原始数据中的类别分布更加均衡。该算法通过K近邻(KNN)技术来模拟生成新的少数类样本,从而避免了随机过采样中简单复制样本可能导致的过拟合问题。

1.SMOTE算法步骤

计算K近邻:对于少数类中的每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,并进行排序,从而得到其K个最近邻(KNN)。

随机选择近邻并生成新样本:1)根据样本不平衡比例设置一个采样比例(如采样倍率N),对于每一个少数类样本x,从其K个近邻中随机选择N个样本(实际操作中,N可能小于或等于K)。

2)对于每一个随机选出的近邻xn,根据原样本x和近邻xn的特征值,通过线性插值的方式生成新的样本。具体来说,可以在x和xn的特征值之间插入一个随机因子(范围在0到1之间),然后将这个因子乘以两者之间的差值,并加到原样本x的特征值上,从而得到新的样本。

合并数据集:将所有生成的新样本与原数据集合并,形成新的训练集。

原始数据:

SMOTE过采样后:

代码示例:

python 复制代码
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
import numpy as np

# 创建一个不平衡的数据集作为示例  
X, y = make_classification(n_classes=2, class_sep=2,
                           weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
                           n_features=4, n_clusters_per_class=1, n_samples=1000, random_state=10)

print('原始数据集形状 %s' % Counter(y))

# 应用SMOTE算法  
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)

print('重采样后的数据集形状 %s' % Counter(y_res))

# 可选:使用matplotlib来可视化结果(这里仅展示数据形状的变化,可视化原始数据和高维数据通常更复杂)  
import matplotlib.pyplot as plt

# 由于数据是高维的,我们无法直接绘制,但我们可以绘制重采样前后类别的数量  
labels = ['original data', 'smote data']
counts = [Counter(y)[0], Counter(y_res)[0]]  # 假设我们关注的是少数类  

plt.bar(labels, counts, color=['blue', 'orange'])
plt.xlabel('datasets')
plt.ylabel('data')
plt.title('SMOTE')
plt.show()

总结

SMOTE(Synthetic Minority Over-sampling Technique)是一种针对不平衡数据集的有效过采样方法。它通过在少数类样本之间插值来生成新的合成样本,从而增加少数类样本的数量,使得数据集在类别分布上更加平衡。这种方法有助于改善分类算法在处理不平衡数据集时的性能,减少模型对多数类的偏见。

总的来说,SMOTE是一种实用且强大的技术,能够有效解决数据不平衡问题,提升分类模型的准确性和鲁棒性。

相关推荐
星爷AG I6 小时前
14-12 动作序列学习(AGI基础理论)
人工智能·学习·agi
无限大66 小时前
数字生存01:AI越强大,越要守住这3种"做人的底气"
人工智能
无限大66 小时前
职场逻辑01:别再瞎努力!AI时代,职场核心竞争力排序
人工智能
带娃的IT创业者6 小时前
WeClaw 离线消息队列实战:异步任务队列如何保证在服务器宕机时不丢失任何一条 AI 回复?
运维·服务器·人工智能·python·websocket·fastapi·实时通信
最新快讯6 小时前
AI前沿技术日更简报 - 2026-03-17
人工智能
wal13145207 小时前
OpenClaw教程(九)—— 彻底告别!OpenClaw 卸载不残留指南
前端·网络·人工智能·chrome·安全·openclaw
老鱼说AI7 小时前
CUDA架构与高性能程序设计:异构数据并行计算
开发语言·c++·人工智能·算法·架构·cuda
牛奶7 小时前
分享一个开源项目,让 AI 辅助开发真正高效起来
前端·人工智能·全栈
GIS数据转换器7 小时前
延凡城市生命线系统
大数据·人工智能·信息可视化·数据挖掘·无人机
Baihai_IDP7 小时前
OpenClaw 架构详解 · 第一部分:控制平面、会话管理与事件循环
人工智能·面试·llm