过采样——SMOTE方法

目录

一、思想

二、代码

1. 类的初始化

2. 生成样本

 3. 训练模型 

4. 调用方法


SMOTE是一种经典的过采样方法。

一、思想

对于一个少数类x_{i}

1. 使用K近邻法,求出距离x_{i}最近的K个少数类样本,其中的距离定义为样本之间n维特征空间的欧式距离。

2. 从K个近邻中随机选取一个\hat{x}_{i},使用公式生成新的样本:

x_{new}=x_{i}+(\hat{x}_{i}-x_{i})\times \delta


二、代码

1. 类的初始化

class SMOTE:
    def __init__(self, k_neighbors=5, random_state=None):
        self.k = k_neighbors
        self.random_state = random_state
  • k_neighbors 参数默认设置为5,表示用于计算最近邻的邻居数量。
  • random_state 参数用于设置随机种子,以确保结果的可重复性。

2. 生成样本

    def sample(self, n_samples):
        #设置随机数种子
        np.random.seed(seed=self.random_state)
        #创建一个n_samples x n_features的0矩阵  n_samples是添加的样本数   n_features是样本的特征数
        S = np.zeros(shape=(n_samples, self.n_features))

        # Calculate synthetic samples.计算合成样本
        for i in range(n_samples):
            #j=0~X的数量-1(少数类样本数量)
            j = np.random.randint(0, self.X.shape[0])

            #找到最近邻nn=[[[...],[...],[...]...]]  [:, 1:]因为第一个是自己所以从1开始表示不包含自己
            nn = self.neigh.kneighbors(self.X[j].reshape(1, -1),return_distance=False)[:, 1:]
            #从最近邻中随机选择一个
            nn_index = np.random.choice(nn[0])

            #X_new=X_j+(X-X_j)*gap
            dif = self.X[nn_index] - self.X[j]
            # 0~1之間的一個數
            gap = np.random.random()
            S[i, :] = self.X[j, :] + gap * dif[:]

        return S

import numpy as np
from sklearn.neighbors import NearestNeighbors

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

# 创建并拟合最近邻模型
neigh = NearestNeighbors(n_neighbors=4)
neigh.fit(X)

# 随机选择一个样本
j = np.random.randint(0, X.shape[0])

# 找到样本的最近邻并排除自身
nn = neigh.kneighbors(X[j].reshape(1, -1), return_distance=False)[:, 1:]
nn_index = np.random.choice(nn[0])

print(f"选定样本索引: {j}")
print(f"最近邻样本索引(排除自身): {nn[0]}")
print(f"最近邻样本索引(排除自身): {nn_index}")

选定样本索引: 3
最近邻样本索引(排除自身): [2 1 0]
最近邻样本索引(排除自身): 0

 3. 训练模型 

#训练模型
    def fit(self, X):
        self.X = X
        #少数类 特征
        self.n_minority_samples, self.n_features = self.X.shape

        # Learn nearest neighbors.
        self.neigh = NearestNeighbors(n_neighbors=self.k + 1)
        self.neigh.fit(self.X)

        return self

4. 调用方法

from my_main import SMOTE

smote=SMOTE(random_state=0)
smote.fit(X_min)
#s就是新添的少数类
s=smote.sample()

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中的SMOTE(Synthetic Minority Over-sampling Technique)是一种用于处理不平衡数据集的过采样方法。下面是一个简单的MATLAB代码示例,用于实现SMOTE算法: ```matlab function [syntheticData, syntheticLabels] = smote(data, labels, k, numSynthetic) % data: 输入数据集 % labels: 输入数据集的标签 % k: 选择最近邻的数量 % numSynthetic: 生成的合成样本数量 numFeatures = size(data, 2); numSamples = size(data, 1); syntheticData = zeros(numSynthetic, numFeatures); syntheticLabels = zeros(numSynthetic, 1); for i = 1:numSynthetic % 随机选择一个少数类样本 minorityIndex = randi([1, numSamples]); minoritySample = data(minorityIndex, :); % 寻找k个最近邻样本 distances = sqrt(sum((data - minoritySample).^2, 2)); [~, sortedIndices] = sort(distances); kNearestIndices = sortedIndices(2:k+1); % 随机选择一个最近邻样本 nearestIndex = kNearestIndices(randi([1, k])); nearestSample = data(nearestIndex, :); % 在最近邻样本和少数类样本之间生成合成样本 syntheticSample = minoritySample + rand(1, numFeatures) .* (nearestSample - minoritySample); % 添加合成样本到数据集中 syntheticData(i, :) = syntheticSample; syntheticLabels(i) = labels(minorityIndex); end end ``` 使用该代码,你可以将输入的数据集和标签作为参数传递给`smote`函数,并指定最近邻的数量`k`和要生成的合成样本数量`numSynthetic`。函数将返回生成的合成样本数据和对应的标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值