溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

R語言中數(shù)據(jù)不平衡如何解決

發(fā)布時間:2021-05-25 16:15:30 來源:億速云 閱讀:326 作者:Leah 欄目:開發(fā)技術(shù)

R語言中數(shù)據(jù)不平衡如何解決?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、項目環(huán)境

開發(fā)工具:RStudio

R:3.5.2

相關(guān)包:dplyr、ROSE、DMwR

二、什么是數(shù)據(jù)不平衡?為什么要處理數(shù)據(jù)不平衡?

首先我們要知道的第一個問題就是“什么是數(shù)據(jù)不平衡”,從字面意思上進(jìn)行解釋就是數(shù)據(jù)分布不均勻。在我們做有監(jiān)督學(xué)習(xí)的時候,數(shù)據(jù)中有一個類的比例遠(yuǎn)大于其他類,或者有一個類的比值遠(yuǎn)小于其他類時,我們就可以認(rèn)為這個數(shù)據(jù)存在數(shù)據(jù)不平衡問題。

那么這樣的一個問題會對我們后續(xù)的分析工作帶來怎樣的影響呢?我舉個簡單的例子,或許大家就明白了。

假設(shè)我們現(xiàn)在需要訓(xùn)練一個模型來分辨人群中那個人是恐怖分子。那么現(xiàn)在給到我們1萬個人員的數(shù)據(jù),在做分析之前其實我們就很清楚,一群人中恐怖分子的比例肯定是要遠(yuǎn)小于普通人的比例的。

那么假如在這1萬個人中只有一個是恐怖分子,那么恐怖分子與正常人的比例就是 9999 : 1 。

那么如果我們不進(jìn)行任何處理就直接進(jìn)行有監(jiān)督學(xué)習(xí)的話,那么模型只需要將所有人數(shù)據(jù)都分類為正常人,模型的準(zhǔn)確率就能達(dá)到99.99%。而這樣的模型顯然是沒有意義的。

因為基本上說有可能存在的恐怖分子的特征基本都被模型給忽略了,這也就說明了為什么要處理數(shù)據(jù)不平衡問題。

三、 常見的數(shù)據(jù)不平衡處理方法

以下是幾種比較常見的處理數(shù)據(jù)不平衡的方法:

1、欠采樣法(Undersampling)

2、過采樣法(Oversampling)

3、人工數(shù)據(jù)合成法(Synthetic Data Generation)

4、代價敏感學(xué)習(xí)法(Cose Sensitive Learning)

【注】:本文主要以實現(xiàn)為主,因此不對上述方法進(jìn)行過多的講解。

在處理數(shù)據(jù)之前,我們先看一下需要處理的數(shù)據(jù)分布的情況。

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)
# 由于是多分類問題,我們先提取數(shù)據(jù)中比例最大的類和比例最小的類
# 進(jìn)行平衡(轉(zhuǎn)化為二分類問題)
test <- data[which(data$classification == -8 | data$classification == 4),]
# 將分類結(jié)果轉(zhuǎn)化為因子型(不然會報錯)
test$classification <- as.factor(test$classification)
# 進(jìn)行欠采樣
# 其中 method = "under" 表示采用的方法為“欠采樣”
# N = 40 表示最終整個數(shù)據(jù)集的數(shù)量
# seed 隨機(jī)種子,為了保留對樣本的追蹤
under <- ovun.sample(classification ~ ., test, method = "under", N = 40, seed = 1)$data
# 查看結(jié)果
table(under$classification)

> table(under$classification)

4 -8

28 12

######### 方法二 #########
library(dplyr)
# 由于是多分類問題,我們先提取數(shù)據(jù)中比例最大的類和比例最小的類
# 進(jìn)行平衡(轉(zhuǎn)化為二分類問題)
test <- data[which(data$classification == -8 | data$classification == 4),]
# 提取大比例類
test1 <- test[which(test$classification == 4),]
# 將大比例類的數(shù)量降為12個
down <- sample_n(test1, 12, replace = TRUE)
# 將欠采樣后的類進(jìn)行合并
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)
# 實現(xiàn)上大致與欠采樣相同,只有類型 method 改成了 "over",同時沒有限制總數(shù)量
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),]
# 將小比例類的數(shù)量降為4817個(與大比例類相同)
# 這里使用的過采樣方法是隨機(jī)復(fù)制小比例類中的數(shù)據(jù),將其擴(kuò)充到指定數(shù)量
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、人工數(shù)據(jù)合成法(Synthetic Data Generation)

######### 方法一 #########
library(ROSE)
# 由于是多分類問題,我們先提取數(shù)據(jù)中比例最大的類和比例最小的類
# 進(jìn)行平衡(轉(zhuǎn)化為二分類問題)
test <- data[which(data$classification == -8 | data$classification == 4),]
# 將分類結(jié)果轉(zhuǎn)化為因子型(不然會報錯)
test$classification <- as.factor(test$classification)
# ROSE提供了ROSE()函數(shù)來合成人工數(shù)據(jù)
rose <- ROSE(classification ~ ., test, seed = 1)$data
# 查看結(jié)果
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,小比例類的個數(shù)變?yōu)?nbsp;(n/100)a + a 個數(shù)據(jù)(a為小比例類原始數(shù)量)
# perc.under: 如 perc.under = m,大比例類的個數(shù)變?yōu)?(nm)/100)a個
# 因此本次案例中,小比例類的個數(shù)變?yōu)?3500/100)*12 + 12 = 432個
# 大比例類的個數(shù)變?yōu)?(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

【注】:相較于前兩種方法而言,人工合成法既不會像過采樣容易導(dǎo)致過擬合問題,也不會出現(xiàn)欠采樣大量丟失信息的問題。

4、代價敏感學(xué)習(xí)法(Cose Sensitive Learning)

什么是R語言

R語言是用于統(tǒng)計分析、繪圖的語言和操作環(huán)境,屬于GNU系統(tǒng)的一個自由、免費(fèi)、源代碼開放的軟件,它是一個用于統(tǒng)計計算和統(tǒng)計制圖的優(yōu)秀工具。

看完上述內(nèi)容,你們掌握R語言中數(shù)據(jù)不平衡如何解決的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI