使用子类对数据进行过采样

数据挖掘 机器学习 分类 训练 阶级失衡
2022-03-03 22:28:28

对代表性不足的数据进行过采样是对抗类别不平衡的一种方法。例如,如果我们有一个包含 100 个 A 类数据点和 1000 个 B 类数据点的训练数据集,我们可以对 100 A 数据进行过采样(可能使用一些复杂的过采样方法)以生成 1000 A 数据来缓解数据不平衡。

现在,假设我们有 B 类的 1100 个数据点,A 类有 2 个子类 A1 和 A2,它们分别有 100 和 10 个数据点。我们仍然对二进制分类感兴趣。

在这种情况下,我应该如何处理 A 类的样本数据来解决类不平衡问题?我应该将 A1 采样到 1000 和 A2 采样到 100,还是将 A1 和 A2 采样到 550?

除了做实验,这种类不平衡问题有没有理论分析?

2个回答

这完全取决于你和你的问题。事实上,如果数据的分布必须保持不变,过采样并不是一个合适的解决方案。如果你能改变Loss function算法的,这将是非常有帮助的。引入了许多有用的指标来评估不平衡数据集的分类方法的性能。其中一些是KappaCENMCENMCCDP

免责声明

如果您使用 python,PyCM模块可以帮助您找出这些指标。

这是一个从该模块获取推荐参数的简单代码:

>>> from pycm import *

>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})  

>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]

之后,您想用作损失函数的每个参数都可以按如下方式使用:

>>> y_pred = model.predict      #the prediction of the implemented model

>>> y_actu = data.target        #data labels

>>> cm = ConfusionMatrix(y_actu, y_pred)

>>> loss = cm.Kappa             #or any other parameter (Example: cm.SOA1)

此类问题的理论分析始终是如何处理多类不平衡,因为即使它是二元分类,您仍然希望对三个类进行过采样。

对于您是否应该对 A1 和 A2 进行抽样的问题,答案始终取决于您对数据的了解程度以及您是否了解数据的基本事实。我认为当您将它们汇总为一个类时,保持类的分布非常重要。