解释分类算法中类别不平衡的处理

2024年06月13日 由 alex 发表 163 0

暂时放下生成式人工智能,最近我有机会研究二元分类问题,但有一个问题,即数据高度不平衡,需要进行一些预处理才能继续。因此,在这篇文章中,我将尝试解释我尝试过的不同不平衡算法。


什么是类不平衡?

当数据集中某些类别的示例远远多于其他类别时,就会出现类不平衡。基本上,一个类别有大量条目,而另一个类别只有少量条目。


以欺诈检测系统为例。如果你想在正常交易(负类)中发现欺诈交易(正类),你可能会发现非欺诈交易远远多于欺诈交易。这就是阶级失衡的表现。


为什么类别不平衡是个问题?

类不平衡之所以会造成问题,是因为大多数算法/ML 模型都希望数据集中的类分布均匀。当一个类别远远超过另一个类别时,此类算法通常会偏向较大的类别,而忽略较小的类别。当少数类别是你真正关心的类别时,比如检测罕见疾病或发现欺诈行为,这就是一个大问题。


因此,有时模型可能总是只输出多数类。


在处理类不平衡时,某些指标可能会产生误导,因为它们没有考虑到偏斜分布。以下是你应该避免使用的指标:


应避免的指标


准确率:在不平衡的数据集中,准确率可能很高,这只是因为模型擅长预测大多数类别。例如,如果 95% 的交易都是非欺诈性的,那么一个总是预测非欺诈性的模型就会有 95% 的准确率,但对检测欺诈毫无用处。
错误率: 与准确率一样,错误率(错误预测的百分比)在不平衡的情况下也会产生误导,因为它不能反映模型在少数类别上的表现。
平均平方误差 (MSE): 对于不平衡数据的回归问题,MSE 可能会被多数类误差所主导,从而无法反映模型在少数类上的表现。


推荐指标

取而代之的是,你应该把重点放在能更深入地了解少数类别性能的指标上:

准确率:真实阳性预测值与总预测阳性值的比例。
召回率:真实阳性预测与实际阳性的比率。
F1 分数:准确率和召回率的调和均值,在它们之间提供平衡。
准确率-召回率曲线下面积(AUC-PR):在数据集不平衡的情况下,比ROC-AUC更好的指标。


现在,我们已经对类不平衡有了足够的了解,下面我们就来谈谈如何解决这个问题。因此,主要有 3 种技术可以解决这个问题


技术


欠采样

欠采样会减少多数类中的实例数量,从而平衡数据集。举例说明:


  • 原始数据: 950 个非欺诈,50 个欺诈。
  • 抽样不足后: 50 个非欺诈,50 个欺诈。


过度取样

过度取样通过重复或产生新的实例来增加少数类别中的实例数量。举例说明:


  • 原件: 950 个非欺诈,50 个欺诈。
  • 过度取样后:950 个非欺诈,950 个欺诈。


欠采样+过度采样

将这两种技术结合起来,通过减少多数类、增加少数类来平衡数据集。举例说明:


  • 原始数据: 950 个非欺诈数据,50 个欺诈数据。
  • 混合后:300 个非欺诈类(采样不足),300 个欺诈类(采样过度)


现在,我们将深入探讨这些类别中一些最重要的算法


过度采样

我们将在本节讨论 SMOTE 和 ADASYN


SMOTE

SMOTE(合成少数群体过度采样技术)是一种通过为少数群体生成合成样本来解决类不平衡问题的方法。SMOTE 并不是简单地复制现有的少数群体样本,而是通过对现有样本进行插值来创建新的实例。


SMOTE 如何工作?

选择少数群体实例: 随机选择一个少数群体实例。
查找最近的邻居: 确定其 k 个最近的少数群体类邻居。
生成合成样本: 随机选择其中一个邻居,通过在原始实例和邻居之间插值来创建合成样本。


假设你有一个用于检测欺诈交易的数据集:


非欺诈交易 950
欺诈交易 50


使用 SMOTE 进行平衡:


选择一个欺诈交易,例如交易 A。
在欺诈性交易(如交易 B、C 和 D)中找到它的近邻。
通过在 A 和它的一个邻域(比如 B)之间进行插值,生成一个合成样本。
假设事务 A 的值为 (x1,y1),事务 B 的值为 (x2,y2)。
可以创建一个值为 (x1 + α*(x2-x1),y1 + α*(y2-y1))的合成交易,其中 α 是一个介于 0 和 1 之间的随机数。


在应用 SMOTE 生成足够的合成样本以匹配多数类之后,你的数据集可能会是这样的:


非欺诈:950
欺诈性:950(50 个原始样本 + 900 个合成样本)


ADASYN

ADASYN 与 SMOTE 几乎相似,只是略有不同。它不是随机选择一个 “少数 ”样本来生成插值样本,而是为少数样本分配权重,并根据权重在生成假样本时优先考虑少数样本。因此,权重较高的样本会更多地被用于生成假样本。


这些权重是如何分配的?

计算密度分布: ADASYN 首先计算少数群体样本的密度分布。计算方法是找出每个少数群体样本的 k 个近邻中多数群体样本与少数群体样本的比例。


假设给定的少数群体点的分布如下:


点 A:2 个少数类样本,5 个多数类样本。比率=5/2=2.5


点 B:1 个少数群体,6 个多数群体=6/1=6


通过对这些比率值进行归一化处理,可以计算出比权重。


A=2.5/(6+2.5)=0.3


B=6/(6+2.5)=0.7


分配权重: 根据密度分布,ADASYN 为少数类样本分配权重。多数邻居比例较高的样本(即位于较稀疏区域的样本)权重较高,因为它们被认为更难学习。


其余过程与 SMOTE 类似,都是考虑所选样本周围的 K 个最近的少数样本,并对新样本进行插值。


采样


托梅克链接

Tomek's Link 是一种低采样技术,它能识别并移除彼此非常接近但属于不同类别的示例对,尤其是从多数类别中移除,以帮助平衡数据集。


简单来说,它是如何工作的:


查找配对: 查找在特征(如身高、体重等)方面相互接近的成对示例(数据点)。所谓接近,是指距离(无论是欧几里得距离、曼哈顿距离还是其他距离)较小。
检查类别: 查看这些配对是否属于不同的类别(例如,一个是 “是”,另一个是 “否”)。
删除多数类示例: 如果它们确实属于不同的类,则移除多数类(有更多示例的类)中的示例。


最近的邻居

在 Tomek's Link 的案例中,我们识别出了具有不同标签的相似样本。在这里,我们将只从多数类中识别相似样本,并删除冗余数据。


思路很简单:


识别近邻 为数据集中的每个示例找到与多数类最相似的数据点
删除信息量较少的示例: 删除多数类中的冗余示例。


过采样 + 欠采样(混合)


SMOTE Tomek

顾名思义,它是 SMOTE(过度取样)和 Tomek(欠采样)的组合,我们首先


  • 将 SMOTE 应用于少数群体
  • Tomek Link 用于多数群体


同样,我们还可以有其他组合,如 ADASYN+Tomek 等。


样本代码

除上述算法外,还有许多其他算法可供探索。在 python 中也有一个专门用于实现这些算法的库,名为 imbalanced-learn。使用方法:


pip install imbalanced-learn


现在,我们将创建一个虚拟分类数据,并最终使用 SMOTE 对少数群体进行超采样(使用 scikit-learn==1.4.0)


from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from collections import Counter
# Generate an imbalanced binary classification dataset
X, y = make_classification(n_samples=10000, weights=[0.9, 0.1], random_state=42)
# Split the dataset into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Print the class distribution before oversampling
print("Before oversampling:", Counter(y_train))
# Before oversampling: Counter({0: 7192, 1: 808})
# Create an instance of SMOTE
smote = SMOTE()
# Apply SMOTE to the training data
X_train_oversampled, y_train_oversampled = smote.fit_resample(X_train, y_train)
# Print the class distribution after oversampling
print("After oversampling:", Counter(y_train_oversampled))
# After oversampling: Counter({0: 7192, 1: 7192})


代码非常简单,只需使用 SMOTE() 对象调用 fit_resample()即可。同样,任何其他算法也可以轻松使用。

文章来源:https://medium.com/data-science-in-your-pocket/handling-class-imbalance-in-classification-algorithms-explained-2b0b7377aa34
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消