R语言项目中出现数据不平衡如何解决

  介绍

这篇文章将为大家详细讲解有关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语言项目中出现数据不平衡如何解决