目录
SMOTE是一种经典的过采样方法。
一、思想
对于一个少数类:
1. 使用K近邻法,求出距离最近的K个少数类样本,其中的距离定义为样本之间n维特征空间的欧式距离。
2. 从K个近邻中随机选取一个,使用公式生成新的样本:
二、代码
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()
3075

被折叠的 条评论
为什么被折叠?



