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

过采样(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是一种实用且强大的技术,能够有效解决数据不平衡问题,提升分类模型的准确性和鲁棒性。

相关推荐
程序员cxuan1 天前
为每个任务配一套 harness:Claude Code 里的动态工作流
人工智能
程序员cxuan1 天前
Claude Fable 5 来了
人工智能·后端·程序员
云边云科技_云网融合1 天前
云边云科技亮相 2026 WOD 制造业数智化博览会 云网融合赋能制造焕新
人工智能·科技·安全·制造
biter down1 天前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
Σίσυφος19001 天前
激光三角 光平面标定-多高度误差分析
人工智能·计算机视觉·平面
JS菌1 天前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
lqqjuly1 天前
前沿算法深度解析(二)
人工智能·算法·机器学习
Bode_20021 天前
基于大数据分析的全生命周期质量追溯质量评估体系落地方案
大数据·人工智能
分布式存储与RustFS1 天前
RustFS S3 Table 开源后,我重新梳理了一下 Iceberg 数据湖的选型思路
人工智能·开源·minio·dpu·rustfs·ai存储·s3 table
DevOpenClub1 天前
用 Agent 搭建网页内容采集与结构化处理流水线
人工智能