广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >解决R语言 数据不平衡的问题
  • 478
分享到

解决R语言 数据不平衡的问题

2024-04-02 19:04:59 478人浏览 泡泡鱼
摘要

R语言解决数据不平衡问题 一、项目环境 开发工具:RStudio R:3.5.2 相关包:dplyr、ROSE、DMwR 二、什么是数据不平衡?为什么要处理数据不平衡? 首先我们要知

R语言解决数据不平衡问题

一、项目环境

开发工具:RStudio

R:3.5.2

相关包:dplyr、ROSE、DMwR

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

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

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

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

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

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

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

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

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

1、欠采样法(Undersampling)

2、过采样法(Oversampling)

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

4、代价敏感学习法(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)$data
table(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)

【注】:还没想好怎么写。。。。。

三、 结语

本文之所以都只拿两个分类在进行分析,是因为上面提到的用于解决数据不平衡问题的函数,基本上都是针对二分类问题的。当导入的数据中有大于两个分类时,函数就会报错。

但是在实际分析的过程中,其实我们更经常遇到的时多分类问题,这是我们就需要将多分类问题转化为二分类问题,将各个分类两两进行比较才能更好的解决数据不平衡的问题。

--结束END--

本文标题: 解决R语言 数据不平衡的问题

本文链接: https://www.lsjlt.com/news/121476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决R语言 数据不平衡的问题
    R语言解决数据不平衡问题 一、项目环境 开发工具:RStudio R:3.5.2 相关包:dplyr、ROSE、DMwR 二、什么是数据不平衡?为什么要处理数据不平衡? 首先我们要知...
    99+
    2022-11-11
  • R语言中数据不平衡如何解决
    R语言中数据不平衡如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、项目环境开发工具:RStudioR:3.5.2相关包:dplyr、ROSE、DMwR二、什么是数据不...
    99+
    2023-06-15
  • R语言项目中出现数据不平衡如何解决
    这篇文章将为大家详细讲解有关R语言项目中出现数据不平衡如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、项目环境开发工具:RStudioR:3.5.2相关包:dplyr、ROSE、D...
    99+
    2023-06-08
  • R语言编码问题的解决
    今天博客主要是解决一个学R语言里面最最痛苦的问题(嗯,python2.x里面也有),就是中文乱码问题: 一般用R语言的同学,多半遇见过以下这个问题: 反正虾神我每次遇见这个问题,立...
    99+
    2022-11-12
  • C语言平衡二叉树问题怎么解决
    这篇文章主要介绍“C语言平衡二叉树问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言平衡二叉树问题怎么解决”文章能帮助大家解决问题。一、题目描述给定一个二叉树,判断它是否是高度平衡的二...
    99+
    2023-06-30
  • Python中怎么解决非平衡数据问题
    Python中怎么解决非平衡数据问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SMOTE算法的介绍在实际应用中,读者可能会碰到一种比较头疼的问题,那就是分类...
    99+
    2023-06-17
  • R语言 解决安装ggplot2报错的问题
    如下所示: install.packages(‘xxx',repos=‘http://cran.us.r-project.org') xxx 改为 ggplot2 补充:R包安...
    99+
    2022-11-12
  • 如何解决R语言循环慢的问题
    小编给大家分享一下如何解决R语言循环慢的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计...
    99+
    2023-06-14
  • R语言-解决处理矩阵遇到内存不足的问题
    如下: Error : cannot allocate vector of size X Gb 类似于这种问题的可能处理办法: 1. 可以用matrix尽量不要用data fra...
    99+
    2022-11-12
  • R语言 解决无法打开链结的问题
    近期,在项目中遇到一个棘手的问题。 R脚本在centos服务器上通过"R --no-save filename.R"的方式运行R脚本可以成功,分析结果也可以存入MySQL,该种方式适...
    99+
    2022-11-12
  • R语言 UTF-8各种问题的解决方案
    R语言在碰到读UTF-8文件,或者处理UTF-8数据时总是会遇到各种各样的问题,本姑娘也是在碰了n多次壁,被气得吐血好多次之后,终于对这类总结出了一些解决办法: 1. 读UTF-8文...
    99+
    2022-11-12
  • 解决R语言安装时出现辑程包不存在的问题
    【解决方案】 1.使用命令单独安装caret,安装的时间很长。 install.packages("caret", dependencies = c("Depends", "S...
    99+
    2022-11-12
  • centos6.5安装R语言出现问题怎么解决
    这篇文章主要讲解了“centos6.5安装R语言出现问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“centos6.5安装R语言出现问题怎么解决”吧!环境:虚拟机centos6.5...
    99+
    2023-06-03
  • R语言多线程运算操作(解决R循环慢的问题)
    已经大半年没有更新博客了。。最近都跑去写分析报告半年没有R 这次记录下关于R循环(百万级以上)死慢死慢的问题,这个问题去年就碰到过,当时也尝试过多线程,but failed........
    99+
    2022-11-12
  • R语言如何解决处理矩阵遇到内存不足的问题
    小编给大家分享一下R语言如何解决处理矩阵遇到内存不足的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属...
    99+
    2023-06-14
  • R语言如何解决无法打开链结的问题
    这篇文章给大家分享的是有关R语言如何解决无法打开链结的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。近期,在项目中遇到一个棘手的问题。R脚本在centos服务器上通过"R --no-save fil...
    99+
    2023-06-14
  • Python与C语言分别解决完全平方数问题
    1 案例 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 2 分析 由题意我们可以设该数为x ,加100后得到的完全平方数为再加168后得...
    99+
    2022-11-13
  • 利用Python/R语言分别解决金字塔数求和问题
    目录前言1、前N阶乘求和1.1 图解问题1.2 算法流程1.3 代码实现1.4实验小结2、金字塔数求和运算2.1 图解问题2.2 算法流程2.3 代码实现2.4 实验小结总结前言 此...
    99+
    2022-11-13
  • 解决R语言中install_github中无法安装遇到的问题
    首先,让我们来进入常规步骤 我安装的是recharts包,正常的写法呢,就是以下这个样子: install.packages("devtools") #devtools::ins...
    99+
    2022-11-12
  • 关于R语言lubridate包处理时间数据的问题
    加载包 # install.packages(lubridate) library(lubridate) 第一个函数ymd():解析日期为年月日格式 x <- c("...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作