You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别SMOTE算法生成的合成样本?

如何识别SMOTE生成的合成样本?

我有一个带标签的数据集,X维度为7000×2400,y维度为7000,存在严重类别不平衡问题。我尝试用SMOTE生成合成样本,但希望通过索引或其他机制识别出SMOTE实际生成的合成样本。示例代码如下:

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from imblearn.over_sampling import SMOTE

iris = load_iris()

X = iris['data']
y = iris['target']

# 构造不平衡数据集(移除部分样本)
X = X[:125,::]
y = y[:125]

oversample = SMOTE()
X_smt, y_smt = oversample.fit_resample(X, y)

数组X_smt和y_smt同时包含原始样本与合成样本,以下是几种简便的识别方法:


方法1:对比原始样本集合标记合成样本

将原始样本的每行转换为可哈希的元组并存储为集合,遍历新样本时,不在该集合中的即为SMOTE生成的合成样本:

# 把原始样本转为元组集合,用于快速比对
original_samples = set(tuple(row) for row in X)

# 生成合成样本标记数组:0=原始,1=合成
is_synthetic = np.array([0 if tuple(row) in original_samples else 1 for row in X_smt])

# 验证:示例中最后25个是y=2的合成样本,标记全为1
print(is_synthetic[-25:])

方法2:针对少数类样本精准识别

SMOTE仅对少数类样本进行过采样,因此可以先提取原始少数类样本,再在新样本的少数类部分中筛选出非原始样本:

# 确定原始数据中的少数类(示例中y=2的样本数量最少,共25个)
minority_class = 2
original_minority = X[y == minority_class]
original_minority_set = set(tuple(row) for row in original_minority)

# 提取新样本中的少数类部分
smt_minority = X_smt[y_smt == minority_class]

# 标记少数类中的合成样本
minority_synthetic_flags = np.array([0 if tuple(row) in original_minority_set else 1 for row in smt_minority])

# 验证:前25个是原始少数类(标记0),后25个是合成样本(标记1)
print(minority_synthetic_flags)

方法3:提前添加标记列追踪

在原始数据中新增一列用于标记原始样本,SMOTE会保留所有特征列进行过采样,之后通过对比原始标记行即可识别合成样本:

# 给原始数据新增最后一列,标记为0(代表原始样本)
X_marked = np.hstack([X, np.zeros((X.shape[0], 1))])

# 执行SMOTE过采样
oversample = SMOTE()
X_smt_marked, y_smt = oversample.fit_resample(X_marked, y)

# 对比原始标记行,标记合成样本
original_marked_set = set(tuple(row) for row in X_marked)
is_synthetic = np.array([0 if tuple(row) in original_marked_set else 1 for row in X_smt_marked])

# 分离特征和合成标记
X_smt = X_smt_marked[:, :-1]
synthetic_flags = is_synthetic

内容的提问来源于stack exchange,提问作者Arindam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:35:30