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

SMOTE | 使用SMOTE算法来处理不平衡数据的问题

  • 需求
    在学习机器学习识别信用卡欺诈交易这个项目的时候,样本数据集非常不平衡:
data_df_new['Class'].value_counts()
  • 0: 正常 1:欺诈
    在这里插入图片描述

在这里了解到了SMOTE算法:

  • 过采样(Oversampling)
    过采样是指增加少数类( minority class)的样本数量,使其与多数类( majority class)的样本数量相当或接近。这可以通过以下方式实现:
  1. 随机过采样:随机复制少数类的样本,直到达到期望的数量。
  2. SMOTE(Synthetic Minority Over-sampling Technique):生成合成新的少数类样本,而不是简单地复制现有样本,以减少过拟合的风险。
  3. ADASYN(Adaptive Synthetic Sampling):基于现有少数类样本生成新的合成样本,使用核方法或SMOTE算法。
  • 欠采样(Undersampling)
    欠采样是指减少多数类的样本数量,使其与少数类的样本数量相当或接近。这可以通过以下方式实现:
  1. 随机欠采样:随机选择多数类的样本,直到其数量与少数类相等。
  2. 基于聚类的欠采样:识别并移除多数类中的一些样本,特别是那些在特征空间中紧密聚集的样本,以减少信息损失。
  3. 基于邻近的欠采样:移除那些在特征空间中与少数类样本邻近的多数类样本,以保持类别之间的边界清晰。

在文章探索SMOTE算法中,你可以从0->1使用python跟着作者走一遍如何使用该方法来处理不平衡的数据集。

data_df_new.shape

(284807, 19)

# 构建自变量和因变量
X = data_df_new[x_feature]
y = data_df_new["Class"]

n_sample = y.shape[0]
n_pos_sample = y[y == 1].shape[0]
n_neg_sample = y[y == 0].shape[0]
print('样本个数:{}; 正样本占{:.2%}; 负样本占{:.2%}'.format(n_sample,
                                                   n_pos_sample / n_sample,
                                                   n_neg_sample / n_sample))
print('特征维数:', X.shape[1])

样本个数:284807; 正样本占0.17%; 负样本占99.83%
特征维数: 18

from imblearn.over_sampling import SMOTE # 导入SMOTE算法模块
# 处理不平衡数据
sm = SMOTE(random_state=42)    # 处理过采样的方法
X, y = sm.fit_resample(X, y)
print('通过SMOTE方法平衡正负样本后')
n_sample = y.shape[0]
n_pos_sample = y[y == 1].shape[0]
n_neg_sample = y[y == 0].shape[0]
print('样本个数:{}; 正样本占{:.2%}; 负样本占{:.2%}'.format(n_sample,
                                                   n_pos_sample / n_sample,
                                                   n_neg_sample / n_sample))
print('特征维数:', X.shape[1])

通过SMOTE方法平衡正负样本后
样本个数:568630; 正样本占50.00%; 负样本占50.00%
特征维数: 18

分类场景样本不均衡:本案例中针对正样本不足的数据,采用SMOTE算法进行过采样


http://www.kler.cn/a/417626.html

相关文章:

  • Sentinel的安装和做限流的使用
  • 【机器学习与数据挖掘实战】案例11:基于灰色预测和SVR的企业所得税预测分析
  • 基于ArcGIS的SWAT模型+CENTURY模型模拟流域生态系统水-碳-氮耦合过程研究
  • C++ 入门速通-第5章【黑马】
  • deepseek、qwen等多种模型本地化部署
  • HTML排版标签、语义化标签、块级和行内元素详解
  • 【Linux】【字符设备驱动】深入解析
  • LabVIEW实现UDP通信
  • Android获取状态栏、导航栏的高度
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue文化创意展示与交流平台【提供源码+答辩PPT+文档+项目部署】
  • YOLO系列论文综述(从YOLOv1到YOLOv11)【第14篇:YOLOv11——在速度和准确性方面具有无与伦比的性能】
  • 动捕 动作捕捉学习笔记
  • C++内存对齐
  • 【从零开始的LeetCode-算法】263. 丑数
  • python全栈开发《67.不同数据类型间的转换:列表集合元组的转换》
  • 【Leecode】Leecode刷题之路第66天之加一
  • Maven CMD命令
  • 共享售卖机语音芯片方案选型:WTN6020引领智能化交互新风尚
  • 【Ant Design Pro】1. config 配置
  • 实战ansible-playbook:Ansible Vault加密敏感数据(三)
  • 田忌赛马五局三胜问题matlab代码
  • 大模型训练核心技术RLHF
  • 关于扩散方程的解
  • 命令行应用开发初学者指南:脚手架篇、UI 库和交互工具
  • 【AI】Jetson Nano烧写SD卡镜像:Ubuntu20.04
  • Vue 2.0->3.0学习笔记(Vue 3 (五)- 新的组件)