这篇文章将为大家详细讲解有关R语言项目中出现数据不平衡如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
一项目环境
开发工具:RStudio
R: 3.5.2
相关包:dplyr,玫瑰,DMwR
二,什么是数据不平衡?为什么要处理数据不平衡?
首先我们要知道的第一个问题就是“什么是数据不平衡”,从字面意思上进行解释就是数据分布不均匀。在我们做有监督学习的时候,数据中有一个类的比例远大于其他类,或者有一个类的比值远小于其他类时,我们就可以认为这个数据存在数据不平衡问题。
那么这样的一个问题会对我们后续的分析工作带来怎样的影响呢?我举个简单的例子,或许大家就明白了。
假设我们现在需要训练一个模型来分辨人群中那个人是恐怖分子。那么现在给到我们1万个人员的数据,在做分析之前其实我们就很清楚,一群人中恐怖分子的比例肯定是要远小于普通人的比例的。
那么假如在这1万个人中只有一个是恐怖分子,那么恐怖分子与正常人的比例就是9999:1 .
那么如果我们不进行任何处理就直接进行有监督学习的话,那么模型只需要将所有人数据都分类为正常的人,模型的准确率就能达到99.99%。而这样的模型显然是没有意义的。
因为基本上说有可能存在的恐怖分子的特征基本都被模型给忽略了,这也就说明了为什么要处理数据不平衡问题。
三,常见的数据不平衡处理方法
以下是几种比较常见的处理数据不平衡的方法:
1,欠采样法(采样)
2,过采样法(过采样)
3人工数据合成法(合成数据生成)
4代价敏感学习法(谈心敏感学习)
【注】:本文主要以实现为主,因此不对上述方法进行过多的讲解。
在处理数据之前,我们先看一下需要处理的数据分布的情况。
负载(“C:/用户/用户/桌面/data.RData") 美元分类表(数据) prop.table(表(数据分类美元))
比;表(数据分类美元)
8 1 2 3 4 5
12 104 497 1158 4817 1410
比;prop.table(表(数据分类美元))
8 1 2 3 4 5
0.001500375 0.013003251 0.062140535 0.144786197 0.602275569 0.176294074
引用><强> 1,欠采样强>
# # # # # # # # #,方法一,# # # # # # # # # 库(玫瑰) #,由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类 #,进行平衡(转化为二分类问题) test & lt;作用;数据((数据classification 美元;==,8,|,数据classification 美元;==,4),) #,将分类结果转化为因子型(不然会报错) 测试classification 美元;& lt;安康;as.factor(测试分类美元) #,进行欠采样 #,其中,method =,“under",表示采用的方法为“欠采样”=#,N 40,表示最终整个数据集的数量 #,seed 随机种子,为了保留对样本的追踪 under & lt;作用;ovun.sample (classification ~,,,,, method =,“under",, N =, 40岁,seed =, 1)元数据 #,查看结果 表(美元以下分类)比;表(美元以下分类)
4 8
28日12
引用># # # # # # # # #,方法二,# # # # # # # # # 库(dplyr) #,由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类 #,进行平衡(转化为二分类问题) test & lt;作用;数据((数据classification 美元;==,8,|,数据classification 美元;==,4),) #,提取大比例类 test1 & lt;作用;测试((==测试classification 美元;4),) #,将大比例类的数量降为12个 down & lt;作用;sample_n (test1, 12日,replace =,真的) #,将欠采样后的类进行合并 down & lt;作用;rbind(测试[这(测试classification 美元;==,8),,),向下) 表(美元分类)比;表(美元分类)
8 4
12 12
引用>【注】:欠采样是无放回的采样。
<强> 2,过采样强>
# # # # # # # # #,方法一,# # # # # # # # # 库(玫瑰) test & lt;作用;数据((数据classification 美元;==,8,|,数据classification 美元;==,4),) 测试classification 美元;& lt;安康;as.factor(测试分类美元) #,实现上大致与欠采样相同,只有类型,method 改成了,“over",同时没有限制总数量 under & lt;作用;ovun.sample (classification ~,,,,, method =,“over",, seed =, 1)元数据 表(美元以下分类)R语言项目中出现数据不平衡如何解决