Python 中的 Imbalanced Learn 模块

2025年7月22日 | 阅读 7 分钟

Imbalanced-Learn 是一个 Python 库,用于解决不平衡数据集问题,在这种情况下,一个类别的样本数量比其他类别多。这种不平衡可能导致模型偏向于多数类。顾名思义,Imbalanced-Learn 提供了不同的重采样方法,通过改变类别的分布来平衡它们,最终为少数类创建更好的模型。

要使用 Imbalanced-Learn,您需要以下依赖项:

如果您想安装 Imbalanced-Learn 库,只需在您的终端或命令提示符中输入以下命令:

重采样通常分两个主要步骤进行:

1. 估计器

估计器提供了与 scikit-learn 中相同的拟合过程。它接受输入特征以及作为二维数组的目标标签。

2. 重采样器

数据集的 `fit_resample` 方法通过重采样来平衡类别。它会输出重采样后的数据和目标。

为了平衡不平衡的数据集,Imbalanced-Learn 库提供了丰富的过采样算法和欠采样算法集合。

为了说明这些方法,我们使用 scikit-learn 的 `make_classification` 工具,该工具创建一个用于分类试验的合成数据集。此函数返回:

X:一个形状为 (n_samples, n_features) 的矩阵,表示输入特征

Y:一个一维数组,包含表示目标类别的整数标签

输出

X sample:
 [[-0.8667404  -0.09254569  0.02427936 ... -0.12587831 -0.39857298  0.5019842 ]
  [ 0.34796387 -0.51092589  1.43366293 ...  0.58988027 -0.04835788  0.51447794]
  [ 0.88932669  0.11002514 -1.37438928 ... -0.4582427  -0.37853782 -0.72833769]
  [ 0.2398515  -0.38722776 -0.59773954 ... -0.25997423  1.33692592 -0.20868468]
  [-0.52764142  0.57473316 -1.22828951 ...  0.12705142 -0.74451789 -0.07787666]]

y sample:
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

下面给出了一些说明性程序示例,解释了如何为不平衡数据集使用过采样和欠采样技术:

1. 过采样

a) RandomOverSampler(随机过采样器)

这是最简单的方法之一,通过随机生成少数类样本来尝试使样本集平衡。它是合成的,因为它重复使用相同的样本而不是创建新的样本。

语法

示例

输出

x_over:
 [[ 1.17749045e+00  6.26404546e-01 ... -3.19087196e-01]
  [-2.01496222e-01 -6.81009092e-01 ... -1.39502889e+00]
  ...
  [ 5.32934415e-01 -1.17791234e+00 ... -9.74920415e-01]]

y_over:
 [0 0 0 ... 1 1 1]

b) SMOTE、ADASYN

一些最先进的过采样示例是 SMOTE(合成少数类过采样技术)和 ADASYN(自适应合成采样),它们用于平衡数据中的类别。

这两种技术都生成人工生成的少数类样本,而不是复制现有的样本。然而,

  • SMOTE 在现有的少数类样本之间生成新样本。
  • ADASYN 更进一步,考虑了少数类的频率,在类别稀缺或不易学习的区域生成更多的合成样本。

语法

示例

输出

x_smote:
 [[-1.3989929  -0.45298168  0.96305785 ...  0.18181244 -0.0248006  -0.25275535]
  [-1.05980083  0.64076958 -0.61351159 ... -0.05089601 -0.44530834  0.27322539]
  ...
  [synthetic data rows generated by SMOTE]]
  
y_smote:
 [0 0 0 0 ... 1 1 1 1]

2. 欠采样

1. Edited Nearest Neighbours (ENN)(编辑近邻)

在这种欠采样方法中,将删除与最近邻不相同的多数类样本。也就是说,如果一个样本有另一个类别的邻居,则认为它是有噪声的(或边界上的),因此将其丢弃。这有助于清理决策边界并改进分类。

它尤其有助于缓解类别重叠以及不平衡数据集中的噪声。

语法

示例

输出

x_en:
 [[ 1.31395281 -0.16820672 -0.13666473 ... -0.57537888 -0.5153734   0.22953497]
  [ 0.82367683  0.84296339  1.45223073 ...  0.12793759  1.02967546 -0.1493886 ]
  ...
  [ 0.28372653  0.2411147  -0.35436444 ...  0.67943522 -0.29359349  0.15384294]]

y_en:
 [0 0 0 ... 1 1 1]

2. RandomUnderSampler(随机欠采样器)

RandomUnderSampler 是一种简单的欠采样方法,它随机采样多数类数据点,以达到少数类所需的数据点数量。这可以带或不带替换地进行,通过减少多数类记录来平衡数据集。

它简单快捷,但可以提供有用的见解,因此建议在您拥有大量多数类的情况下使用它。

语法

示例

输出

x_under:
 [[ 0.87993245  0.38517394 -0.78879377 ... -1.34029777 -0.31722729  0.11353794]
  [-0.75037842  0.27083596  0.14842717 ... -0.38324252 -1.09426893 -1.25185343]
  ...
  [synthetic or real feature values for 200 samples]]

y_under:
 [0 0 0 ... 1 1 1]

不平衡数据集的处理技术

不平衡数据集的方法可分为三大类:重采样、集成和成本敏感学习。

  • 重采样方法: 这些技术会调整具有不均匀类别表示的训练数据。
  • 随机过采样: 随机复制少数类样本,使其数量更多。
  • SMOTE(合成少数类过采样技术): 通过对现有少数类观测值进行插值来生成合成样本。
  • Borderline-SMOTE: SMOTE 的一种扩展,更关注在错误分类最可能发生的数据边界附近创建合成数据。
  • SVMSMOTE: 这涉及到利用支持向量机(SVM)来定位关键支持向量,并基于这些支持向量生成人工合成数据。
  • ADASYN(自适应合成采样): 通过根据局部密度对少数类样本进行优先级排序来生成合成数据,这些样本更难学习。
  • 随机欠采样: 通过随机采样来缩减多数类。
  • 聚类中心点: 对多数类进行聚类(例如 k-means),只保留聚类中心点。
  • Tomek Links: 识别并删除构成 Tomek 链接的边界情况,即成对的具有不同标签且彼此最近的邻居的样本。
  • NearMiss: 基于不同的策略(包括使用距离),选择最接近少数类的多数类样本。
  • 集成方法: 这些方法混合了多种模型,并可能包含重采样方法,以提高在不平衡信息环境下的性能。
  • Balanced Training Product(平衡训练产品): 随机森林的一个变体,在训练前平衡每个引导样本。
  • EasyEnsemble Classifier(易集成分类器): 使用由多数类欠采样产生的各种平衡子集进行多重训练。
  • RUSBoost Classifier(RUSBoost 分类器): 它将随机欠采样与 AdaBoost 集成,以提高不平衡数据的分类准确性。
  • 成本敏感学习: 这些模型将类别不平衡主动集成到学习算法中,通过直接对少数类施加更高的误分类惩罚。
  • Support Vector Classifier - Balanced(支持向量分类器 - 平衡): 一种 SVM,通过使用权重对少数类样本的误分类施加惩罚。
  • Balanced Logistic Regression(平衡逻辑回归): 修改逻辑回归损失函数以包含类别权重,以适应不平衡。
  • Balanced Decision Trees(平衡决策树): 修改决策树算法以适应类别权重,从而在提供不平衡数据时提高其性能。

Imbalanced-Learn 中的重要函数

Imbalanced-learn 库通过过采样、欠采样、集成算法和评估指标提供了丰富的工具集,用于处理不平衡数据。以下是一些关键函数及其目的:

过采样技术

1. imblearn.over_sampling.RandomOverSampler

随机复制少数类样本以平衡数据集。

2. imblearn.over_sampling.SMOTE

应用合成少数类过采样技术(SMOTE)通过插值少数类来生成通用的合成少数类样本。

3. imblearn.over_sampling.BorderlineSMOTE

一种 SMOTE 类型,专注于在错误分类最可能发生的数据类别边界处创建合成样本。

4. imblearn.over_sampling.SVMSMOTE

SMOTE 的一种变体,其中利用支持向量机来确定重要样本以创建合成数据。

5. imblearn.over_sampling.ADASYN

使用自适应合成采样方法,根据局部密度低且难以学习的区域生成额外的合成样本。

欠采样技术

1. imblearn.under_sampling.RandomUnderSampler

从多数类中随机选择样本以平衡类别分布。

2. imblearn.under_sampling.ClusterCentroids

对多数类进行聚合,只保留中心点,从而有效地缩短样本数量。

3. imblearn.under_sampling.TomekLinks

识别并删除 Tomek 链接(即属于不同类别的最近邻样本),以清理决策边界。

4. imblearn.under_sampling.NearMiss

通过各种基于距离的方法,选择最接近少数类的多数类样本。

5. imblearn.under_sampling.CondensedNearestNeighbour

通过消除冗余样本来保留多数类中最具信息量的样本。

结论

Python 中的 Imbalanced-Learn 库提供了大量可用于有效管理现实生活中频繁出现的不平衡数据集的附加组件。其强大的过采样策略工具集,如 SMOTE、ADASYN、RandomOverSampler,以及许多其他欠采样技术,如 Edited Nearest Neighbours 和 RandomUnderSampler,有助于创建公正和精确的机器学习模型。

还提供了更灵活的集成方法,如集成学习(EasyEnsemble、RUSBoost)和成本敏感学习(加权 SVM、逻辑回归)算法。所有这些技术都提高了模型在预测少数类方面的性能。Imbalanced-Learn 易于集成到 scikit-learn 管道中,对于任何处理类别比例不平衡的分类任务的数据科学家来说,都是一个必备库。