SMOTE方法
SMOTE(合成少数类样本):在随机过采样的基础上,增加了k近邻的思想。
·
SMOTE
SMOTE介绍
SMOTE(合成少数类样本):在随机过采样的基础上,增加了k近邻的思想
k近邻思想
k近邻思想原理:
-
对于少数类中的每一个样本元素x,计算x与该少数类中的其他样本元素之间的欧氏距离,根据距离可以得到k近邻。
-
根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn
-
对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本
xnew = x + rand (0, 1) ∗ ∣x − xn∣

上图中,少数类是B类样本,首先随机选中一个中心节点,计算该点与其余B类样本节点的欧氏距离(即数学中计算x-y坐标中的两点距离),设置k值为5,选中距离最近的k个节点,随机选一个节点进行扩充,按照构建公式进行构建新节点。
代码实现
直接调用库:
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
from collections import Counter
# 创建一个不平衡的数据集
'''
n_classes=2: 指定数据集中的类别数量,这里设定为2,表示二分类问题。
class_sep=2: 类别之间的距离。数值越大,类别之间的分离度越大。
weights=[0.1, 0.9]: 指定每个类别的权重。在这里,第一个类别的权重为0.1,第二个类别的权重为0.9。这就造成了不平衡的数据分布。
n_informative=3: 指定数据集中有用特征的数量。
n_redundant=1: 数据集中与目标变量无关但与其他特征相关的冗余特征数量。
flip_y=0: 指定标签翻转(错误)的概率。
n_features=20: 指定数据集中的特征数量。
n_clusters_per_class=1: 指定每个类别中的簇数量。
n_samples=1000: 指定生成的样本数量。
random_state=10: 随机数种子,确保每次运行生成的数据集一致。
X: 生成的特征数据,是一个形状为 (n_samples, n_features) 的二维数组。
y: 生成的目标变量(类别标签),是一个形状为 (n_samples,) 的一维数组,其中包含每个样本的类别标签。
这段代码的目的是生成一个包含1000个样本和20个特征的合成数据集,其中包含两个类别,
类别之间的分离度为2,且第一个类别的样本数量较少(权重为0.1),第二个类别的样本数量较多(权重为0.9)
'''
X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))
# 使用SMOTE方法生成合成样本
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))
更多推荐



所有评论(0)