SMOTE 过采样,解决正负样本不均衡问题

一、SMOTE过采样

1.1 问题

在实际业务中,样本不均衡(即正负样本比例严重失衡)是一种常见的问题。这种情况下,传统的机器学习算法可能会倾向于偏向占主导地位的类别,从而导致模型性能下降。

1.2 SMOTE方法

为了解决这个问题,一种常用的方法是过采样,其中SMOTE(SyntheticMinority Over-sampling Technique)是一种被广泛应用的技术。

SMOTE过采样方法的主要作用是通过合成少数类样本来增加其在数据集中的数量,以达到样本平衡。这对于改善模型的训练效果至关重要。通过SMOTE过采样,可以使得模型更好地学习到少数类别的特征,从而提高模型的泛化能力和准确性。此外,SMOTE过采样方法还可以减少模型的过拟合倾向,提高模型的稳健性(Robustness)。

1.3 SMOTE原理

SMOTE过采样方法基于样本的特征空间,通过对少数类样本进行插值来生成合成样本。其主要步骤如下:

  • 对于每一个少数类样本,计算其与所有其他少数类样本之间的距离,并找到其K个最近邻居。
  • 从这K个最近邻居中随机选择一个样本,并计算该样本与当前样本的差异。
  • 根据差异比例,生成一个新的合成样本,该样本位于两个样本之间的连线上。
  • 重复上述步骤,生成指定数量的合成样本。

1.4 与其他采样方法对比

方法原理优点缺点
随机过采样简单复制少数类样本来平衡数据集简单易实施,适用于小型数据集容易导致过拟合问题,复制的样本可能会引入噪声。对于较大的数据集,会导致内存占用过高
自适应综合过采样根据样本密度分布来调整合成样本的数量能够更好地处理样本密度不均衡的情况,适用于非线性问题。计算成本较高,对于高维数据集效果可能不佳。
SMOTE通过插值生成合成样本在处理数据不平衡问题时表现良好,能够有效增加少数类样本。基于合成样本的插值方法能够在特征空间中扩展少数类样本,有助于模型学习到更多的特征信息。对于噪声和离群点敏感;无法处理样本重叠问题;处理多类别不平衡问题的能力有限

二、SMOTE代码实现

2.1 pytorch实现SMOTE

1、安装 imbalanced-learn 库:

pip install -U imbalanced-learn

2、导入必要的库和模块:

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from imblearn.over_sampling import SMOTE

准备原始数据集: 假设你有一个包含特征和标签的PyTorch张量 X 和 y,其中 X 的形状是 (样本数, 特征数),y 的形状是 (样本数, )。
使用 SMOTE 进行过采样:

# 将 PyTorch 张量转换为 NumPy 数组
X_np = X.numpy()
y_np = y.numpy()# 使用 SMOTE 进行过采样
smote = SMOTE(sampling_strategy='auto', random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_np, y_np)# 将 NumPy 数组转换为 PyTorch 张量
X_resampled = torch.from_numpy(X_resampled)
y_resampled = torch.from_numpy(y_resampled)

注意:
sampling_strategy=‘auto’ 表示自动计算过采样的目标类别比例。
random_state 是一个随机种子,用于确保可重复性。
将过采样后的数据转回 PyTorch 张量:

2.2 在XGBoost中使用SMOTE

1、安装 imbalanced-learn 库:

pip install -U imbalanced-learn

2、导入必要的库和模块:

import xgboost as xgb
from imblearn.over_sampling import SMOTE

准备原始数据集: 假设你有一个包含特征和标签的XGBoost的DMatrix对象 dtrain。

3、使用 SMOTE 进行过采样:

# 获取原始数据集的特征矩阵和标签
X, y = dtrain.get_x(), dtrain.get_label()# 使用 SMOTE 进行过采样
smote = SMOTE(sampling_strategy='auto', random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)# 将 NumPy 数组转换为 XGBoost 的 DMatrix 对象
dtrain_resampled = xgb.DMatrix(X_resampled, label=y_resampled)

4、定义并训练XGBoost模型:

# 定义参数
params = {'objective': 'binary:logistic','eval_metric': ['logloss', 'auc'],'eta': 0.05,'max_depth': 9,# 其他参数...
}# 训练模型
model = xgb.train(params, dtrain_resampled, num_boost_round=200, early_stopping_rounds=10)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scss和less预处理器的使用对比

变量(Variables) scss变量标识符是:$ $primary-color: red; div {background: $primary-color; }less变量标识符: primary-color: red; div {background: primary-color; }变量名称规则:scss下划线和横线相互兼容, less中定义的名称和使用…

磁力计LIS2MDL开发(1)----轮询获取磁力计数据

磁力计LIS2MDL开发.1--轮询获取磁力计数据 概述视频教学样品申请源码下载通信模式速率生成STM32CUBEMX串口配置IIC配置CS设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置速率启用偏移消除开启温度补偿设置为连续模式轮询读取数据主程序演示 概述 本文将介绍如何使…

[网络安全]批处理(脚本)编写

Windows DOS命令Linux 一.作用: 自上而下成批次处理每一条命令,直到执行到最后一条 二.如何创建批处理: 扩展名:.bat创建办法:新建一个记事本,把扩展名改为 .bat 三.编辑方法: 右击 -编辑 1).一行一个命令 四.批处理命令: pause 暂停 (及时后面有命令,也不执行)echo …

Knowledge Graph知识图谱—9. Data Quality and Linking

9. Data Quality and Linking 9.1 How well are the linked open data in practice? Linked Open Vocabularies(LOV) project – analyze usage of vocabularies 9.2 Quality Linked Data Conformance vs. Quality Conformance: – i.e., following standards and best prac…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后,提交代码会出现如下截图问题: 临时解决: step1: 把上面红色的那条gitidir复制下来执行下: step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构(EDA) 是一种异步通信风格,组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息,并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…

新手上路:盘点「性能测试」必须掌握的技术点

前段时间,有一些小伙伴提出希望我们推送点性能测试的技术干货。所以,小编今天通过上网查资料,结合项目实操过程中的一些问题,总结了一些关于性能测试的内容,希望是大家想要了解的内容哈。 1、性能测试的目的 首先&am…

Java中JDK类库常用的6种设计模式

Java中JDK类库常用的6种设计模式:1、抽象工厂。2、建造者模式。3、工厂模式。4、原型模式。5、单例模式。6、适配器模式。 1、抽象工厂 javax.xml.parsers.DocumentBuilderFactory抽象类。 public static DocumentBuilderFactory newInstance()方法。 类功能&…

.Net中的集合

所有的集合都是继承自IEnumerable。集合总体可以分为以下几类:关联/非关联型集合,顺序/随机访问集合,顺序/无序集合,泛型/非泛型集合,线程集合。 各集合类底层接口关系图 泛型与非泛型集合类的分析 泛型集合是类型安…

离散数学 速成

文章目录 一、命题逻辑的基本概念1. 命题2. 命题联结词 二、命题逻辑等值演算1. 等值式🌰子 2. 析取范式和合取范式🌰子 3. 主析取范式和主合取范式🌰子 4. 联结词的完备集🌰子 三、命题逻辑的推理理论🌰子 一、命题逻…

复制时源数据中null值不复制到

问题场景 例如有个对象要新增,后面的新增,我们希望判断一下是否有这个数据,如果有,则对上次提交的完善。如果没有,就新增。那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。 我们…

Java - Math类的常用方法及练习

目录 1.1 概述 1.2 常用方法 ❓面试题:为啥Math.round(-1.5)-1? 1.1 概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象…

优雅玩转实验室服务器(三)vscode is all you need

在前两章解决了传输问题和连接问题后,我们紧接着遇到一个新的需求:我们需要coding呀,你当然可以说,我们可以用vim和对应的插件来搭建一个IDE呀,fine,我甚至可以给你推荐如下的教程: Vim 到底可…

oracle详细安装教程(附带百度网盘资源)

一,下载安装包途径 1.官网 Unauthorized Request 2.百度网盘分析 https://pan.baidu.com/s/1n221gdTK0Fcho839oRab9g 提取码1q2w 二,安装教程 1.下载完安装包后点击 setup.exe 如果出现一下的问题,使用windows10等系统安装oracle 11g等版本的数据库…

实验7:索引和视图定义

【实验目的】 1、了解索引和视图的含义 2、熟悉索引和视图的创建规则 3、掌握索引和视图的创建和管理 【实验设备及器材】 1、硬件:PC机; 2、软件:(1)Windows7; (2)Microsoft SQL Server 2012。 【主要内容】 索引的创建、删除、重建…

【acwing】92. 递归实现指数型枚举

穿越隧道 递归枚举、位运算 方法① 从1到n&#xff0c;顺序访问每位数&#xff0c;是否选择&#xff0c;每位数有两种状态&#xff0c;选1或不选0. AC代码如下&#xff1a; #include <iostream> using namespace std;const int N 100; // bool st[N]; int n;void dfs(in…

【Oracle】backup备份时报错ORA-19809,ORA-9804

Oracle备份数据库时报错 ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 10305536 bytes disk space from 4385144832 limit 1.清理过时的备份&#xff1a; 使用RMAN删除不再需要的过时备份&#xff0c;以释放空间。执行以下命令&#xff1a; DEL…

Hadoop高可用(主备切换)---配合Zookeeper

1. Hadoop高可用(Hadoop High Availability)概述 HA(High Available), 高可用&#xff0c;是保证业务连续性的有效解决方案&#xff0c;一般有两个或两个以上的节点&#xff0c;分为活动节点&#xff08;Active&#xff09;及备用节点&#xff08;Standby&#xff09;。通常把…

【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述 Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图&#xff0c;并且主要基于QPainter, QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine…

C++的左值、右值、左值引用和右值引用

目录 左值和右值左值引用右值引用 参考《现代C语言核心特性解析》 以下加粗文字都是摘自本书。 左值和右值 左值和右值得概念在C98就出现了&#xff0c;根据字面意思理解就是&#xff1a;左值是表达式等号左边的值&#xff0c;右值是表达式等号右边的值。 int x 1; int y …