zoukankan      html  css  js  c++  java
  • 如何处理不均衡数据

    定义

    以二分类问题为例,假设我们的数据集是S,数据集中的多数类为S_maj,少数类为S_min,通常情况下把多数类样本的比例为100:1,1000:1,甚至是10000:1,这种情况下为不平衡数据,不平衡数据的学习即需要在如此分布不均匀的数据集中学习到有用的信息。

    问题:不均衡的数据理解预测起来很简单,永远都是预测多的数据的那一方,这样准没错,特别是数据多很多的情况的那一方,比如多的占了90%,少的占10%.只要每一次都预测多的那一批数据,预测的准确性就可以达到90%了。

    为什么类不平衡是不好的

    1.从模型的训练过程来看

    从训练模型的角度来说,如果某类的样本数量很少,那么这个类别所提供的“信息”就太少。

    使用经验风险(模型在训练集上的平均损失)最小化作为模型的学习准则。设损失函数为0-1 loss(这是一种典型的均等代价的损失函数),那么优化目标就等价于错误率最小化(也就是accuracy最大化)。考虑极端情况:1000个训练样本中,正类样本999个,负类样本1个。训练过程中在某次迭代结束后,模型把所有的样本都分为正类,虽然分错了这个负类,但是所带来的损失实在微不足道,accuracy已经是99.9%,于是满足停机条件或者达到最大迭代次数之后自然没必要再优化下去,训练结束,于是模型没有学习到如何去判别出少数类。

    2.从模型的预测过程来看

    考虑二项Logistic回归模型。输入一个样本X ,模型输出的是其属于正类的概率y^ 。当 y^ > 0.5 时,模型判定该样本属于正类,否则就是属于反类。

    为什么是0.5呢?可以认为模型是出于最大后验概率决策的角度考虑的,选择了0.5意味着当模型估计的样本属于正类的后验概率要大于样本属于负类的后验概率时就将样本判为正类。但实际上,这个后验概率的估计值是否准确呢?

    从几率(odds)的角度考虑:几率表达的是样本属于正类的可能性与属于负类的可能性的比值。模型对于样本的预测几率为 y^/(1-y^) 。

    模型在做出决策时,当然希望能够遵循真实样本总体的正负类样本分布:设 N等于正类样本数除以全部样本数,那么样本的真实几率为N/(1-N) 。当观测几率大于真实几率时,也就是y^ >0 时,那么就判定这个样本属于正类。

    虽然我们无法获悉真实样本总体,但之于训练集,存在这样一个假设:训练集是真实样本总体的无偏采样。正是因为这个假设,所以认为训练集的观测几率 n^/(1-n^) 就代表了真实几率n/(1-n) 。

    解决方法

    方法1:想办法获取更多的数据

    首先我们要想一想我们是否可以获取更多的数据,有的时候我们在获取数据的前期,通常数据会呈现一个变化的趋势,这时候表现为某一种数据量偏多,等到数据的后半段的时期,数据的变化的趋势可能就会不一样了。

    如果没有获取后半期的数据,从整体来看,预测就可能不会那么的精准.所以想办法获得更多的数据有可能会改善这个情况~

    方法2:换一种评判方式

    通常情况下,我们会使用准确率(Accuracy)和误差(Cost)两种方式来判断机器学习的成果.但是在不均衡的数据面前,高的准确率和低的误差就显得没有那么有用和重要了.

    所以我们就可以换个方式去计算,很多时候我们会使用Confusion Matrix去计算Precision&Recall,然后在通过Precision&Recall去计算F1 Score(or F-score).通过这样的数据,我们可以很大程度上去区分不均衡数据,并且可以给出更好的分数.

    方法3:重组数据

    这中方法相对来说最为简单粗暴,对不均衡的数据进行重新组合,使之均衡。第一种方式是复制少数数据里的样本,使其可以达到和多数数据样本差不多的数量,也就是过采样。第二种方式就是对多数样本的数据进行开刀,砍掉一些多数样本的数据,还是使两者的数量差不多 ,即欠采样方法。

    但是,简单粗暴的去处或者增加数据容易改变原有分布,降低模型泛化能力,需要考虑到数据的分布。

    随机过采样: 从少数类样本中随机重复有放回的抽取样本以得到更多样本。

    缺点: 对少数类样本多次复制,扩大了数据规模,增加了模型复杂度,容易过拟合。
    解决办法: SMOTE算法
    简单来说,就是对少数类每一个样本x,从他在少数类样本的K近邻中随机选一个样本y,然后在x和y的连线上随机选取一点作为新的合成的样本。这种方法避免了复制少数类样本,增加了样本的多样性,可以降低过拟合的风险。
    但是这种方法会增大类间重叠度,并且会产生一些不能提供有效信息的样本。为此出现了Borderline-SMOTE(只给那些处在分类边界上的少数类样本合成新样本),ADASYN(给不同的少数类样本合成不同个数的新样本)

    随机欠采样:从多数类样本中随机的有放回(或无放回)选取较少的样本。
    缺点:丢弃一部分样本,可能会损失部分有用信息,造成模型只学到整体模式的一部分。
    解决办法:Easy Ensemble算法
    每次从多数类随机抽取一个子集,和少数类训练一个分类器;重复若干次,得到多个分类器,最终的结果是多个分类器的融合。
    Balance Cascade算法
    级联结构,在每一级中从多数类中随机抽取子集,和少数类训练该级的分类器,然后从多数类样本中剔除掉当前分类器能正取识别的样本,继续下一级的操作,重复若干次,最后的结果也是各级分类器的融合。

    实际上,经常用到的数据扩充方法也是一种过采样,对样本进行一些噪声扰动或变换(裁剪,翻转,加光照等等)

    方法4:使用其他的机器学习方法

    在使用一些机器学习的方法中,比如神经网络,在面对不均衡数据的时候都是束手无策的,但是像决策树这样的方法就不会受到不均衡数据的影响

    方法5:修改算法

    在所有方法中,最具有创造力的方法莫过于这个修改算法了,如果你使用的是Sigmoid函数,他会有一个预测的门槛,如果低于门槛,预测的结果为梨,如果超过了门槛,预测的结果为苹果。

    不过因为现在梨的数量过多,这个时候我们就需要调整下门槛的位置,使得门槛更加的偏向于苹果这一边,只有数据非常准确的情况下,模型才会预测为苹果,从而使机器学习学习到更好的效果.

    此外,还可以改变模型训练时的目标函数;也可以将问题转化为单类学习。

  • 相关阅读:
    看某视频开始做LINUX笔记的第一天
    shell作业01
    学习shell的第一天
    学python的第三天
    【安全】573- 大前端网络安全精简指南手册
    【JS】572- JS 经典实例收集整理
    【Vuejs】571- Vue 虚拟DOM和Diff算法源码解析
    【JS】570- 揭开 JavaScript 引擎的面纱
    【JS】569- 如何避免这4类 JavaScript 内存泄漏?
    【拓展】如何在Gihub上面精准搜索开源项目?
  • 原文地址:https://www.cnblogs.com/shona/p/12165786.html
Copyright © 2011-2022 走看看