数据不平衡的解决办法

转载自:https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html

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

1.1. 欠采样

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

1.2. 过采样

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

注意到欠采样和过采样这两种方法相比而言,都没有绝对的优势。这两种方法的应用取决于它适用的用例和数据集本身。另外将过采样和欠采样结合起来使用也是成功的。

使用过采样方法来解决不平衡问题时应适当地应用交叉验证

对于欠采样,由于采样的样本要少于原样本集合,因此会造成一些信息缺失,未被采样的样本往往带有很重要的信息,模型只学到了总体模式的一部分。

对于过采样,由于需要对少数类样本进行复制因此扩大了数据集,造成模型训练复杂度加大,另一方面也容易造成模型的过拟合问题。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合。

转化为一分类问题

对于二分类问题,如果正负样本分布比例极不平衡,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等,如下图所示:

One Class SVM 是指你的训练数据只有一类正(或者负)样本的数据, 而没有另外的一类。在这时,你需要学习的实际上你训练数据的边界。而这时不能使用最大化软边缘了,因为你没有两类的数据。 所以呢,在这边文章中,“Estimating the support of a high-dimensional distribution”, Sch?lkopf 假设最好的边缘要远离特征空间中的原点。左边是在原始空间中的边界,可以看到有很多的边界都符合要求,但是比较靠谱的是找一个比较紧的边界(红色的)。这个目标转换到特征空间就是找一个离原点比较远的边界,同样是红色的直线。当然这些约束条件都是人为加上去的,你可以按照你自己的需要采取相应的约束条件。比如让你data 的中心离原点最远。

说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。

4、组合不同的重采样数据集

成功泛化模型的最简单方法是使用更多的数据,问题是像逻辑回归或随机森林这样开箱即用的分类器,倾向于通过舍去稀有类来泛化模型。一个简单的最佳实践是建立n个模型,每个模型使用稀有类别的所有样本和丰富类别的n个不同样本。假设想要合并10个模型,那么将保留例如1000例稀有类别,并随机抽取10000例丰富类别。然后,只需将10000个案例分成10块,并训练10个不同的模型。

如果拥有大量数据,这种方法是简单并且是可横向扩展的,这是因为可以在不同的集群节点上训练和运行模型。集合模型也趋于泛化,这使得该方法易于处理。

5、用不同比例重新采样

方法4 可以很好地将稀有类别和丰富类别之间的比例进行微调,最好的比例在很大程度上取决于所使用的数据和模型。但是,不是在整体中以相同的比例训练所有模型,所以值得尝试合并不同的比例。如果10个模型被训练,有一个模型比例为1:1(稀有:丰富)和另一个1:3甚至是2:1的模型都是有意义的。一个类别获得的权重依赖于使用的模型。

6、多模型Bagging

方法5 虽然能够选出最好的样本数据比例。但是它的鲁棒性不能够保证:它的鲁棒性取决于测试集样本的选取

为了解决上述方法的缺陷,增加模型鲁棒性。为此,我本人在 随机森林算法 思想的启发下,想出了在上述方法的基础上,将不同比例下训练出来的模型进行 多模型Bagging 操作,具体的步骤如下:

1. 对两类样本选取 N 组不同比例的数据进行训练并测试,得出模型预测的准确率:

P={ P| i=1,2,...N }

2. 对上述各模型的准确率进行归一化处理,得到新的权重分布:

Ω={ ω| i=1,2,...N }

其中:

3. 按权重分布 Ω 组合多个模型,作为最终的训练器:

● 对于分类任务:

● 对于回归任务:

7、集群丰富类

Sergey Quora提出了一种优雅的方法,他建议不要依赖随机样本来覆盖训练样本的种类,而是将r个群体中丰富类别进行聚类,其中r为r中的例数。每个组只保留集群中心(medoid)。然后,基于稀有类和仅保留的类别对该模型进行训练。

7.1. 对丰富类进行聚类操作

首先,我们可以对具有大量样本的丰富类进行聚类操作。假设我们使用的方法是 K-Means聚类算法 。此时,我们可以选择K值为稀有类中的数据样本的个数,并将聚类后的中心点以及相应的聚类中心当做富类样本的代表样例,类标与富类类标一致。

7.2. 聚类后的样本进行有监督学习

经过上述步骤的聚类操作,我们对富类训练样本进行了筛选,接下来我们就可以将相等样本数的K个正负样本进行有监督训练。如下图所示:

8、设计适用于不平衡数据集的模型

所有之前的方法都集中在数据上,并将模型保持为固定的组件。但事实上,如果设计的模型适用于不平衡数据,则不需要重新采样数据,著名的XGBoost已经是一个很好的起点,因此设计一个适用于不平衡数据集的模型也是很有意义的。

通过设计一个代价函数来惩罚稀有类别的错误分类而不是分类丰富类别,可以设计出许多自然泛化为稀有类别的模型。例如,调整SVM以惩罚稀有类别的错误分类。

原文地址:https://www.cnblogs.com/bafenqingnian/p/8809863.html

时间: 2024-11-06 11:09:38

数据不平衡的解决办法的相关文章

sql取出某一列不重复数据的ID解决办法

取出某一列不重复数据的ID表A有ID,BID,ITime三列BID可能会有重复的现在要从A表根据ITime降序排序取出ID来,且如果BID重复就只取第一条数据的ID应该如何实现?------解决方案-------------------- 如果id是递增的select min(id),BID,max(date)from tbl group by BID sql取出某一列不重复数据的ID解决办法,布布扣,bubuko.com

ORACLE数据删除数据删除的解决办法

今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法.(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接找回删除的数据具体步骤为: *确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间点) *用以下语句找出删除的数据:sele

Linux下Tomcat向MySQL插入数据中文乱码解决办法

Linux下Tomcat向MySQL插入数据中文乱码解决办法 一.问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 二.解决办法 1.尝试一直接在linux上面使用insert语句插入中文,正常2.尝试二在tomcat配置文件server.xml中加入useBodyEncodingForURI="true",不行3.尝试三在tomcat配置文件server.xml中再加入URIEncodin

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法     同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安装网络打印机死活安装不上,提示“数据无效”.百度了下找到了解决办法:https://jingyan.baidu.com/article/a948d6513ef4200a2ccd2e50.html 右击桌面上我的电脑→管理→服务→把device install service和device setup

C#使用ListView更新数据出现闪烁解决办法

在使用vs自动控件ListView控件时候,更新里面的部分代码时候出现闪烁的情况 如图: 解决以后: 解决办法使用双缓冲:添加新类继承ListView 对其重写 1 public class DoubleBufferListView : ListView 2 { 3 public DoubleBufferListView() 4 { 5 SetStyle(ControlStyles.DoubleBuffer | 6 ControlStyles.OptimizedDoubleBuffer | 7

EasyUI的treegrid组件动态加载数据问题的解决办法

http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————————————————————— 最近涉及到treegrid组件的查询,需要根据查询条件动态更新EasyUI的treegrid组件的动态加载查询结果 搜遍了treegrid源码和文档发现treegrid是扩展自datagrid和tree的,不过以往利用datagrid的reload方法加参数的 方式

iOS用SegmentController来切换tableView的时候 reloadData会造成数据重复创建 解决办法

把在Cell上面创建的控件放在Cell==nil的判断里面,这样,每次进来就会先判断有没有,就可以避免数据重复创建,导致视图越盖越厚 if (cell==nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIDD]; self.inviteLabel=[[UILabel alloc]initWithFrame:CGRectMake(10,5,[UIScr

Hadoop皇-----冠---体育源码搭建与数据倾斜及解决办法

1.增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,皇------冠--------体育源码搭建QQ:2152876294 网址diguaym.com往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率.2.增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partitio

Hadoop皇冠体育源码搭建与数据倾斜及解决办法

1.增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,皇-冠-体-育源码搭建QQ:2152876294 网址diguaym.com往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率.2.增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partition到一个分区,从而一个