在机器学习和数据科学领域,处理不平衡数据集是一个常见且具有挑战性的问题。不平衡数据集指的是数据集中不同类别的样本数量存在显著差异,其中某一类别的样本数量远多于其他类别。这种情况在现实世界中比比皆是,例如:
- 股票涨停板(大部分时候不涨停)
- 信用卡欺诈检测(正常交易占比大多)
- 医疗诊断(大多数人是健康的)
当模型面对这些不平衡数据时,它往往会偏向多数类,而忽视少数类 —— 即使少数类通常是我们更关心的类别(比如欺诈交易或疾病诊断)。传统的处理方法如随机过采样(简单复制少数类样本)或随机欠采样(删除多数类样本)虽然简单直接,但存在明显缺陷:前者容易导致过拟合,后者则可能丢失重要信息。为了解决这些问题,研究者们开发了多种技术,其中 SMOTE(Synthetic Minority Over-sampling Technique,合成少数类过采样技术)因其有效性和创新性成为处理不平衡数据的主流方法之一。
SMOTE 算法原理与实现
SMOTE 的基本思想
SMOTE 是一种基于随机过采样算法的改进方案,它通过在少数类样本之间插值来生成新的合成样本,而非简单地复制现有样本。这种方法有效缓解了随机过采样容易产生的模型过拟合问题,使得模型学习到的信息更加泛化 (generalization)。
SMOTE 的核心思想可以概括为:对于每个少数类样本,算法会随机选择其 k 个最近邻,然后在这些邻居之间随机选择一个点,并在这个点和原始点之间的连线上生成新的合成样本。通过这种方式生成的新样本既保留了原始数据的特征关系,又增加了数据的多样性,从而提高了模型的泛化能力。
SMOTE 的数学原理与算法步骤
SMOTE 算法的具体实现步骤如下:
- 确定少数类样本: 首先识别数据集中的少数类样本,即数量较少的类别。
- 计算最近邻: 对于每个少数类样本,使用距离度量(通常是欧氏距离)找到其 k 个最近邻的少数类样本。
- 重复过程: 对所有少数类样本重复上述步骤,直到生成足够数量的合成样本,使数据集达到期望的平衡状态。
- 生成合成样本: 对于每个少数类样本,随机选择一个最近邻样本,并在这两个样本之间的连线上生成一个新的合成样本。数学上,新样本可以表示为:x_new = x_i + rand(0,1) * (x_zi - x_i)。这个公式表示在原始样本和其最近邻样本之间的连线上随机选择一个点作为新样本。
SMOTE 的参数与配置
SMOTE 算法有几个关键参数需要配置,这些参数会影响生成样本的质量和算法的效果:
- k_neighbors: 定义了最近邻的数目,默认值通常为 5。它决定了 SMOTE 基于多少个邻居来生成新的合成样本。如果设置过小(如 k=1),则可能导致欠采样的情况;而过大则可能引入噪声。
- sampling_strategy: 控制重采样的策略,可以接受字符串或字典形式输入:
- 'auto': 默认选项,仅对数量少于多数类一半的类进行上采样。
- 浮点数: 表示目标比例,例如 0.5 意味着使少数类达到多数类的一半大小。
- 字典: 明确指定每种类别的期望实例数。
- random_state: 为了确保实验可重复性,可以通过设定随机种子来固定每次运行的结果。这在调试阶段或对比不同方法的效果时尤为重要。
- n_jobs: 指定用于计算的并行作业数,设置为 -1 表示使用所有可用的处理器,提高计算效率。
SMOTE 与其他过采样方法的比较
| 方法 | 优点 | 缺点 |
|---|---|---|
| 随机过采样 | 简单高效 | 可能导致过拟合,因为只是简单复制现有样本 |
| 随机欠采样 | 减少计算量 | 可能丢失多数类中的重要信息 |
| SMOTE | 生成新的合成样本,减少过拟合风险 | 在高维数据中效果不佳,可能引入类间重叠和噪声 |
随机过采样和欠采样是处理不平衡数据的基础方法,但它们的局限性也很明显。SMOTE 通过生成合成样本而非简单复制,减少了过拟合的风险,同时保留了所有少数类样本的信息。然而,SMOTE 也存在一些缺点,例如可能增加类间重叠和噪声,特别是当少数类样本周围有其他类别的样本时。此外,高维数据中的距离计算可能不准确,影响最近邻的选择,进而影响生成样本的质量。


