如何处理不平衡的数据

数据挖掘 机器学习 特征工程 模型选择
2022-02-22 04:39:07

我正在从一组特征向量构建一个二元分类器,其中一些是分类的,例如是或否(两个选项)。我用 1 和 0 替换它们,由于 1 和 0 之间存在严重的不平衡,我的模型基本上是在这些特征上学习的。恐怕这个特定的特性可能是一个伪影——具有 0 的样本有时也可以归类为 1。在这种情况下该怎么办?我应该完全放弃该功能吗?

更新:

让我详细解释一下这个问题,因为答案主要集中在不平衡的类上。我有一个包含大约 30 个特征和二进制类 {0,1} 的数据集。特征大多是数字的(连续的),但也有二元分类特征,如 YES/NO、MALE/FEMALE 等。

该数据集的一个方面是不平衡类(多于零),另一方面是一个分类特征,可以说x(是/否)也不是很平衡。事实上,如果你仅仅根据x像:x=11,x=00你会比一个只预测的幼稚模型表现得更好0(记住不平衡的类)。

现在,我的困境是在这种情况下该怎么办?我应该从建模中完全删除该变量还是使用一些消除偏差的技术?

2个回答

一般来说,不平衡数据分类主要有三种解决方案。

  1. 通过生成人工数据或其他方式对薄类进行过采样。在可以生成准确的人工数据的情况下,此解决方案可能会有所帮助。
  2. 对人口众多的班级进行抽样不足。该解决方案也适用于类人口比例不是很低的情况(例如 30% 到 70% 而不是 1% 到 99%)
  3. 使用可以处理不平衡数据的适当损失函数。在存在不平衡数据的情况下,有许多指标可以评估分类器的性能。

免责声明:如果您使用 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)

在某些情况下,分类问题会有不平衡的数据(1 或 0 将主要出现在目标列中)。如果我们继续处理这些数据,我们创建的模型将偏向主导输出。为了解决这个问题,我们有很多过采样技术来平衡数据。他们之中有一些是:

  1. 在 python 中使用 pandas 的重采样技术。
  2. SMOTE(python 中可用的包)
  3. SMOTE+TOMEK
  4. SMOTE+ENN
  5. 随机过采样

(对于python中的3、4、5,我们需要在python中安装imblearn包)