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

article/2025/11/11 2:38:10

💖作者简介:大家好,我是车神哥,府学路18号的车神🥇
⚡About—>车神:从寝室实验室快3分钟,最慢3分半(那半分钟其实是等绿
📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客
🥇 官方认证:人工智能领域新星创作者
🎉点赞评论收藏 == 养成习惯一键三连)😋

⚡希望大家多多支持🤗~一起加油 😁

  • 专栏

  • 《Golang · 过关斩将》

  • 《Neural Network》

  • 《微信小程序开发》

  • 《LeetCode天梯》

  • 《Algorithm》

  • 《Python》

  • 《web》


Borderline-SMOTE算法

  • 🎉Borderline-SMOTE算法介绍
  • 🤗源代码

最近写毕业课题论文,用到了Borderline-SMOTE算法,做故障诊断,其实实际工况中包含了很多的数据,而且监测周期极其不均匀,有的检测时间是按照月来采样,有的则是按照年,还有日度,实时等等。在很多地方是不平衡的数据,由此我们需要产生更多相似的数据。一般的虚拟样本生成技术有很多:蒙特卡洛法、整体趋势扩散技术、SMOTE、DNN、Bootstrap等等很多很多。由于最近用Borderline-SMOTE比较多,下面介绍一下!~

文末Python源代码自取!!!

🎉Borderline-SMOTE算法介绍

Borderline SMOTE是在SMOTE基础上改进的过采样算法,该算法仅使用边界上的少数类样本来合成新样本,从而改善样本的类别分布。

Smote 算法仍属于是建立在相距较近的少类样本之间样本的假设基础之上,还没有充分考虑邻近样本 的分布特点,会造成类间发生重复性的可能性较大,而 采用识别少类种子样本的 Borderline-Somte 算法可以 避免这种重复性的发生。基于边界上样本的合成样本原理如下图所示。

Borderline SMOTE采样过程是将少数类样本分为3类,分别为Safe、Danger和Noise。最后,仅对表为Danger的少数类样本过采样。

Borderline-SMOTE又可分为Borderline-SMOTE1和Borderline-SMOTE2,Borderline-SMOTE1在对Danger点生成新样本时,在K近邻随机选择少数类样本(与SMOTE相同),Borderline-SMOTE2则是在k近邻中的任意一个样本(不关注样本类别)

在这里插入图片描述
假设 S S S为样本集, S m i n S_{min} Smin 为少类样本集, S m a x j S_{maxj} Smaxj的多数样本集,m 为邻近样本个数, x i x_i xi 属性, x i j x_{ij} xij为邻近样本全部属性, x n x_n xn 为近邻样本, R i j R_{ij} Rij 取值0.5或1,合成算法步骤如下。

  • Step1:假设每一个 x i ∈ S m i n x_i \in S_{min} xiSmin,确定与其最邻近的样本集,其数据集为 S N N S_{NN} SNN,且 S N N ∈ S S_{NN} \in S SNNS.
  • Step:对每一个样本 x i x_i xi,判断最近邻属于多数样本集的个数,即 ∣ S N N ∩ S m a x j ∣ < m | S_{NN} \cap S_{maxj}| < m SNNSmaxj<m;合成少数类的样本。即 x i x_i xi与近邻得出 x n x_n xn对应属性 j j j中的差值记为 d i j = x i − x i j d_{ij}=x_{i}-x_{ij} dij=xixij。得出合成新的少数类样本 h i j = x i + d i j × r a n d ( 0 , R i j ) h_{ij}=x_i+d_{ij} \times rand(0, R_{ij}) hij=xi+dij×rand(0,Rij)

与 SMOTE 方法相比,Borderline-SMOTE 方法只针对边界样本进行近邻线性插值,使得合成后的少数 类样本分布更为合理.

哇,好久没有在Markdown手敲公式了,都有点手生了,哈哈哈。

🤗源代码

Python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/28 10:49
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : Borderline-SMOTE_imblearn.pyfrom collections import Counterimport numpy as np
import pandas as pd
from icecream import ic
from sklearn.datasets import make_classification
from imblearn.over_sampling import BorderlineSMOTE
import random
from sklearn.neighbors import NearestNeighbors# 读取数据
def loaddata(filename):df = pd.read_excel(io=filename)# ic(df)return np.array(df)# 均匀的100个数据
def gene_data(Lb, Ub):# 生成LB# 循环取值获得Lb和Ub的值m = Lb.shape[0]gene_box = []for i in range(m):gene_sample = np.linspace(Lb[i], Ub[i], 100)# ic(gene_sample)gene_box.append(gene_sample)return gene_boxclass Smote:def __init__(self,samples,N=10,k=5):self.n_samples,self.n_attrs=samples.shapeself.N=Nself.k=kself.samples=samplesself.newindex=0# self.synthetic=np.zeros((self.n_samples*N,self.n_attrs))def over_sampling(self):N=int(self.N/100)self.synthetic = np.zeros((self.n_samples * N, self.n_attrs))neighbors=NearestNeighbors(n_neighbors=self.k).fit(self.samples)print('neighbors',neighbors)for i in range(len(self.samples)):nnarray=neighbors.kneighbors(self.samples[i].reshape(1,-1),return_distance=False)[0]#print nnarrayself._populate(N,i,nnarray)return self.synthetic# for each minority class samples,choose N of the k nearest neighbors and generate N synthetic samples.def _populate(self,N,i,nnarray):for j in range(N):nn=random.randint(0,self.k-1)dif=self.samples[nnarray[nn]]-self.samples[i]gap=random.random()self.synthetic[self.newindex]=self.samples[i]+gap*difself.newindex+=1if __name__ == '__main__':# 读取数据datafile = "LbUbCL边界.xlsx"df = loaddata(datafile)df_LB = df[:, 2]df_UB = df[:, 3]# ic(df_LB, df_UB)# ic(df_LB.shape, df_UB.shape)# 在LB和UB区间内生成均匀的100个数据,然后再用borderline-SMOTE进行虚拟样本生成Initial_dt = np.array(gene_data(df_LB, df_UB))X = Initial_dt.Tic((Initial_dt.T).shape)     # success# 相应的标签yy = np.array([1]*100)# y = np.ones((16, 100))# ic(y)# print('Original dataset shape %s' % Counter(y))# 对生成的100个样本使用borderline-SMOTE生成虚拟样本# sm = BorderlineSMOTE(random_state=42, kind="borderline-1")# X_res, y_res = sm.fit_resample(X, y)# print('Resampled dataset shape %s' % Counter(y_res))# ic(X_res, y_res)ss = Smote(X, N=100)res = ss.over_sampling()pd.DataFrame(res).to_excel("Borderline-SMOTE_result.xlsx")print(res)"""-----------------------------------------------------------"""# print('Original dataset shape %s' % Counter(y))# sm = BorderlineSMOTE(random_state=42, kind="borderline-1")# X_res, y_res = sm.fit_resample(X, y)# print('Resampled dataset shape %s' % Counter(y_res))# icecream.ic(X_res, y_res.shape)# X1, y1 = make_classification(n_classes=2, class_sep=2,#                                                        weights=[0.1, 0.9], n_informative=2, n_redundant=0, flip_y=0,#                                                        n_features=2, n_clusters_per_class=1, n_samples=100, random_state=9)# ic(X1, y1)

注意,由于我们的数据集是我的论文数据集,所以不能分析给大家啦!~

下面还有一个画图的代码也一起附上吧,仅供参考:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/28 21:35
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : plot.pyimport matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pylab import mpl, text
from matplotlib.font_manager import FontPropertiesroman = FontProperties(fname=r'C:\Windows\Fonts\Times New Roman.ttf', size=10) # Times new roman
mpl.rcParams['font.sans-serif'] = ['SimSun']
fontcn = {'family': 'SimSun','size': 10} # 1pt = 4/3px
fonten = {'family':'Times New Roman','size': 10}df = pd.read_excel("SMAPE_final.xlsx", sheet_name="Sheet2")
df2 = pd.read_excel("SMAPE_final.xlsx", sheet_name="Sheet4")
print(df)t1 = list(df2.iloc[0, 1:])
t2 = list(df2.iloc[1, 1:])
t3 = list(df2.iloc[2, 1:])
# X2 = ["MTD(%)", "MT-MTD(%)", "MD-MTDB(%)"]
X2 = ['10', '15', '20', '25', '&']plt.plot(X2, t1, linestyle="-.", marker="o", linewidth=2, label="MTD", markersize='8')
plt.plot(X2, t2, "-D", linewidth=2, label="MT-MTD", markersize='8')
plt.plot(X2, t3, "--v",linewidth=2, label="MD-MTDB", markersize='8')
plt.xlabel("Size of Sample", fontsize=15)
plt.ylabel("AveSMAPE(%)", fontsize=15)
plt.rcParams.update({'font.size':14})
plt.legend()
plt.show()y1 = list(df.iloc[0, 1:])
y2 = list(df.iloc[1, 1:])
y3 = list(df.iloc[2, 1:])
X = ['10', '15', '20', '25', '30']plt.plot(X, y1, '--o', linewidth=2, label='SMAPE no vitual samples', markersize='8')
plt.plot(X, y2, '-^', linewidth=2, label='SMAPE include vitual samples', markersize='8')
plt.xlabel("Size of Sample", fontsize=15)
plt.ylabel("AveSMAPE(%)", fontsize=15)
plt.rcParams.update({'font.size':14})
plt.legend()
plt.show()# plt.subplot(211)plt.bar(X, y3, width=0.8)
plt.xlabel("Size of Sample",  fontsize=15)
plt.ylabel("AvePCR(%)", fontsize=15)
plt.show()

在这里插入图片描述
加油吧!~准备卷毕业课题第三章了,o(╥﹏╥)o




❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!打天梯!!!
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )


万事开头难,然后中间难,最后结尾难。


http://chatgpt.dhexx.cn/article/2CcZ58dW.shtml

相关文章

SMOTE算法原理及Python代码实现

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

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

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

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算法

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

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…