如何识别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
相关产品推荐
相关产品推荐

