过采样:SMOTE算法

article/2025/11/11 4:35:36

前言:在比赛中遇到关于样本不均衡问题,特地过来补补知识点!

1、smote原理

过采样的技术有非常多,最常见的就是随机过采样和SMOTE过采样。
随机过采样就是从少的类中进行随机进行采样然后拼接上去,这种效果很多时候和加权差不大。还有一种较常见的也是现在比赛中出现最多的采样方法,SMOTE采样。
SMOTE的示意图如下,

SMOTE算法的生成过程为:

  1. 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。
  2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。
  3. 对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本
    在这里插入图片描述

2、smote缺点

从算法中,我们可以发现,SMOTE采样其实就是生成样本之间的一些样本

但是因为思路简单,我们也很容易就可以发现SMOTE算法的一些缺点。

  1. 在近邻选择时,K值的决定一般较难,可以枚举然后根据实验效果来定;
  2. 算法无法克服非平衡数据集的数据分布问题,容易产生分布边缘化问题。如果正样本都分布在边缘,我们通过采样正样本来生成样本,那么这样新生成的样本将也会全部在边缘,且会越来越边缘化,从而模糊了正类样本和负类样本的边界,而且使边界变得越来越模糊。这种边界模糊性,虽然使数据集的平衡性得到了改善,但有时也会加大了分类算法进行分类的难度.

3、Python实现smote

import random
from sklearn.neighbors import NearestNeighbors
import numpy as npclass Smote:"""SMOTE过采样算法.Parameters:-----------k: int选取的近邻数目.sampling_rate: int采样倍数, attention sampling_rate < k.newindex: int生成的新样本(合成样本)的索引号."""def __init__(self, sampling_rate=5, k=5):self.sampling_rate = sampling_rateself.k = kself.newindex = 0def fit(self, X, y=None):if y is not None:negative_X = X[y==0]X = X[y==1]n_samples, n_features = X.shape# 初始化一个矩阵, 用来存储合成样本self.synthetic = np.zeros((n_samples * self.sampling_rate, n_features))# 找出正样本集(数据集X)中的每一个样本在数据集X中的k个近邻knn = NearestNeighbors(n_neighbors=self.k).fit(X)for i in range(len(X)):k_neighbors = knn.kneighbors(X[i].reshape(1,-1), return_distance=False)[0]# 对正样本集(minority class samples)中每个样本, 分别根据其k个近邻生成# sampling_rate个新的样本self.synthetic_samples(X, i, k_neighbors)if y is not None:return ( np.concatenate((self.synthetic, X, negative_X), axis=0), np.concatenate(([1]*(len(self.synthetic)+len(X)), y[y==0]), axis=0) )return np.concatenate((self.synthetic, X), axis=0)# 对正样本集(minority class samples)中每个样本, 分别根据其k个近邻生成sampling_rate个新的样本def synthetic_samples(self, X, i, k_neighbors):for j in range(self.sampling_rate):# 从k个近邻里面随机选择一个近邻neighbor = np.random.choice(k_neighbors)# 计算样本X[i]与刚刚选择的近邻的差diff = X[neighbor] - X[i]# 生成新的数据self.synthetic[self.newindex] = X[i] + random.random() * diffself.newindex += 1X=np.array([[1,2,3],[3,4,6],[2,2,1],[3,5,2],[5,3,4],[3,2,4]])
y = np.array([1, 1, 1, 0, 0, 0])
smote=Smote(sampling_rate=1, k=5)
print(smote.fit(X))

4 调包使用及调参

主要可参考——》官网链接

这里罗列下几个重要的参数:
k_neighbors:int或object,默认= 5

对于smote的调参主要是调k_neighbors参数,在一定程度上会影响模型的精度


http://chatgpt.dhexx.cn/article/sN0LkTe2.shtml

相关文章

SMOTE算法

SMOTE算法的思想是合成新的少数类样本&#xff0c;合成的策略是对每个少数类样本a&#xff0c;从它的最近邻中随机选一个样本b&#xff0c;然后在a、b之间的连线上随机选一点作为新合成的少数类样本。 如图所示&#xff1a; 算法流程&#xff1a; 1、对于少数类中每一个样本a&…

SMOTE算法及其python实现

SMOTE&#xff08;Synthetic Minority Oversampling Technique&#xff09;&#xff0c;合成少数类过采样技术&#xff0e;它是基于随机过采样算法的一种改进方案&#xff0c;由于随机过采样采取简单复制样本的策略来增加少数类样本&#xff0c;这样容易产生模型过拟合的问题&a…

SMOTE算法(人工合成数据)

SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术&#xff0c;它是基于随机过采样算法的一种改进方案&#xff0c;由于随机过采样采取简单复制样本的策略来增加少数类样本&#xff0c;这样容易产生模型过拟合的问题&#xff0c;即使得模型学习到的…

SMOTE算法原理 易用手搓小白版 数据集扩充 python

前言 为啥要写这个呢&#xff0c;在做课题的时候想着扩充一下数据集&#xff0c;尝试过这个过采样降采样&#xff0c;交叉采样&#xff0c;我还研究了一周的对抗生成网络&#xff0c;对抗生成网络暂时还解决不了我要生成的信号模式崩塌的问题&#xff0c;然后就看着尝试一下别…

机器学习_SMOTE:简单原理图示_算法实现及R和Python调包简单实现

一、SMOTE原理 SMOTE的全称是Synthetic Minority Over-Sampling Technique 即“人工少数类过采样法”&#xff0c;非直接对少数类进行重采样&#xff0c;而是设计算法来人工合成一些新的少数样本。 SMOTE步骤__1.选一个正样本 红色圈覆盖 SMOTE步骤__2.找到该正样本的K个近…

Hash碰撞(冲突)

2019独角兽企业重金招聘Python工程师标准>>> 什么是哈希&#xff08;哈希算法&#xff09; 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值&#xff0c;这个小的二进制值称为哈希值。 哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明…

Hash 碰撞是什么?如何解决(开放寻址法和拉链法)?hash链表和红黑树知识扩展?

一、什么是Hash碰撞 hash碰撞指的是&#xff0c;两个不同的值&#xff08;比如张三、李四的学号&#xff09;经过hash计算后&#xff0c;得到的hash值相同&#xff0c;后来的李四要放到原来的张三的位置&#xff0c;但是数组的位置已经被张三占了&#xff0c;导致冲突 二、Ha…

hash碰撞解决方法

Hash碰撞冲突 我们知道&#xff0c;对象Hash的前提是实现equals()和hashCode()两个方法&#xff0c;那么HashCode()的作用就是保证对象返回唯一hash值&#xff0c;但当两个对象计算值一样时&#xff0c;这就发生了碰撞冲突。如下将介绍如何处理冲突&#xff0c;当然其前提是一…

Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞

文章目录 前言哈希表原理实现示例HashMap实现原理全篇注释分析实现注意事项默认属性分析属性分析构造方法分析重要的put方法总结 前言 哈希表&#xff08;hashMap&#xff09;又叫散列表 是一种非常重要的数据结构基于map接口实现应用场景及其丰富&#xff0c;本地临时缓存&a…

java基础篇 - HashMap 理解Hash碰撞

HashMap是大家都在用&#xff0c;面试的时候也经常会被考的考点&#xff0c;在这篇文章中说下HashMap的hash碰撞和减轻碰撞的优化。 1、什么是hash碰撞 在解释Hash碰撞之前先说一下hashmap的存储结构、添加和检索是怎么实现的 1.1HashMap的存储结构 HashMap的存储结构是En…

大白话解释hash碰撞是什么以及如何解决

一、Hash如何存数据 hash表的本质其实就是数组&#xff0c;hash表中通常存放的是键值对Entry。 这里的id是个key&#xff0c;哈希表就是根据key值来通过哈希函数计算得到一个值&#xff0c;这个值就是下标值&#xff0c;用来确定这个Entry要存放在哈希表中哪个位置。 二、Ha…

hash碰撞的概率推导(生日攻击生日问题)

1.关于hash碰撞 哈希碰撞是指&#xff0c;两个不同的输入得到了相同的输出&#xff1b; hash碰撞不可避免&#xff0c;hash算法是把一个无限输入的集合映射到一个有限的集合里&#xff0c;必然会发生碰撞&#xff1b; 2.碰撞概率的问题描述的其他形式 n个球&#xff0c;&…

Hash碰撞(冲突)的解决方案

hash算法就是&#xff0c;用同一个哈希函数计算&#xff1a; 两个相同的值&#xff0c;计算出的hash值一定相同&#xff0c; 两个不同的值&#xff0c;计算出的hash值可能不同&#xff0c;也可能相同&#xff0c;当相同时就是hash冲突 一、链式寻址法 也叫“拉链法”&#…

MD5 hash碰撞实现解密

目录 1.前言 2.MD5 hash单个碰撞解密 3.MD5 hash批量碰撞解密 1.前言 在日常渗透中,获取到后台密码往往是加密的,常见的就是MD5加密,常见的做法我们会使用在线网站去解密,常用的有cmd5,somd5,cmd5对于一些密文是要收费的,有时我们就想白嫖。 这时我们会用so…

哈希碰撞+mysql_HashMap之Hash碰撞冲突解决方案及未来改进

HashMap位置决定与存储 通过前面的源码分析可知&#xff0c;HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行put(String,Obect)方法 时&#xff0c;系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法&am…

Hash碰撞概率

计算Hash冲突的概率 虽然已经很多可以选择的Hash函数,但创建一个好的Hash函数仍然是一个活跃的研究领域。一些Hash函数是快的,一些是慢的,一些Hash值均匀地分布在值域上,一些不是。对于我们的目的,让我们假设这个Hash函数是非常好的。它的Hash值均匀地分布在值域上。 在这…

HashMap之Hash碰撞

详细理解了Hash碰撞及处理方法 为什么会出现hash碰撞 在hash算法下,假设两个输入串的值不同,但是得到的hash值相同, 即会产生hash碰撞 一个很简单的例子: 假设你自己设计了一个计算hash的算法toHashValue(String). 是取的输入值的Unicode编码值(当然实际的情况会比这复杂很…

hashmap存储方式 hash碰撞及其解决方式

1.Map 的存储特点 在 Map 这个结构中&#xff0c;数据是以键值对&#xff08;key-value&#xff09;的形式进行存储的&#xff0c;每一个存储进 map 的数据都是一一对应的。 创建一个 Map 结构可以使用 new HashMap() 以及 new TreeMap() 两种方式&#xff0c;两者之间的区别…

Java Hash 碰撞

散列函数&#xff08;英语&#xff1a;Hash function&#xff09;又称散列算法、哈希函数&#xff0c;是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要&#xff0c;使得数据量变小&#xff0c;将数据的格式固定下来。 该函数将数据打乱混合…

通俗解释hash碰撞是什么以及如何解决

Hash如何存数据 hash表的本质其实就是数组&#xff0c;hash表中通常存放的是键值对Entry。 如下图: 这里的学号是个key&#xff0c;哈希表就是根据key值来通过哈希函数计算得到一个值&#xff0c;这个值就是下标值&#xff0c;用来确定这个Entry要存放在哈希表中哪个位置。 H…