FakeOrange
预计阅读时间:5分钟8秒

SMOTE:用于表格数据的合成数据增强

探索SMOTE及其一些变体,如Borderline-SMOTE和ADASYN

0
0


前言



本文属于搬运内容,向原作者:Fernando López 致敬!


原文链接附于文章末尾,本文主要介绍一种数据增强的方式用于解决不平衡数据或数据不足。



简介



类不平衡问题是指类别之间的分布不均衡。在解决这一问题时,直觉是为少数类增加更多数据以实现类别间的平衡。然而,在实际的机器学习系统中,由于问题的性质,通常难以获取更多数据。为了解决这个问题,人们提出了多种替代方案,例如过采样、欠采样以及合成数据生成。本文将重点介绍SMOTE算法及其变体生成表格数据的过程。



什么是SMOTE?



data/78df2c1f-e442-415d-a382-fa7925af0c4b/37edb874-580c-41fa-8988-0a31626427cbimage.png


合成少数类过采样技术 (SMOTE) 是由Nitesh V. Chawla等人于2002年提出的一种过采样技术。SMOTE专注于生成合成表格数据,其核心思想是在少数类样本与其“k”个最近邻之间生成新的合成数据。具体来说,对于少数类的每个样本,找到其“k”个最近邻(默认k=5)。然后,在该样本与每个最近邻点之间生成一条新数据。在图2中,可以看到SMOTE的直观描述:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/d21c6f66-6078-41f0-8626-4e5e753ba834image.png


图2:SMOTE的可视化描述


如图2 (b) 所示,SMOTE根据样本x1及其三个最近邻(x2、x3、x4)生成合成数据s1、s2和s3。


虽然SMOTE是一种能够生成合成表格数据的技术,但该算法本身也有一些局限性:


  • 仅适用于连续数据(无法生成类别型合成数据)。


  • 生成的合成数据线性依赖,可能导致生成数据的偏差,从而导致模型过拟合。


为了解决这些局限性,人们提出了一些基于SMOTE的改进方法。接下来,我们将探讨其中几个重要变体。



Borderline-SMOTE



Borderline-SMOTEHui Han等人于2005年提出的一种SMOTE变体。与原始SMOTE技术不同,Borderline-SMOTE关注的是仅根据构成类别边界的样本生成合成数据。具体来说,该方法检测哪些样本位于类别空间的边界,并对这些样本应用SMOTE技术。图3展示了Borderline-SMOTE的可视化描述:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/27823514-b244-4bfa-9d65-fab39b42e93eimage.png


图3:Borderline-SMOTE的可视化描述


如图所示,生成合成样本时,仅考虑少数类中位于边界部分的样本。
SVM-SMOTE 是一种Borderline-SMOTE的替代方法,它通过支持向量机(SVM)来确定边界。



ADASYN



自适应合成技术 (ADASYN) 由Haibo He等人于2008年提出。ADASYN基于SMOTE算法来生成合成数据,但与SMOTE不同的是,ADASYN采用了一种方法,专注于检测少数类中处于被多数类主导区域的样本,以便在这些低密度区域中生成样本。也就是说,ADASYN关注的是那些因处于低密度区域而难以分类的少数类样本。图4展示了ADASYN的可视化描述:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/89fe5711-d0e9-455c-8c94-588cfee7193fimage.png


图4:ADASYN的可视化描述


如图所示,用于生成合成样本的点集中在低密度区域。
K-Means-SMOTE 是ADASYN的另一种替代方法,它根据少数类中每个聚类的密度生成合成样本。



实践中的SMOTE



在本节中,我们将使用Python库imbalanced-learn【1】实现SMOTE【2】及其变体(Borderline-SMOTE【3】和ADASYN【4】)。为了比较这些技术的效果,我们将利用scikit-learn框架中的make_classification模块生成一个不平衡数据集。随后,我们将展示每种算法的可视化结果,并基于**准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1-score)**对每个模型进行评估。



生成数据集



首先,我们通过以下代码片段生成数据集:


def generate_data():
    """
    表格数据生成
    """
    x, y = make_classification(n_features=2, 
                               n_redundant=0, 
                               n_informative=1,
                               n_clusters_per_class=1,
                               n_samples=2000,
                               weights=[0.95, 0.05],
                               class_sep=1)

上述代码生成了一个包含2000个样本的数据集,数据集具有2个特征和2个类别,其中大多数类占据了95%的数据,而少数类仅占5%。生成数据集的可视化结果如图5所示:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/fa78d83e-b26b-4f47-b2ae-939bcf7c6940image.png


图5:类别不平衡 | 作者制作的图片


图中可以清晰地看到类别分布的极度不平衡。



SMOTE、Borderline-SMOTE 和 ADASYN 的实现



由于imbalanced-learn库的便利性,SMOTE及其变体的实现相对简单。我们只需扩展所需的过采样算法并为每种算法定义相关参数。以下是每种算法的实现代码:


from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import BorderlineSMOTE
from imblearn.over_sampling import ADASYN
import math

def smote(x, y):
    # Synthetic Minority Over-sampling Technique
    # 
    # sampling_strategy: 确定生成的样本占多数类样本的比例
    # k_neighbors : 每个样本考虑的邻居数
    
    # 对于这个示例,只有1%的少数类样本被考虑
    k_neighbors = math.ceil(sum(self.y) * 0.01)
      
    smote = SMOTE(sampling_strategy=1, 
                  k_neighbors=k_neighbors)
    x, y = smote.fit_resample(x, y)
    
    return x, y
    
def bordersmote(x, y):
    # Borderline-SMOTE
    # 
    # sampling_strategy: 确定生成的样本占多数类样本的比例
    # k_neighbors : 每个样本考虑的邻居数
    # m_neighbors : 用于判断样本是否为危险样本的邻居数
    
    # 对于这个示例,只有1%的少数类样本被考虑
    k_neighbors = math.ceil(sum(self.y) * 0.01)
    m_neighbors = math.ceil(sum(self.y) * 0.01)
    
    bordersmote = BorderlineSMOTE(sampling_strategy=1, 
                                  k_neighbors=k_neighbors, 
                                  m_neighbors=m_neighbors)
    
    x, y = bordersmote.fit_resample(x, y)
    
    return x, y
    
def adasyn(x, y):
    # Adaptive Synthetic
    # 
    # sampling_strategy: 确定生成的样本占多数类样本的比例
    # n_neighbors : 每个样本考虑的邻居数
    
    # 对于这个示例,只有1%的少数类样本被考虑
    n_neighbors = math.ceil(sum(self.y) * 0.01)
    
    adasyn = ADASYN(sampling_strategy=1,
                   n_neighbors=n_neighbors)
    x, y = adasyn.fit_resample(x, y)

    return x, y


重要说明


在这个示例中,一些固定的参数已经预先定义,例如用于确定最近邻的“k”值以及用于确定样本是否为“危险”样本的邻居数量(适用于Borderline-SMOTE)。这些超参数将根据数据集的大小、类别不平衡的比例、少数类样本数量等进行调整。


图6、7和8分别展示了SMOTE、Borderline-SMOTE和ADASYN算法实现的可视化。


data/78df2c1f-e442-415d-a382-fa7925af0c4b/f0487b73-fa26-4707-8c64-00dfd31378d3image.png


图6:SMOTE | 作者制作的图片


data/78df2c1f-e442-415d-a382-fa7925af0c4b/596506c7-d42c-4da2-8ada-d41d2be8fabdimage.png


图7:Borderline-SMOTE | 作者制作的图片


data/78df2c1f-e442-415d-a382-fa7925af0c4b/159e75ca-07cc-4847-aa28-05042b99911dimage.png


图8:ADASYN | 作者制作的图片



训练与评估方法



训练与评估方法基于逻辑回归的实现,并采用了分层K折交叉验证(Stratified K-fold cross-validation)技术,以确保每一折中的类别平衡。

“Dummy”模型 指的是使用未经处理的类别不平衡数据进行分类的模型实现。


最终结果如表1所示,每项评估指标的值是通过交叉验证过程计算得到的平均值。



表1:结果比较

方法DummySMOTEBorderline-SMOTEADASYN
准确率 (Accuracy)0.93700.89930.91630.8133
精确率 (Precision)0.17340.87400.88550.8012
召回率 (Recall)0.46360.93450.95720.8263
F1分数 (F1-score)0.07110.90290.91970.8076



结论



在这篇博客中,我们探讨了SMOTE作为一种基于过采样的合成数据生成技术。同时,Borderline-SMOTE和ADASYN算法作为对原始SMOTE算法的改进也进行了介绍。

考虑到解决类别不平衡问题的技术多种多样,建议尝试不同的方案,并选择最适合自己具体问题的技术,调整超参数以优化结果。



参考文献



  • Imbalanced-learn


  • SMOTE: Synthetic Minority Over-sampling Technique


  • Borderline-SMOTE: A New Over-Sampling Method in Imbalanced Data Sets Learning


  • ADASYN: Adaptive Synthetic Sampling Approach for Imbalanced Learning



原文链接

评论
Copyright Created by DataER | 沪ICP备2024052789号-5 | 沪公网安备31010402336337号