有关不平衡学习与SMOTE算法

article/2025/11/11 2:38:07

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 因为最近的任务中运用到了Smote算法,但是我找了网上好多帖子都没有解决问题,因此去阅读了imblearn库的User guide。然后在这边写下所得到的知识以及掌握了的算法,可以供大家学习与参考。还有感觉在网上查到的帖子很多SMOTE算法都只是用于二分类任务的,但是尝试之后发现是可以用于多分类任务的,但是所带的特征要对应。
  • 一、有关上采样和Smote算法?
    • 1、上采样
    • 2、SMOTE算法
  • 二、如果是使用真实的数据集(类似文本分类任务?)
  • 总结
  • 参考


前言

因为最近的任务中运用到了Smote算法,但是我找了网上好多帖子都没有解决问题,因此去阅读了imblearn库的User guide。然后在这边写下所得到的知识以及掌握了的算法,可以供大家学习与参考。还有感觉在网上查到的帖子很多SMOTE算法都只是用于二分类任务的,但是尝试之后发现是可以用于多分类任务的,但是所带的特征要对应。

一、有关上采样和Smote算法?

**

1、上采样

**
按照我的理解来讲就是,因为在我的不平衡数据集中,有一类样本比较少,有一类样本多,就想办法把少类的样本增多就可。最简单的做法就是通过随机抽样和替换当前可用样本来生成新样本。

from sklearn.datasets import make_classification
from collections import Counter
X, y = make_classification(n_samples=5000, n_features=2, n_informative=2,n_redundant=0, n_repeated=0, n_classes=3,n_clusters_per_class=1,weights=[0.01, 0.05, 0.94],class_sep=0.8, random_state=0)
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
print("采样之前的样本个数为:")
print(sorted(Counter(y).items()))
X_resampled, y_resampled = ros.fit_resample(X, y)
print("采样之后的样本个数为:")
print(sorted(Counter(y_resampled).items()))
采样之前的样本个数为:
[(0, 64), (1, 262), (2, 4674)]
采样之后的样本个数为:
[(0, 4674), (1, 4674), (2, 4674)]

这是从官网截取下来的代码,这里可以看到,总共是需要一个X,一个y。这时候我们就会在想X,和y到底是什么。然后我就试着输出了一下。
在这里插入图片描述
X就是一个二维列表,应该是样本的特征,而y就是样本具体的值了,这个生成的数据集中共有三类,包括2、1、0。但是可以看出2是多数类,0比较少。而上采样的做法就是生成了很多0类和1类使之与多数的2类样本个数一样。
在这里插入图片描述
此外,值得一提的是,在imblearn库所提供的RandomOverSampling也支持对于异构数据进行采样(例如,包含一些字符串)

import numpy as np
X_hetero = np.array([['xxx', 1, 1.0], ['yyy', 2, 2.0], ['zzz', 3, 3.0]],dtype=object)
y_hetero = np.array([0, 0, 1])
X_resampled, y_resampled = ros.fit_resample(X_hetero, y_hetero)
print(X_resampled)
print(y_resampled)

输出的结果为:

[['xxx' 1 1.0]['yyy' 2 2.0]['zzz' 3 3.0]['zzz' 3 3.0]]
[0 0 1 1]

这给我们的启示就是,在使用RandomOverSampling的时候其实X是不必进行编码的,可以是异构数据。y与之对应的就是我们数据集中类型id,可以依据类型id所做复制。这给我们带来了很大的方便啊啊啊!!因为我之前所输入的X想了好久还进行了编码处理。

2、SMOTE算法

SMOTE算法是现在非常流行的一种上采样的方法。使用RandomOverSampling方法是复制,而SMOTE 和 ADASYN 通过插值生成新样本。因为现在暂时只是在使用SMOTE算法,所以就先不介绍ADASYN算法惹,之后用到再进行补充。下面用的也是生成的数据,然后生成的是三类,控制了样本比例。值得注意的是,如果是多分类任务,想要得到的目标样本数量要使用字典,要不然就会报错。

from sklearn.datasets import make_classification
from collections import Counter
X, y = make_classification(n_samples=5000, n_features=2, n_informative=2,n_redundant=0, n_repeated=0, n_classes=3,n_clusters_per_class=1,weights=[0.01, 0.05, 0.94],class_sep=0.8, random_state=0)
print("采样之前的样本数为:")
print(Counter(y))
from imblearn.over_sampling import SMOTE
sampling_strategy={0:3000,1:3000,2:4674}
oversampler=SMOTE(sampling_strategy=sampling_strategy,random_state=0,k_neighbors=2,n_jobs=1)X_resampled, y_resampled = oversampler.fit_resample(X, y)
print("采样后的样本数为:")
print(Counter(y_resampled))
采样之前的样本数为:
Counter({2: 4674, 1: 262, 0: 64})
采样后的样本数为:
Counter({2: 4674, 1: 3000, 0: 3000})

其中 sampling_strategy可以选择以下几种,这是我在其他帖子中看到的:

‘majority’:resample only the majority class; 仅仅重新采样多数类
‘not minority’:resample all classes but the minority class; 重采样所有类别除了少数类
‘not majority’:resample all classes but the majority class; 重采样所有类别除了多数类
‘all’:resample all classes; 重采样所有类别
‘auto’:equivalent to ‘not minority’。 等价于not minority

二、如果是使用真实的数据集(类似文本分类任务?)

我尝试了一下,就是如果是特征值是字符串的话,只有RandomOverSampling可以,SMOTE算法要报错。具体的错误如下。所以我浅浅地认为好像是不行的,但是我如果把SMOTE换成ROS就是可以的。所以我们在处理文本数据的时候应该是要做预处理的。

在这里插入图片描述
预处理我用的是from sklearn.preprocessing import LabelEncoder,来进行标签的编码,应该只是很简单的处理。

for col in ["ID"]:le = LabelEncoder()le.fit(df[col])row = le.transform(df[col])df[col] = row + indexindex = max(row) + 1

总结

以上就是今天要讲的内容,本文仅仅简单介绍了RandomOverSampling和SMOTE算法的使用,我也正在探索当中,所以如果哪里有错误,欢迎大家批评指正!!!我们一起交流一起进步!!!之后如果学到更多的,我会继续跟进的!!

参考

https://www.jianshu.com/p/3eac447b7261


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

相关文章

Borderline-SMOTE算法介绍及Python实现【内附源代码】

💖作者简介:大家好,我是车神哥,府学路18号的车神🥇 ⚡About—>车神:从寝室到实验室最快3分钟,最慢3分半(那半分钟其实是等红绿灯) 📝个人主页:…

SMOTE算法原理及Python代码实现

SMOTE算法原理及Python代码实现 文章目录 SMOTE算法原理及Python代码实现预备知识SMOTE算法内容的简单复习SMOTE算法的详细分析创建类对象和初始化构建训练函数构建合成样本函数 SMOTE算法的完整代码示例代码 预备知识 向量代数的知识:对于点 x 1 \mathbf{x}_1 x1​…

smote算法_海量样本无从下手?这五种抽样算法分分钟搞定

全文共 1854字,预计学习时长 4分钟 数据科学是研究算法的学科。本文介绍了一些常见的用于处理数据的抽样技术。 图片来源:unsplash.com/gndclouds 简单随机抽样 假设要从一个群体中选出一个集合,该集合中的每个成员选中的概率相等。 下列代码…

smote算法_探索SMOTE算法

SMOTE是一种综合采样人工合成数据算法,用于解决数据类别不平衡问题(Imbalanced class problem),以Over-sampling少数类和Under-sampling多数类结合的方式来合成数据。本文将以 Nitesh V. Chawla(2002) 的论文为蓝本,阐述SMOTE的核心思想以及实现其朴素算法,在传统分类器(贝…

[12]机器学习_smote算法

1、smote原理介绍 在两个点连线中间取点 2、smote算法实现 import random from sklearn.neighbors import NearestNeighbors import numpy as np import matplotlib.pyplot as pltclass Smote(object):def __init__(self, N50, k5, r2):# 初始化self.N, self.k, self.r, sel…

过采样:SMOTE算法

前言:在比赛中遇到关于样本不均衡问题,特地过来补补知识点! 1、smote原理 过采样的技术有非常多,最常见的就是随机过采样和SMOTE过采样。 随机过采样就是从少的类中进行随机进行采样然后拼接上去,这种效果很多时候和加权差不大。还有一种较…

SMOTE算法

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

SMOTE算法及其python实现

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

SMOTE算法(人工合成数据)

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

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

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

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

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

Hash碰撞(冲突)

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

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

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

hash碰撞解决方法

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

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

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

java基础篇 - HashMap 理解Hash碰撞

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

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

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

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

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

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

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

MD5 hash碰撞实现解密

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