机器学习中数据不平衡问题

是对博文在分类器中如何处理训练集中不平衡问题的一个简要笔记。

类别不均衡问题是常见问题

大部分分类任务中,各类别下的数据个数基本上不可能完全相等,但是一点点差异是不会产生任何影响与问题的。
在现实中有很多类别不均衡问题,它是常见的,并且也是合理的,符合人们期望的。如,在欺诈交易识别中,属于欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。这就是一个正常的类别不均衡问题。又如,在客户流失的数据集中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。

八大解决方法

  1. 调整样本中各类样本的比例:搜集更多的小类数据 / 删减一些大集数据
  2. 使用其他评价指标
    1. 混淆矩阵(Confusion Matrix):使用表格对分类器所预测的类别与其真实的类别的样本统计,分别计算TP、FP、TN、FN。
    2. 精确度(Precision)
    3. 召回率(Recall)
    4. F1-score:精确度与召回率的加权平均
    5. kappa
    6. ROC曲线
  3. 重采样:过采样(小类重复取样),欠采样(大类减少采样)
    Tricks: 尝试随机采样与非随机采样;考虑不用的采样比例;考虑同时使用过采样与欠采样
  4. 人工产生数据样本:SMOTE(Synthetic Minority Over-sampling Technique)是一种过采样算法,它构造新的小类样本而不是产生小类中已有样本的副本。基于距离度量选择小类别下两个或者更多相似样本,选择其中一个样本,并随机选择一定鼠来那个的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性,这样就构造了更多的新生数据。Python:UnbalancesDataset
  5. 不同分类算法:“Why you should be spot-checking algorithms on your Machine Learning Problems”
  6. 对模型进行惩罚:你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
      Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。
      如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。
  7. 新的角度理解问题:如果把小类样本作为异常点(outliers),问题将回转化为异常点检测与变化趋势检测问题。
  8. 尝试创新:“In classification, how do you handle an unbalanced training set?”

猜你喜欢

转载自blog.csdn.net/AG9GgG/article/details/88029906