SMOTE算法深度解析及代码实现

SMOTE算法介绍

 SMOTE算法是较为常用的数据增广算法,其核心思路是在少数类别样本内部进行数据合成,更具体的说,其后隐藏的猜想是假定样本 x 0 , x 1 , . . , x N x_0,x_1,..,x_N x0,x1,..,xN都为同一类别,那么他们的线性组合 x 0 + a 1 ∗ x 1 + . . . + a N ∗ x N x_0+a_1*x_1+...+a_N*x_N x0+a1x1+...+aNxN也应该和它们属于同一类别。 给出SMOTE原论文中的算法伪代码如下:
在这里插入图片描述
其基本思路和刚刚所介绍的一致,但是引入了基于KNN检索的数据合成方案。让我们来一步步拆解。

SMOTE函数

 函数SMOTE(T,N,K)三个参数含义为:
N:int(N/100)生成数据的倍数,为100的倍数。距离而言,如果设置N=200,那么少数类别样本的数目就会增加2倍,变为原来的3倍;
T:少数类别样本的数目
K:用于合成的最近邻样本的数目

 接下来我们分析一下SMOTE的运行逻辑:

  1. 首先会判断要增广的倍数是否大于1(即N是否大于100),基于此计算出增广倍数N=N/100
  2. 遍历每个少数类别样本 x i , i ∈ 1 , . . , T x_i,i\in {1,..,T} xi,i1,..,T,对其进行增广,增广步骤如下:
    1. 计算出 x i x_i xi同类样本(即少数类别样本) 的k个最近邻样本,记录这k个样本在样本集中索引,构成nnarray
    2. 调用Populate()函数进行增广。

Populate函数

 函数Populate(N,i,nnarray)的三个参数的含义为:
N: 增广倍数
i: 要进行增广的样本的索引
nnarray:样本 x i x_i xi的最近邻样本的索引集合

 Popluate函数会按照我们之前提过的SMOTE核心思路–同类样本的线性组合来进行样本的生成。具体而言,总共会执行N次生成过程,每一次生成过程中,我们都会从其最近邻样本中挑选一个,然后对特征进行线性组合作为合成样本。值得注意的是,在合成新样本过程中,不同特征的线性系数都是不同的,特征向量中含numattrs个特征就会包含numattrs个合成系数gap。

小结

 SMOTE函数总结起来就是对每个少数类别样本都寻找其同类最相似的K个样本,然后进行N次样本合成,每次合成过程中都会随机从K个样本中采样一个,然后用采样的近邻样本和当前样本的特征进行线性组合得到新样本,最终得到T*K个增广样本。

代码实现

 实际应用SMOTE算法时,调用imbalanced-learn中的库即可实现,如果想要手动实现的话,可以参见笔者给出的实现方案如下:

def smote(feature,labels,K):'''这份代码实现的是最为简单的smote算法,也就是核心是同类样本特征的线性组合,:param feature: 特征matrix:param labels:  标签向量:param K: SMOTE算法中样本考量的近邻个数:return: new_features-生成的样本特征;new_labels-生成样本的标签'''from sklearn.neighbors import NearestNeighborsfrom collections import Countervalue_cnts=dict(Counter(labels))max_sampels=max(value_cnts.values())new_features=[]new_labels=[]for label,cnt in value_cnts.items():if cnt<=1:continue# 提取当前label对应的featurecur_feats=feature[np.where(labels==label)]if(cur_feats.shape[0]>K):Neighbors = NearestNeighbors(n_neighbors=K)Neighbors.fit(cur_feats)neighbor_index=Neighbors.kneighbors()[1]else:Neighbors = NearestNeighbors(n_neighbors=cur_feats.shape[0]-1)Neighbors.fit(cur_feats)neighbor_index=Neighbors.kneighbors()[1]# 采样max_samples-cnt个样本来进行增广base_sampe_idxs=np.random.choice(np.arange(cur_feats.shape[0]),max_sampels-cnt)for idx in base_sampe_idxs:base_sample=cur_feats[idx]# 随机采样一个邻居random_neighbor_idx=np.random.choice(neighbor_index[idx])neighbor=cur_feats[random_neighbor_idx]coff=np.random.rand(feature.shape[1]) # n_dim个位于0-1间的特征系数dif=base_sample-neighbornew_features.append((base_sample+coff*dif).reshape(1,-1))new_labels.append(label)new_features=np.vstack(new_features)new_labels=np.array(new_labels)return new_features,new_labels

需要注意的是,笔者实现的方案和原始SMOTE算法并不完全一致。具体而言,这份实现中舍弃了对增广倍数的控制,改为了强制要求所有类别样本数目相同,逐类别的进行样本合成,每次合成过程中都随机选取一个当前类的样本,然后再基于SMOTE的思路在类别内采样、线性合成。

参考

探索SMOTE算法

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

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

相关文章

网络安全属性详解

网络安全属性是网络安全领域进行安全态势评估的信息要素之一。以下是关于网络安全属性的详细介绍&#xff1a; 一、定义与重要性网络安全属性是指网络安全所具备的关键特性&#xff0c;这些特性共同构成了网络安全的基础。在网络安全态势评估中&#xff0c;利用网络安全属性的历…

Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;GitHub - ZeroNing/solomon-parent: 这个项目主要是…

基于Redis缓存机制实现高并发接口调试

创建接口 这里使用的是阿里云提供的接口服务直接做的测试&#xff0c;接口地址 curl http://localhost:8080/initData?tokenAppWithRedis 这里主要通过参数cacheFirstfalse和true来区分是否走缓存&#xff0c;正常的业务机制可能是通过后台代码逻辑自行控制的&#xff0c;这…

论软件可靠性设计及其应用

摘要 2023 年 3 月&#xff0c;我所在的公司承接了某智慧加油站平台的建设工作。该项目旨在帮助加油站提升运营效率、降低运营成本和提高销售额。我在该项目中担任系统架构设计师&#xff0c;负责整个项目的架构设计工作。 本文结合我在该项目中的实践&#xff0c;详细论述了…

鸿蒙系统:智能生态的新纪元与开发者的新机遇

正文&#xff1a; 在数字化时代&#xff0c;操作系统作为智能设备的灵魂&#xff0c;其重要性不言而喻。随着技术的不断进步&#xff0c;我们见证了安卓和iOS在全球范围内的广泛应用和影响力。如今&#xff0c;鸿蒙系统&#xff08;HarmonyOS&#xff09;以其创新的分布式架构…

Netty入门二

文章目录 EventLoopChannelFuture 与 PromiseHandler与PipelineByteBuf Netty的核心组件包括以下几种&#xff1a; EventLoop&#xff1a;负责处理注册到其上的channel的所有I/O事件。Channel&#xff1a;表示数据传输的网络通道。Future 与 Promise&#xff1a;Future用于等待…

一文读懂剪枝(Pruner):大模型也需要“减减肥”?

当你听到「剪枝」二字&#xff0c;或许会联想到园丁修整枝叶的情景。而在 AI 大模型领域&#xff0c;这个词有着特殊的含义 —— 它是一种通过“精简”来提升大模型效率的关键技术。随着 GPT、LLaMA 等大模型规模的持续膨胀&#xff0c;如何在保持性能的同时降低资源消耗&#…

简单的人脸识别签到程序 python笔记

简单的人脸识别签到程序 这是我自己根据之前的文章《简单的签到程序》修改出来签到程序&#xff0c;还在学习之中&#xff0c;代码还有很多可以优化的地方。 UI代码 有不少地方可以优化一下&#xff0c;但是不想改了。 import PySimpleGUI as sg from MYSQL1 import * impo…

单词反转和数组去重,附经典面试题一份

博彦科技笔试&#xff1a; 给定字符&#xff0c;拼接成单词进行反转单词&#xff1b; package org.example;public class Main {public static void main(String[] args) {char[] input {h, e, l, l, o, , w, o, r, l, d, , J, a, v, a};String inputToString new String(…

【51单片机】UART串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

构建智能防线 灵途科技光电感知助力轨交全向安全防护

10月27日&#xff0c;在南京南站至紫金山东站间的高铁联络线上&#xff0c;一头野猪侵入轨道&#xff0c;与D5515次列车相撞&#xff0c;导致设备故障停车。 事故不仅造成南京南站部分列车晚点&#xff0c;还在故障排查过程中导致随车机械师因被邻线限速通过的列车碰撞而不幸身…

不使用递归的决策树生成算法

不使用递归的决策树生成算法 利用队列 queue &#xff0c;实现层次遍历&#xff08;广度优先遍历&#xff09;&#xff0c;逐步处理每个节点来建立子树结构。再构建一个辅助队列&#xff0c;将每个节点存储到 nodes_to_process 列表中&#xff0c;以便在树生成完成后可以反向遍…

【PB】 使用for循环,循环次数比较多时,datastore 获取数据异常的问题。

以往在使用datastore时&#xff0c;不注意及时销毁&#xff0c;毕竟一次处理数据&#xff0c;数量很少。 本次碰到一个问题&#xff0c;批量处理数据&#xff0c;for循环次数在1000次左右&#xff0c;每个for循环处理 3 个函数&#xff0c;每个函数中有3-4个datastore&#xff…

自动驾驶系列—自动驾驶如何实现厘米级定位?深入解读GPS/RTK技术与应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

DevOps业务价值流:需求设计最佳实践

DevOps实践正推动着产品快速迭代与高质量交付&#xff0c;但需求设计作为产品开发的关键起点&#xff0c;往往被忽视。它不仅是收集与分析需求的过程&#xff0c;更是将需求转化为可实施产品特性的核心。本文深入探讨DevOps业务价值流中的需求设计&#xff0c;从调研、整理、原…

【MySQL】数据库整合攻略 :表操作技巧与详解

前言&#xff1a;本节内容讲述表的操作&#xff0c; 对表结构的操作。 是对表结构中的字段的增删查改以及表本身的创建以及删除。 ps&#xff1a;本节内容本节内容适合安装了MySQL的友友们进行观看&#xff0c; 实操更有利于记住哦。 目录 创建表 查看表结构 修改表结构 …

python可视化进阶

引用&#xff1a; 首先需要安装 plotnine from plotnine import* import joypy数据可视化进阶操作 3.1 类别数据可视化 【例3-1】——绘制简单条形图 【代码框3-1】——绘制简单条形图 # 图3-1的绘制代码 import pandas as pd import matplotlib.pyplot as plt from cvxpy …

使用 GitHub Actions 部署到开发服务器的详细指南

使用 GitHub Actions 部署到开发服务器的详细指南 在本篇博客中&#xff0c;我们将介绍如何使用 GitHub Actions 实现自动化部署&#xff0c;将代码从 GitHub 仓库的 dev 分支自动部署到开发服务器。通过这种方式&#xff0c;可以确保每次在 dev 分支推送代码时&#xff0c;服…

反汇编命令学习以及分析越界和空指针问题

1,反汇编命令行 (1)move 语法格式:mov destination, source例如: mov eax,0x1 ;将立即数1复制到eax寄存器。立即数到寄存器mov [ebx],eax ;将eax寄存器的值复制到ebx寄存器指向的内存地址,寄存器到内存mov eax,ebx ;将ebx寄存器的值复制到eax,寄存器到寄存器mov ea…

冒泡选择法(c基础)

适合对象c语言初学者。 冒泡选择法 作用对一个数组进行排序。&#xff08;介绍一下数组(c基础)(详细版)-CSDN博客&#xff09; 核心要点 1: 数组元素个数 sz 2: 比较后的交换。 核心思路 进行&#xff08;sz - 1&#xff09;趟&#xff0c;每一趟把最大数的放到末尾。其…