数据不平衡的相关

摘要:
大多数常见的机器学习算法不能很好地处理不平衡的数据集。例如,搜索引擎的点击预测(点击页面往往占很小的比例)、电子商务中的产品推荐(正在购买的推荐产品的比例很低)、信用卡欺诈检测、网络攻击识别、癌症检测等。处理数据不平衡的方法主要有以下几种。2.数据级别2.1重新采样2.1.1欠采样(下采样)欠采样通过减少丰富类的大小来平衡数据集。它试图通过增加稀有样本的数量来平衡数据集。

数据不平衡的数据处理

1. 前言

什么是不平衡数据呢?顾名思义即我们的数据集样本类别比例不均衡。数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时,以总体分类准确率为学习目标的传统分类算法会过多地关注多数类,从而使得少数类样本的分类性能下降。绝大多数常见的机器学习算法对于不平衡数据集都不能很好地工作。

   

1.1 数据不平衡例子

不平衡数据的场景出现在互联网应用的方方面面,如搜索引擎的点击预测(点击的网页往往占据很小的比例)、电子商务领域的商品推荐(推荐的商品被购买的比例很低)、信用卡欺诈检测、网络攻击识别、癌症检测等等。

   

主要有以下几种处理数据不平衡的方法

   

2. 数据层面

2.1 重采样

2.1.1 欠采样(下采样)

欠采样是通过减少丰富类的大小来平衡数据集,当数据量足够时就该使用此方法。通过保存所有稀有类样本,并在丰富类别中随机选择与稀有类别样本相等数量的样本,然后根据平衡的新数据集以进一步建模。

   

2.1.2 过采样(上采样)

当数据量不足时主要使用过采样,它尝试通过增加稀有样本的数量来平衡数据集,而不是去除丰富类别的样本的数量。通过使用重复、自举或合成少数类过采样等方法(SMOTE)来生成新的稀有样品。

   

2.2 增加权值

首先根据代价敏感学习,学习一个合理的类别样本分布比例(相当于不同类别的权值)。然后将大类样本随机划分成一系列不相交子集。这些子集的大小由稀有类样本集的数量和预先学习的样本分布比例决定。接下来分别将这些不相交子集跟稀有类样本结合,组成一系列平衡的分类子问题,单独训练成子分类器。最后将这些子分类器的输出进一步学习成组合分类器。这种方法在信用卡非法使用检测问题上大大降低了总代价。


3. 算法层面

集成方法

平衡随机森林的方法,该方法对正类和反类分别进行重采样,重采样多次后采用多数投票的方法进行集成学习。

将boosting算法与SMOTE算法结合成SMOTEBoost算法,该算法每次迭代使用SMOTE生成新的样本,取代原有AdaBoost算法中对样本权值的调整,使得Boosting算法专注于正类中的难分样本。

代价敏感方法

在大部分不平衡分类问题中,稀有类是分类的重点。在这种情况下,正确识别出稀有类的样本比识别大类的样本更有价值。反过来说,错分稀有类的样本需要付出更大的代价。代价敏感学习赋予各个类别不同的错分代价(Cost),它能很好地解决不平衡分类问题。以二分类问题为例,假设正类是稀有类,并具有更高的错分代价,则分类器在训练时,会对错分正类样本做更大的惩罚迫使最终分类器对正类样本有更高的识别率。如Metacost和Adacost等算法。

其他方法

一分类(One Class Learning或异常检测(Novelty Detection)

对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。调整SVM以惩罚稀有类别的错误分类。

   

4.处理的经验

在正负样本都非常之少的情况下,应该采用数据合成的方式;

在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法(癌症检测);

在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。

   

   

   

数据不平衡的分类器评价指标

  1. 分类器评价指标

1.1 混淆矩阵

在数据不平衡的分类任务中,我们不在使用准确率当作模型性能度量的指标,而是使用混淆矩阵、精准率、召回率、F1值当作模型的性能度量指标。

数据不平衡的相关第1张

  • TP(True Positive):真实是正例,预测也为正例的情况(预测对的部分)
  • FP(False Positive):真实是反例,预测为正例的情况(预测错的部分)
  • FN(False Negative):真实是正例,预测为反例的情况(预测错的部分)
  • TN(True Negative):真实是反例,预测也为反例的情况(预测对的部分)

   

精准率P

数据不平衡的相关第2张

召回率R

数据不平衡的相关第3张

F1值

F1值是精准率和召回率的调和平均值。两个数值的调和平均更加接近两个数当中较小的那个,因此如果要使得F1很高的话那么精准率和召回率都必须很高。

数据不平衡的相关第4张

F值的一般情况

数据不平衡的相关第5张

PR曲线

精准率和召回率是一个对矛盾的变量。一般精准率(查准率)高,召回率(查全率)就会降低,精准率降低,召回率就会偏高。所以我们可以通过PR曲线来寻找精准率和召回率的平衡点。我们一般可以通过改变分类的阈值来对一个模型的一组结果进行绘制PR曲线。比如针对逻辑回归的一组概率,通过设置阈值分别小于[0,0.1,0.2,...,0.8,0.9,1],来分别计算精准率和召回率,然后绘制出曲线。

数据不平衡的相关第6张

如上图所示,曲线B完全包住了曲线C,我们说曲线B的模型比曲线C的模型要好。

如上图所示的平衡点,基本就是自身曲线的精准率和召回率的平衡的地方,由于这个平衡点比较难评估,所以这时候用F1来近似平衡点。

1.2 ROCAUC

ROC曲线和PR曲线的原理非常相似,绘制的方式也是通过改变分类的阈值。不同的地方是,ROC是以FPR为X轴和TPR为Y轴进行绘制。PR是以R为X轴,P为Y轴进行绘制。

FPR(False Positive Rate)

数据不平衡的相关第7张

   

TPR(True Positive Rate)

可以从下公式看出,TPR和召回率是一样的。

数据不平衡的相关第8张

数据不平衡的相关第9张

   

ROC曲线评价标准是,越靠近左上角,模型效果越好。我们用ROC包住的面积叫做AUC,用AUC的大小来衡量模型的优劣。

1.3 代价敏感学习

代价敏感的学习方法是机器学习领域中的一种新方法,它主要考虑在分类中,当不同的分类错误会导致不同的惩罚力度时如何训练分类器。例如在医疗中,"将病人误诊为健康人的代价"与"将健康人误诊为病人的代价"不同;在金融信用卡盗用检测中,"将盗用误认为正常使用的代价"与将"正常使用误认为盗用的代价"也不同。

通常,不同的代价被表示成为一个N×N的Cost矩阵中,其中N是类别的个数。costijcostij表示将一个i类的对象错分到j类中的代价。代价敏感分类就是为不同类型的错误分配不同的代价,使得在分类时,高代价错误产生的数量和错误分类的代价总和最小。

数据不平衡的相关第10张

加入了代价矩阵后,错误率的公式改为如下:

数据不平衡的相关第11张

   

1.4 绘制正例代价曲线

代价曲线的X轴是取值[0,1]的正例概率代价,计算方式如下,其中p是正例的概率:

数据不平衡的相关第12张

代价曲线的Y轴是取值为[0,1]的归一化代价,FNR是假反例率,FPR是假正例,公式如下:

数据不平衡的相关第13张

   

ROC曲线上的每一点对应了代价平面上的一条线段,设ROC曲线上的点的坐标为(TPR,FPR),则可以计算出FNR,然后在代价平面上绘制一条从(0,FPR)到(1,FNR)的直线,直线下的面积代表该条件下的期望总体代价;将ROC上的点全都转换为直线,然后取所有线段下界,围城的面积即为在所有条件下的学习器的期望总体代

数据不平衡的相关第14张

免责声明:文章转载自《数据不平衡的相关》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇element 导航菜单 控制路由跳转unity, 设置帧率上限下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

[DotnetSpider 系列目录] 一、初衷与架构设计 二、基本使用 三、配置式爬虫 四、JSON数据解析与配置系统 五、如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JAVA、PYTHON,甚至于还有NODEJS,C++;再或者去开源中国查询C#的爬虫项目,仅有几个非常简单或是几年没有更新的项目。 而单...

JavaScript核心之事件详解(EventTarget接口,js事件传播,Event对象)

事件是一种异步编程的实现方式,本质上是程序各个组成部分之间传递的特定消息。DOM支持大量的事件,本节介绍DOM的事件编程。 1 EventTarget接口DOM的事件操作(监听和触发),都定义在EventTarget接口。Element节点、document节点和window对象,都部署了这个接口。此外,XMLHttpRequest、AudioNode、A...

fso操作大全

FSO操作大全2007-03-19 16:50如何删除一个文件 [JScript] function DeleteFile(filespec) { var fso; fso = new ActiveXObject("Scripting.FileSystemObject"); fso.DeleteFile(filespec); } [VBSc...

【菜鸟学php】小菜鸟由帝国备份王在Wamp环境下打开500错误浅谈PHP程序员

===================问题情况描述=================== 小弟一直在玩discuz论坛开源程序,这个论坛程序经常涉及到论坛搬家的问题。 今天我在本地Wamp环境下,用开源软件帝国备份王2010进行数据库备份数据,结果打开发现报错500! 这真是坑爹了,回想下以前自己使用这个开源程序进行备份也不下于十几次了,大部分都正常成功,...

mysql灾备演练问题

前期写的mysql热备份脚本恢复,还没有正式用到过,但是今天演练灾备恢复,但是遇到几个问题。 测试环境: 搭建mysql,安装xtrabackup vim /etc/yum.repos.d/Percona.repo [percona] name = CentOS $releasever - Percona baseurl=http://repo.per...

C# DataTable 操作

添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空表 DataTable dt = new DataTable("Table_New"); 创建列 //1.创建空列 DataColumn dc = new DataColum...