
图片由作者使用 Midjourney 创建
引言
在机器学习中,不完美的数据是很常见的,而不是例外。同样常见的是二元类别不平衡,当训练数据中的类别保持多数/少数类别,或者处于中度偏斜时。不平衡数据会因产生模型选择偏差而削弱机器学习模型。因此,为了模型性能和公平的代表性,在训练和评估过程中解决不平衡数据问题是至关重要的。
本文将定义不平衡数据、作为解决方案的重采样策略、适当的评估指标、算法方法种类,以及合成数据和数据增强在解决这种不平衡问题中的作用。
1. 理解问题
最重要的技巧其实是理解问题。
不平衡数据是指一个类别的实例数量显著高于其他类别的情况。这种不平衡性在欺诈检测(例如,欺诈交易与合法交易相比非常罕见)和罕见疾病预测(例如,阳性病例很少)等各种领域中普遍存在。在这些情况下,标准的机器学习技术可能会遇到困难,因为它们可能倾向于偏向多数类。
不平衡数据对机器学习模型的影响可能非常深远。准确率等指标可能会产生误导,因为一个为所有实例都预测多数类的模型仍然可能获得高准确率。例如,在一个非欺诈交易占 95%、欺诈交易占 5% 的数据集中,一个总是预测非欺诈的模型将具有 95% 的准确率,但完全无法检测欺诈。这种情况凸显了采用适合不平衡数据集的技术和指标的必要性。
一旦我们理解了问题,我们就可以主动应对它。
2. 重采样技术
重采样技术是解决不平衡数据问题的一种流行方法。一种方法是欠采样,它包括减少多数类中的实例数量,以使数据集达到平衡。不幸的是,这很容易导致信息丢失。另一种方法是过采样,它增加了数据中少数类实例的数量。过采样的缺点包括过拟合的可能性。
SMOTE(合成少数类过采样技术)等技术可以通过对现有样本进行插值来生成新的合成实例。每种方法都有其优点和缺点,欠采样存在信息丢失的风险,过采样存在过拟合的可能性。实际实现需要对这两种方法进行调整和平衡,以最大限度地提高有效性。
这是使用 Imbalanced Learn 库的 SMOTE 模块在 Python 中实现的 SMOTE 示例。
1234567891011121314
from imblearn.over_sampling import SMOTEfrom sklearn.datasets import make_classificationfrom collections import Counter X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=1) print(f'原始数据集形状 {Counter(y)}') sm = SMOTE(random_state=42)X_res, y_res = sm.fit_resample(X, y) print(f'重采样数据集形状 {Counter(y_res)}')
您可以在 这里找到关于使用 SMOTE 的完整教程。
3. 选择正确的评估指标
在处理类别不平衡的数据时,在选择评估指标时必须小心。在这种情况下,通常比准确率更有信息量的是精确率、召回率、F1 分数和 AUC-ROC。精确率衡量所有识别出的阳性样本中正确识别的阳性样本的比例,而召回率衡量所有真实阳性样本中正确识别的阳性样本的比例。
F1 分数是精确率和召回率的调和平均数,成功地平衡了两者。最后,AUC-ROC(代表曲线下面积接收者操作特征,或通常称为 ROC 曲线下面积)表征了分类器在所有分类阈值上的性能,因此提供了对分类模型有效性的全面视图。每种评估类型都起着作用;例如,对召回率的重视可能体现在一种医学状况中,在这种情况下,即使会产生更多的假阳性,识别出所有可能的阳性病例也是至关重要的。
以下是分类后使用 Scikit-learn 计算各种指标的代码片段。
12345678
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score precision = precision_score(y_true, y_pred)recall = recall_score(y_true, y_pred)f1 = f1_score(y_true, y_pred)roc_auc = roc_auc_score(y_true, y_pred) print(f'精确率: {precision}, 召回率: {recall}, F1 分数: {f1}, AUC-ROC: {roc_auc}')
4. 使用算法方法
有些算法天生就擅长处理偏斜数据。决策树和集成方法(如随机森林和梯度提升)可以通过类别加权来适应和利用,以帮助处理类别不平衡。然后,这些模型能够为少数类分配更多的权重,从而提高其预测准确性。
成本敏感学习是另一种技术,它会考虑数据点的误分类成本,并因此训练模型以偏向于降低此成本。前面提到的 Imbalanced Learn 是一个支持成本敏感学习的库,它使得在训练过程中自动更重地加权少数类样本的实现更加容易。
以下是使用 Scikit-learn 实现类别加权的示例。
1234
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(class_weight='balanced')model.fit(X_train, y_train)
5. 利用数据增强和合成数据
数据增强是在图像处理中常用的技术,用于平衡标记数据集中的类别分布,但它在其他机器学习任务中也有其作用。它通过变换来修改现有数据,从而创建新的数据实例。
另一种选择是完全生成新数据。例如,用于图像的 Augmentor 和用于表格数据的 Imbalanced Learn 等库都可以通过采用合成示例生成来帮助解决少数类代表性不足的问题。
这是 Imbalanced Learn 中的一个实现。
1234
from imblearn.under_sampling import RandomUnderSampler undersample = RandomUnderSampler(sampling_strategy='majority')X_res, y_res = undersample.fit_resample(X, y)
总结
处理不平衡数据需要一种结合多种策略的整体方法。重采样技术、适当的评估指标、算法调整和数据增强在创建平衡数据集和提高模型性能方面都发挥着至关重要的作用。然而,处理不平衡数据最重要的一点是识别和规划它。鼓励从业者尝试这些技术,为他们的特定用例找到最佳解决方案。通过这样做,他们可以构建更强大、更公平、更准确的机器学习模型。
暂无评论。