SMOTE

SMOTE介绍

SMOTE(合成少数类样本):在随机过采样的基础上,增加了k近邻的思想

k近邻思想

k近邻思想原理:

  1. 对于少数类中的每一个样本元素x,计算x与该少数类中的其他样本元素之间的欧氏距离,根据距离可以得到k近邻。

  2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn

  3. 对于每一个随机选出的近邻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))

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐