优化机器学习不平衡数据集技巧

什么是不平衡数据

不平衡对于分类问题来说是指数据集中样本的类别不平均。

比如, 对于一个样本总数为100的二分类问题来说,80个样本被标为类别1,剩下的20个样本被标为类别2.这是一个不平衡的数据集,因为类别1比类别2的样本总数为4:1.

不仅仅是二分类问题有类别不平衡问题,多分类问题也存在类别不平衡的问题。

不平衡问题很常见

大部分的分类数据集中各类别的样本总数不会绝对一样,但是稍稍有一些差别无妨。

比如,描述欺诈性交易的数据集是不平衡的。绝大多数的交易记录是“正常”,只有很小一部分是“欺诈”。

另一个例子是顾客流失(customer churn)数据集,绝大多数的顾客不会流失,只有一小部分顾客会取消订阅(“流失”)。

当类别不平衡的的比例比较大时,比如接近4:1,不平衡就会导致机器学习算法出问题。

把所有的结果都归为一类

当模型训练不平衡数据集的时候会发生什么?

就如你可能会猜想的那样,在不平衡数据集上我们仍然可能会得到很高的准确率。若90%的样本是类别1,那么模型的准确率就会接近90%。因为先验概率决定一个样本被标为类别1的概率是90%,所以模型就会总是将样本标为类别1并得到高的准确率。

处理不平衡数据集的八大策略

  1. 能否收集更多的数据? 你可能会认为这很可笑,但是收集更多的数据这一方法总是会被忽略。 更大的数据集可能会揭示一些与原数据集不同的地方,甚至可能会降低原数据集的不平衡性。 同时,更多的小类别数据对于数据集的重采样也很有用。

  2. 改变你的评价方式 当数据集不平衡时,准确率(召回率,F1值)的评价方法不再适用。 建议用一下两种评价方法:

      - Kappa(Cohen's kappa):使用数据集的不平衡性来归一化accuracy。
      - ROC曲线:正如准确率和召回率一样,accuracy被分成灵敏度(sensitivity)和特异度(specificity),根据这些平衡的阈值来选择模型。
    
  3. 数据重采样 改变训练集来获得更平衡的数据。这种技术叫做数据采样,有两种主流的方式来平衡数据:
    1. 过采样,增加小样本类别的复制样本。
    2. 欠采样,删除一些大样本类别的数据。

    实际上,对于不平衡数据集我建议你以上两种方法都试一试,有可能对于不同的评价方法两种方法的提升效果不一样。 一些tips:

    1. 对于大数据集建议使用欠采样方法(tens- or hundreds of thousands of instances or more)。
    2. 对于小数据集建议采用过采样方法(tens of thousands of records or less)。
    3. 可以使用随机或非随机(分层抽样)采样算法。
    4. 可以使用不同的重采样率(比如:对于二分类问题,不一定要使两者之比为1:1,可以使用其他比率)
  4. 生成人造数据 生成人造数据的一种简单方式是随机采样小样本类别中的属性值。 有一些系统性的算法可以用来生成人造样本。最著名的算法时SMOTE算法又叫Synthetic Minority Over-sampling Technique。 SMOTE是一种过采样的算法,它通过生成人造数据而不是赋值原有样本来增加小类别的样本数。SMOTE选择两个或更多相似的样本(使用距离度量),然后每次随机改变一个样本的一个属性值。The algorithm selects two or more similar instances (using a distance measure) and perturbing an instance one attribute at a time by a random amount within the difference to the neighboring instances.

  5. 使用不同的算法 我强烈建议你不要将一个喜欢的算法应用于所有问题。对于一个待解决的问题,你应该至少使用不同的算法做抽样。 一般来说,决策树算法在不平衡数据集中也有良好表现。在生成树的过程中,分裂规则能使所有的类别都被考虑到。 你可以试试一些著名的决策树算法,比如C4.5,C5.0,CART及随机森林等。
  6. 使用惩罚模型 你也可以使用相同的模型但是可以从不同的角度来解决问题。 惩罚分类算法在训练阶段误判一个少类别的样本时会强制增加额外的代价。这些惩罚措施可以使模型更多地关注少类别的样本。 通常类别的惩罚系数或权重由学习算法决定。有一些惩罚算法像penalized-SVM和penalized-LDA。 惩罚模型也有通用的框架。比如,weka里就有CostSensitiveClassifier模块,它可以内嵌所有的分类器并使用一个用户设置的惩罚矩阵。 当你必须要使用一种特定的算法或者不能重采样或者得到的结果不好时,你可以使用惩罚措施。它提供了另一种方法来平衡数据集。设置惩罚矩阵可能会比较复杂。你可以试试不同的惩罚方案看看哪种更适合你的问题。

  7. 换一个角度看问题 有一些领域是专注于研究不平衡数据集的。他们有自己的算法,评价方法和术语。 看看这些内容,并从他们的视角出发来试着解决自己的问题有些时候能够获得新的想法。 有两个算法你可能会用到异常检测(anomaly detection)和变化检测(change detection)。 异常检测是检测小概率事件。这可能是一个机器故障或者一个程序的恶意行为。这些行为对于正常的操作来说是小概率事件。 从这个角度来说,可以把小样本类别当做异常点,这可能为你分离和识别样本带来新的思路。 变化检测与异常检测很相似不过它检测的不是一场而是变化或者不同。这可能是一个用户行为的变化比如使用模式或是银行交易。 以上的两个问题使用更多的实时信息(时序)来进行分类。

  8. 让创意迸发吧! 深入探索你的问题并试着把它分解成可以更容易解决的子问题。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by wanghan0501,分享从这里开始,精彩与您同在

Table of Contents