본문 바로가기
Business Analytics/R로 하는 통계검정

R 데이터 불균형 처리(imbalance data)

by BA815 2022. 11. 20.
728x90
반응형

불균형 데이터란 분류 분석에 있어서 데이터의 분류를 하는 데이터 class가 한쪽으로 치우쳐 있는 상황을 의미한다. 최근에 주변에서 발생하고 있는 가장 대표적인 예시는 코로나 19 검사자에 대한 분석을 진행할 때 음성의 비율이 양성의 비율보다 월등하게 높기 때문에 모델이 제대로 작동하지 않는 상황이 있다(예를 들어 음성의 비율이 99.9%라면, 어떤 분류 모형을 만들었을 때 그 분류모형은 모든 값을 음성으로만 예측하더라도 99.9%의 정확도를 갖는다. 즉 Accuracy는 높은 모형이지만, 현실적으로 크게 의미 없는 모형일 수 있다.) 

 

이를 방지하기 위해 분류를 해야하는 class에 비율을 조정하는 방식을 사용하는데, 이를 불균형 데이터에 대한 처리라 한다. 

 

불균형 데이터의 처리는 크게 3가지 방법이 있다. 

1. Up-Sampling : 비율이 낮은 class의 데이터를 늘림 (ex. 코로나 19 test 결과 양성 데이터를 늘림) 

2. Down-Sampling : 비율이 높은 class의 데이터를 줄임 (ex. 코로나 19 test 결과 양성 데이터를 줄임) 

3. Both(업 샘플링, 다운샘플링 동시 진행) 

 

1. Up-Sampling

업샘플링(또는 오버샘플링)은 해당 분류에 속하는 데이터가 적은 쪽을 표본으로 더 많이 추출하는 방법이다. 업샘플링의 장점으로는 1. 데이터의 손실 방지, 2. 언더샘플링에 비해 높은 분류정확도 등이 있으며, 단점으로는 1. 과적합이 발생할 가능성, 2. 데이터 증가로 인한 계산시간의 증가 등이 있다.

 

#사용하는 패키지 불러오기 

library(ggplot2)
library(caret)

# 1) Random Up-Sampling 
데이터$분류Class컬럼 <- as.factor(데이터$분류Class컬럼) #범주형 변수로 변경 
upsample <- upSample(subset(데이터, select = 분류Class컬럼), 데이터$분류Class컬럼) # upSample(독립변수, 종속변수)
table(upsample$분류Class컬럼) # 

# 2) SMOTE(Synthetic Minority Over-sampling Technique)
# 단, 사용을 위해서는 DF내 NA값이 없어야 함
library(smotefamily)
sm <- SMOTE(데이터[, -분류Class컬럼의 컬럼번호], data[, 분류Class컬럼의 컬럼번호], dup_size = 1)
# 이때 dup_size를 통해 클래스 불균형 보정 정도 변경 가능 
# 공식 문서 내 내용 
# dup_size : The number or vector representing the desired times of synthetic minority 
# instances over the original number of majority instances
table(sm$data$class) # 업샘플링 된 것을 확인할 수 있음
# 데이터를 사용하고 싶으면, data <- sm$data를 통해 smote가 적용된 DF 추출 가능 
# 이때 주의할 점은, 기존 컬럼 이름이 class로 변경되었다는 것

# 3) ADASYN(Adaptive Synthetic Sampling)
as <- ADAS(데이터[, -분류Class컬럼의 컬럼번호], data[, 분류Class컬럼의 컬럼번호], K  = 5)
table(as$data$class) # 업샘플링 된 것을 확인할 수 있으며, K값을 변경하여 데이터 수를 조절 가능
# 공식문서 K : The value of parameter K for nearest neighbor process used for generating data

 

2. Down-Sampling 

다운샘플링(또는 언더샘플링)은 업샘플링과 반대의 개념으로, 해당 분류에 속하는 데이터가 많은 쪽을 표본으로 적게 추출하는 방법이다. 다운샘플링의 장점으로는 1. 다수의 데이터를 제거하므로 계산시간이 감소, 2. 과적합 방지 등이 있고

단점으로는 1. 데이터를 제거하기 때문에 정보손실이 발생, 2. 샘플이 편향되거나 모집단을 대표하기 어려울 수 있음 등이 있다.

# 기본적으로 패키지는 위와 유사 

# 1) 단순 업샘플링 
데이터$데이터불균형class <- as.factor(데이터$데이터불균형class)
# downSample(독립변수, 종속변수)
ds <- downSample(subset(데이터, select = 데이터불균형class), 데이터$데이터불균형class) 
table(ds$데이터불균형class) # 다운샘플링되어 데이터 수가 많았던 클래스가 줄어듬

# 2) Tomek links
# Tomek Links란 두 범주 사이를 탐지하고 정리를 통해 부정확한 분류경계선을 방지하는 방법임
# 다른 클래스의 데이터 두 개를 연결했을 때 주변에 다른 임의의 데이터 Xk가 존재할 때
# 선택한 두 데이터에서 Xk까지의 거리보다 선택한 두 데이터 사이의 거리가 짧을 때 선택한 두 데이터 간의 
# 링크를 Tomek Link라 함
library(unbalanced)
tl <- ubTomek(데이터[, -불균형데이터컬럼번호], 데이터[, 불균형데이터컬럼번호], verbose = TRUE)
# head(tl)
table(tl$Y) # 0 class의 105개를 제거하여 다운샘플링함

# 3) CNN
# CNN Rule은 소수 범주에 속하는 데이터 전체와 다수 범주에 속하는 데이터 중 임의로 선택한 
# 데이터 한 개(A)로 구성된 서브 데이터를 생성
# 그리고 다수 범주에 속하는 나머지 데이터들 중 하나씩 K=1 인 1-NN 방식을 이용하여 해당 데이터가 
# 처음에 선택한 다수 범주 데이터 (A) 와 가까운지 아니면 소수 범주와 가까운지 확인하여 가까운 범주로
# 임시로 분류시킵니다. 이 과정이 끝나면 정상 분류된 다수 범주 관측치를 제거하여 언더 샘플링합니다.
# K가 1이 아닌 K-NN 방식을 사용할 경우 모든 데이터가 이상 범주의 데이터로 분류되기 때문에 
# K는 1이어야 함
set.seed(4)
cn <- ubCNN(데이터[, -불균형데이터컬럼번호], 데이터[, 불균형데이터컬럼번호], verbose = TRUE)
# head(cn)
table(cn$Y) # 0 class를 제거하여 다운샘플링함

 

 

3. Both 

 

 

이상으로 설명드린 내용은 Class가 0,1로 2가지만 존재할 때의 불균형 데이터 처리 방법이였습니다. 하지만, class가 0, 1, 2와 같이 2개를 초과할 경우에는 R 패키지 중 ‘scutr’ 패키지를 사용하면 됩니다. 

728x90
반응형

댓글