zoukankan      html  css  js  c++  java
  • 应对非均衡数据集分类问题的八大策略(转)

    原文在此:8 Trips to Combat Imbalanced Classes in You Machine Learning Dataset  by Jason Brownlee

    当你遇到非均衡数据集的时候,即便是你得到准确率为90%的分类模型,只要你仔细研读你会发现,分类中基本都是某一类。

    Coming To Grips With Imbalanced Data

    常常会有人在邮件中这样问我:

    1. 我在二分类问题中,我的数据集中两种样本之间的比例为60:1,我用逻辑回归模型学习,结果似乎是忽略了另外一类

    2. 我的分类模型中有三种类,假设为A,B,C。但是在训练数据集中,A占比达到70%,B占25%,C占5%,我们的模型达到数情况下对类别A过拟合How should Ido?

    我给出了这样的答复:

    也许将来能解决类似数据失衡的问题,并且这类问题是十分普遍以及迫切的

    Frustration

    非均衡数据集会引发许多问题

    当你在非均衡数据集上做分类的时候,你会发现的到结果即便是再好,她也是是一个谎言

    另一个打击似乎是你查遍所有书籍以及资料,几乎没有介绍如何处理非均衡数据集

    没事!我们有许多选择能解决他们,我们能针对非均衡数据集建立一个预测模型

    What is Imbalanced Data?

    非均衡数据通常指的是在分类问题中,不同类别的样本数不相等

    举例来说,在一个二分类中,我们有100个实例(每一个实例代表一行),其中80个实例为类别1,剩下的20个实例为类别2,这就是一个非均衡数据集,且类别1与类别2 之间的比例为80:20,更简洁的说,4:1.

    在 多分类问题中同样会遇到类似于问题

    为了方便描述,下面我们仅讨论二分类的数据失衡问题。

    Imbalance is Common

    大多数的分类问题中我们不可能找到足够相等的数据,但是仅仅是些许的差异对模型是无影响的。

    数据不平衡是常见的,可预期的。举例来说,在数据集中,像那些描述欺诈交易的数据就是不平衡的,因为绝大多数的交易都是在“非欺诈”类别中交易的,而只有极少数是在“欺诈”类中。

    另一个事例,客户流失数据集,因为绝大多数的客户会留在原来的服务中,即所谓的“No-Churn”(非流失)类别,仅仅有极少数的顾客会取消他们的订单成为流失客户,即所谓的“Churn”类

    当有一个适度不平衡类像上边例子中的4:1的时候,就会引发数据失衡问题

    Accuracy Paradox

    Accuracy Paradox 在维基百科中有详细介绍

    我们常用的评价分类模型的准确性公式,但这样的评价其实是不准确的,因为仅仅是它仅仅是反映了数据潜在的类别分布,原文是(the accuracy is only reflecting the underlying class distribution)

    Put it All On Red

    遇到数据失衡我们能怎么办呢?

    也许你会想到,我们能达到90%的准确率(类别1在数据集中占比为90%),因为我们的模型依据数据,并且非常聪明的决定最好的分类预测是类别1。

    这是用一个基于算法的简单规则看的最清楚。如果你观察最终的模型,你会发现无论什么样的数据,模型偏向于预测某一类

    8 Tactics To Combat Imbalanced Training Data

    在了解数据类别失衡的是什么以及为什么会误导分类精度之后,我们提出下列建议

     1). Can You Collect More Data

    兴许你会觉得愚蠢,但是收集更多数据经常性的被遗忘,你能收集到更多数据吗?经过深思熟虑你会知道是否能收集到更多数据。一个大的数据集可能展现不同的类别,可能会得到一个更加均衡的数据集。当我们对数据集重复采样的时候,小类别的更多实例会更加有用

    2). Try Changing Your Performance Metric -- 改变你的评价指标

    当使用非均衡数据集的时候,准确度不是评价指标。我们已经看到这是一个误导。

    当你使用失衡类别时候,这儿有设计的新标准,告诉你更加真实的模型性能。

    在选择不同的性能措施时,我给了一些建议在我的文章“Classification Accuracy is Not Enough: More Performance Measures You Can Use”,在这篇文章中,我发现失衡数据集:乳腺癌患者的复发特征。从那篇文章,我建议看下面的性能指标,相较于传统分类精度这些指标可以让我们更加深入的了解模型的精度。

    • Confusion Matrix (混淆矩阵):预测细分表,展示正确预测(对角),以及造成的错误预测(哪些类别错误预测被分配)。
    • Precision:精度,衡量一个分类器的准确性
    • Recall:召回,分类完整性
    • F1 Score (F-score):精度与召回的加权平均
    同时还有下面的指标:
    • Kappa (Cohen's Kappa):分类精度通过数据中的失衡类别归一化
    • ROC Curves:想精度、召回,准确性被非为敏感性已经特异性,模型可以通过这些值的平衡的与之来选择

    你能找到更多关于使用ROC曲线的资料在我们的文章“Assessing AndComparing Classifier Performance with ROC Curves”,如果你还是不确定,那么你可以试一试Kappa,他会给你一个好的分类模型

    3). Try Resample Your Dataset

    兴许你可以换一个数据集。这个“换”的意思是”抽样“,这儿有两种主要的方法抽样你的类别

    • 过采样:在少数实例的类别中随机复制实例,添加到该类别中,或者,用更加正式的抽样方式
    • 欠采样:在多数实例的类别中删除一些实例,使得类别相对平衡
    这些方法简单快捷,不失为一个好的方法。事实上,我建议你在你的失衡数据集上尝试这两种方法,仅仅是看看是不是给你一个提升精度的方法。
    你可以在维基百科上查看这篇文章“Oversampling and undersampling in data analysis”,下面是一些经验法则
    • 考虑使用欠采样,当你有很多数据的时候(10万或者几十万或者更多的实例的时候)
    • 考虑使用过采样,当你没有多少实例数据的时候(成千上万的数据)
    • 考虑测试随机和非随机(如,分层)的采样方法
    • 考虑测试不通的重采样率,例如,在二分类问题中,你不必针对1:1,你可以试一试其他比例

    4). Try Generate Synthetic Samples -- 尝试生成合成样本

    一种来生成合成样本的简单方法是,在少数类别样本中随机抽取样本的属性。你可以在数据集中凭经验抽样,也可以运用像贝叶斯方法那样独立的抽取每一个属性,你将会有更多不同的数据,但是属性之间的非线性关系可能会丧失。

    已经有系统算法来生成合成样本,其中比较著名的算法有SMOTE (Synthetic Minority Over-sampling Technique)。正如其名称暗示那样,SMOTE 是一种过采样方法,他的工作原理是从少数类别中创建合成样本,而不仅仅是 copy 一个副本,改算法通过度量距离的方式选择两个或者更多类似的例子,某一时刻通过一个随机量扰动实例属性,然后将干扰过后的样本做差,最后将差值加到某一样本上,得到新样本。

    Learning more about SMOT, see" SMOTE:Synthetic Minority Over-sampling Technology",当然还有很多SMOTE工具包:

    Python “UnbalancedDataset

    R "DMwR package"

    Weka "SMOTE supervised filter"

    5). Try Different Algorithms

    想往常一样,我建议你不要在每一个问题上使用你最喜欢熟悉的算法,在给定的问题上你至少应该逐点检验不同类型的算法,更多逐点检验算法,参见“Why you should be Spot-Checking Algorithms on your machine Learning Problems”。

    话虽这么说,决策树在非平衡数据集上表现的很好,取决于创建树的类别变量的分类规则能够驱使解决所有类别问题。如果你怀疑,试试常用的决策树算法:C4.5,C5.0,CART以及随机森林。

    一些例子:R code “Non-Linear Classification in R with Decision Tree

    CART in Python "Get Your Hands Dirty With Scikit-Learn Now "

    6). Try Penalized Models -- 尝试惩罚模型

    你也可以使用相同的算法,但是用不同的视角看待问题。

    在训练阶段,我们在少数样本中的误分类上加一个额外的惩罚因子,这些惩罚可以偏置模型使得其更加注重少数类别。

    往往权重或者惩罚是专门为学习算法设定的,比如惩罚SVM,惩罚LDA

    另外也可以用通用的惩罚框架,比如,Weka中有一个CostSensitiveClassifier,他可以调用任何分类器,以及可以自定义惩罚矩阵。

    使用惩罚是可取的,当你被限定在某一个算法之中,或者你无法采样,或者采样之后得到的效果较差。他提供了另外一种方式来平衡数据类别,当然设定惩罚矩阵比较复杂,你可以尝试各种不同的惩罚方式,从中选取效果较好的模型。

    7). Try a Different Perspective -- 尝试不同的视角

    非平衡数据集的分类问题一直是一个研究领域,他们有自己的算法,措施以及术语。有两个你需要考虑的观点:异常检测 (anomaaly detection)、变化检测 (change detection)

    anomaaly detection  属于罕见事件的检测,

    change detection  类似于anomaaly detection,不同于寻找异常,他寻找变化以及差异

    8). Try Getting Creative -- 尝试创新

    认真思考你的问题,考虑是否可以将其拆分为类似的小问题。这样原问题就容易处理的多。这儿是一篇参考文献“In classification, how do you handle an unbalanced training set?”。

    比如:

    将你的大类别分解成多个小数据量类别

    使用单类检测器

    采样非平衡数据集得到的任然是一个非平衡数据集,但是,可以设计一系列的分类器(分类器集合),这样产生的效果比单个分类器效果要好很多。

    转自:http://blog.csdn.net/coder_oyang/article/details/48009493

    ---------------------------------------------------------------------------------- 数据和特征决定了效果上限,模型和算法决定了逼近这个上限的程度 ----------------------------------------------------------------------------------
  • 相关阅读:
    1.1 git和github -1 介绍
    seajs使用
    seajs使用-1 解决冲突和依赖
    6. 菜单切换
    5. 背景半透明 元素不透明(兼容所有浏览器)
    4. 父元素如何包含子元素
    3. js 多维数组转为一维数组
    2. 伪数组转为数组 Array.prototype.slice.call(arguments)
    3. 伪元素清除最后一个border的边框
    2. 详解 CSS 属性
  • 原文地址:https://www.cnblogs.com/payton/p/6008219.html
Copyright © 2011-2022 走看看