首页 > 编程语言 >[12]机器学习_smote算法

[12]机器学习_smote算法

时间:2023-01-04 18:35:04浏览次数:78  
标签:synthetic 12 smote self 样本 算法 samples 100


1、smote原理介绍

在两个点连线中间取点

2、smote算法实现

import random
from sklearn.neighbors import NearestNeighbors
import numpy as np
import matplotlib.pyplot as plt

class Smote(object):
def __init__(self, N=50, k=5, r=2):
# 初始化self.N, self.k, self.r, self.newindex
self.N = N
self.k = k
# self.r是距离决定因子
self.r = r
# self.newindex用于记录SMOTE算法已合成的样本个数
self.newindex = 0

# 构建训练函数
def fit(self, samples):
# 初始化self.samples, self.T, self.numattrs
self.samples = samples
# self.T是少数类样本个数,self.numattrs是少数类样本的特征个数
self.T, self.numattrs = self.samples.shape

# 查看N%是否小于100%
if (self.N < 100):
# 如果是,随机抽取N*T/100个样本,作为新的少数类样本
np.random.shuffle(self.samples)
self.T = int(self.N * self.T / 100)
self.samples = self.samples[0:self.T, :]
# N%变成100%
self.N = 100

# 查看从T是否不大于近邻数k
if (self.T <= self.k):
# 若是,k更新为T-1
self.k = self.T - 1

# 令N是100的倍数
N = int(self.N / 100)
# 创建保存合成样本的数组
self.synthetic = np.zeros((self.T * N, self.numattrs))

# 调用并设置k近邻函数
neighbors = NearestNeighbors(n_neighbors=self.k + 1,
algorithm='ball_tree',
p=self.r).fit(self.samples)


# 对所有输入样本做循环
for i in range(len(self.samples)):
# 调用kneighbors方法搜索k近邻
nnarray = neighbors.kneighbors(self.samples[i].reshape((1, -1)),
return_distance=False)[0][1:]

# 把N,i,nnarray输入样本合成函数self.__populate
self.__populate(N, i, nnarray)

# 最后返回合成样本self.synthetic
return self.synthetic

# 构建合成样本函数
def __populate(self, N, i, nnarray):
# 按照倍数N做循环
for j in range(N):
# attrs用于保存合成样本的特征
attrs = []
# 随机抽取1~k之间的一个整数,即选择k近邻中的一个样本用于合成数据
nn = random.randint(0, self.k - 1)

# 计算差值
diff = self.samples[nnarray[nn]] - self.samples[i]
# 随机生成一个0~1之间的数
gap = random.uniform(0, 1)
# 合成的新样本放入数组self.synthetic
self.synthetic[self.newindex] = self.samples[i] + gap * diff

# self.newindex加1, 表示已合成的样本又多了1个
self.newindex += 1

samples = np.array([[3,1,2], [4,3,3], [1,3,4],
[3,3,2], [2,2,1], [1,4,3]])

smote = Smote(N=500,k=10)
synthetic_points = smote.fit(samples)
print(synthetic_points.shape)

print(random.uniform(0,13))

plt.scatter(samples[:,0], samples[:,1])
plt.scatter(synthetic_points[:,0], synthetic_points[:,1])
plt.legend(["minority samples", "synthetic samples"])
plt.show()

或者直接调用SMOTE包
[12]机器学习_smote算法_初始化

from imblearn.over_sampling import SMOTE
#sampling_strategy参数就是说将
smo = SMOTE(sampling_strategy=0.6, random_state=2021)
X_smo,y_smo = smo.fit_resample(X,y)
print(Counter(y_smo))

使用smote算法之前1865:99,使用smote算法扩充以后,1865:1119

[12]机器学习_smote算法_k近邻_02


要注意strategy_sampling参数的使用,float只对于而分类有效。

[12]机器学习_smote算法_初始化_03

#3、参考资料
​https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.SMOTE.html​



标签:synthetic,12,smote,self,样本,算法,samples,100
From: https://blog.51cto.com/u_14597003/5989176

相关文章

  • (1)评价算法—熵权法
    文章目录​​1、什么是熵权法​​​​1.1优点​​​​1.2缺点​​​​1.3适用范围​​​​2、使用熵权法过程​​​​2.1数据预处理​​​​2.1.1清洗指标极值​​​​2......
  • 一文入门 3D 视觉算法基础
    背景知识一,基于3DMM的三维人脸重建技术概述1.1,3D人脸重建概述1.2,初版3DMM二,视觉SLAM算法基础概述2.1,视觉里程计2.2,后端优化2.3,回环检测2.4,建图三,三维点云......
  • redis部署手册_20221129
    1.软件版本及下载Keepalived:https://www.keepalived.org/download.htmlRedis下载地址:https://redis.io/download/本次安装版本:Redis:7.0.5Keepalived:2.2.72.主......
  • 自研ORM Include拆分查询(递归算法 支持无限层级) 性能优化探讨
    最近我在优化 Include拆分查询,贴出源码供大家交流探讨是否还有优化空间。测试代码1Console.WriteLine($"总记录数:{db.Query<Category>().Count()}......
  • FreeSWITCH学习笔记12 - 基本功能与实现
    11.5.3、立体声       11.5.4、录音相关的通道变量具体参考11.5.411.5.5、原生格式            11.6、放音11.6.1、playback的参数    ......
  • 初学算法 | 数组的基本操作
    算法专题时间复杂度数据结构的使用经典算法思想树的概念与操作搜索的实践与应用动态规划(一)综合训练数据结构集合、列表和数组区分数组操作1、读取元......
  • 投资#212 马斯克发推带货doge了,又拉到0.1589美金了​,并带动了一波土狗,又有人神话马斯
    马斯克发推带货doge了(最强的带货就是发个图,好像啥也没说,好像又啥都说了,一切尽在不言中,聪明的人马上就get到并行动起来了),doge又从0.121拉到0.1589美金了,并......
  • 其实一开始我是不喜欢算法的,但是当我业务上用到了我不得不写
    起源是同事的一个算法,账单导入后,要计算每个月固定收支分析这个计算大概是,要统计一个连续月份的金额固定区间。说人话就是把当前月份的金额先分组,按照一个设定的按照“浮......
  • v12_定位
    定位静态定位static默认值相对定位relative :相对自己原始位置且原始位置仍空置留未脱离绝对定位absolute:相对于界面脱离原始位置固定定位fixed:类似广告窗口,固定定位相......
  • 算法与数据结构 学习流程
    嵌入式LINUX中算法与数据结构应用比较广泛,需要学习及熟练掌握:  推荐一些算法书籍。入门系列入门的同学,我建议你不要过度追求上去就看经典书。不要一来就拿着《算......