文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

R语言中数据不平衡如何解决

2023-06-15 05:28

关注

R语言中数据不平衡如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、项目环境

开发工具:RStudio

R:3.5.2

相关包:dplyr、ROSE、DMwR

二、什么是数据不平衡?为什么要处理数据不平衡?

首先我们要知道的第一个问题就是“什么是数据不平衡”,从字面意思上进行解释就是数据分布不均匀。在我们做有监督学习的时候,数据中有一个类的比例远大于其他类,或者有一个类的比值远小于其他类时,我们就可以认为这个数据存在数据不平衡问题。

那么这样的一个问题会对我们后续的分析工作带来怎样的影响呢?我举个简单的例子,或许大家就明白了。

假设我们现在需要训练一个模型来分辨人群中那个人是恐怖分子。那么现在给到我们1万个人员的数据,在做分析之前其实我们就很清楚,一群人中恐怖分子的比例肯定是要远小于普通人的比例的。

那么假如在这1万个人中只有一个是恐怖分子,那么恐怖分子与正常人的比例就是 9999 : 1 。

那么如果我们不进行任何处理就直接进行有监督学习的话,那么模型只需要将所有人数据都分类为正常人,模型的准确率就能达到99.99%。而这样的模型显然是没有意义的。

因为基本上说有可能存在的恐怖分子的特征基本都被模型给忽略了,这也就说明了为什么要处理数据不平衡问题。

三、 常见的数据不平衡处理方法

以下是几种比较常见的处理数据不平衡的方法:

欠采样法(Undersampling)

过采样法(Oversampling)

人工数据合成法(Synthetic Data Generation)

代价敏感学习法(Cose Sensitive Learning)

【注】:本文主要以实现为主,因此不对上述方法进行过多的讲解。

在处理数据之前,我们先看一下需要处理的数据分布的情况。

load("C:/Users/User/Desktop/data.RData")table(data$classification)prop.table(table(data$classification))

> table(data$classification)

-8 1 2 3 4 5

12 104 497 1158 4817 1410

> prop.table(table(data$classification))

-8 1 2 3 4 5

0.001500375 0.013003251 0.062140535 0.144786197 0.602275569 0.176294074

1、 欠采样

######### 方法一 #########library(ROSE)# 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类# 进行平衡(转化为二分类问题)test <- data[which(data$classification == -8 | data$classification == 4),]# 将分类结果转化为因子型(不然会报错)test$classification <- as.factor(test$classification)# 进行欠采样# 其中 method = "under" 表示采用的方法为“欠采样”# N = 40 表示最终整个数据集的数量# seed 随机种子,为了保留对样本的追踪under <- ovun.sample(classification ~ ., test, method = "under", N = 40, seed = 1)$data# 查看结果table(under$classification)

> table(under$classification)

4 -8

28 12

######### 方法二 #########library(dplyr)# 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类# 进行平衡(转化为二分类问题)test <- data[which(data$classification == -8 | data$classification == 4),]# 提取大比例类test1 <- test[which(test$classification == 4),]# 将大比例类的数量降为12个down <- sample_n(test1, 12, replace = TRUE)# 将欠采样后的类进行合并down <- rbind(test[which(test$classification == -8), ],down)table(down$classification)

> table(down$classification)

-8 4

12 12

【注】:欠采样是无放回的采样。

2、 过采样

######### 方法一 #########library(ROSE)test <- data[which(data$classification == -8 | data$classification == 4),]test$classification <- as.factor(test$classification)# 实现上大致与欠采样相同,只有类型 method 改成了 "over",同时没有限制总数量under <- ovun.sample(classification ~ ., test, method = "over", seed = 1)$datatable(under$classification)

> table(under$classification)

4 -8

4817 4785

######### 方法二 #########library(dplyr)test <- data[which(data$classification == -8 | data$classification == 4),]# 提取小比例类test1 <- test[which(test$classification == -8),]# 将小比例类的数量降为4817个(与大比例类相同)# 这里使用的过采样方法是随机复制小比例类中的数据,将其扩充到指定数量down <- sample_n(test1, 4817, replace = TRUE)down <- rbind(test[which(test$classification == 4), ],down)table(down$classification)

> table(down$classification)

-8 4

4817 4817

3、人工数据合成法(Synthetic Data Generation)

######### 方法一 #########library(ROSE)# 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类# 进行平衡(转化为二分类问题)test <- data[which(data$classification == -8 | data$classification == 4),]# 将分类结果转化为因子型(不然会报错)test$classification <- as.factor(test$classification)# ROSE提供了ROSE()函数来合成人工数据rose <- ROSE(classification ~ ., test, seed = 1)$data# 查看结果table(rose$classification)

> table(rose$classification)

4 -8

2483 2346

######### 方法二 #########library(DMwR)test <- data[which(data$classification == -8 | data$classification == 4),]test$classification <- as.factor(test$classification)# perc.over: 如 perc.over = n,小比例类的个数变为 (n/100)a + a 个数据(a为小比例类原始数量)# perc.under: 如 perc.under = m,大比例类的个数变为((nm)/100)a个# 因此本次案例中,小比例类的个数变为(3500/100)*12 + 12 = 432个# 大比例类的个数变为((3500*300)/100^2)*12 = 1260个down <- SMOTE(classification ~ ., test, perc.over = 3500, perc.under = 300)table(down$classification)

> table(down$classification)

-8 4

432 1260

【注】:相较于前两种方法而言,人工合成法既不会像过采样容易导致过拟合问题,也不会出现欠采样大量丢失信息的问题。

4、代价敏感学习法(Cose Sensitive Learning)

什么是R语言

R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。

看完上述内容,你们掌握R语言中数据不平衡如何解决的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯