더북(TheBook)

SMOTE

SMOTE는 비율이 낮은 분류의 데이터를 만들어내는 방법이다. SMOTE는 먼저 분류 개수가 적은 쪽의 데이터의 샘플을 취한 뒤 이 샘플의 k 최근접 이웃k nearest neighbor을 찾는다. 그리고 현재 샘플과 이들 k개 이웃 간의 차difference를 구하고, 이 차이에 0 ~ 1 사이의 임의의 값을 곱하여 원래 샘플에 더한다. 이렇게 만든 새로운 샘플을 훈련 데이터에 추가한다. 결과적으로 SMOTE는 기존의 샘플을 주변의 이웃을 고려해 약간씩 이동시킨 점들을 추가하는 방식으로 동작한다.

DMwR 패키지의 SMOTE( ) 함수는 이 알고리즘의 구현으로 비율이 낮은 분류의 데이터를 생성하는 기능과 비율이 높은 쪽 데이터를 적게 샘플링하는 기능을 제공한다.

표 10-11 SMOTE

DMwR::SMOTE : SMOTE를 수행한다.

DMwR::SMOTE(
  form,  # 모델 포뮬러
  data,  # 포뮬러를 적용할 데이터
  perc.over=200,  # 적은 쪽의 데이터를 얼마나 추가로 샘플링해야 하는지
  k=5,            # 고려할 최근접 이웃의 수
  # 적은 쪽의 데이터를 추가로 샘플링할 때 각 샘플에 대응해서 많은 쪽의 데이터를
  # 얼마나 샘플링할지 지정
  perc.under=200
)

반환 값은 SMOTE된 결과다.

SMOTE는 숫자형 데이터를 기본으로 하여 작성된 알고리즘이므로 BreastCancer를 예로 사용하기 곤란하다. 따라서 여기서는 example(SMOTE)의 예를 기반으로 한 설명을 하도록 하겠다. 다음은 예시를 위해 사용할 데이터를 만드는 코드다. 아이리스에서 setosa 종은 rare로, 그 외의 versicolor, virginica는 common으로 바꿨다. 그 결과 common에는 100개의 데이터가, rare에는 50개의 데이터가 지정되었다.

> data(iris)
> data <- iris[, c(1, 2, 5)]
> data$Species <- factor(ifelse(data$Species == "setosa","rare","common"))
> table(data$Species)
common   rare
   100     50

이 데이터에 SMOTE를 사용하여 common과 rare의 개수를 대략 맞춘 결과는 다음과 같다.

> newData <- SMOTE(Species ~ ., data, perc.over = 600, perc.under=100)
> table(newData$Species)
common   rare
   300    350

perc.over는 개수가 적은 분류로부터 얼마나 많은 데이터를 생성해낼지over sampling를 조정하는 변수며, perc.under는 개수가 많은 분류의 데이터를 얼마나 적게 샘플링할지under sampling를 조정하는 변수다. 이들 파라미터는 시행착오를 통해 지정해도 되고, 다음에 설명하는 방법을 참고해서 정해도 된다.

perc.over는 보통 100 이상으로 정하는 값으로 적은 쪽의 데이터 한 개당 perc.over/100개의 추가 데이터가 생성되어 샘플링된다. perc.under는 많은 쪽의 데이터 중 얼마만큼의 비율을 샘플링할 것인지를 정하는데 이 비율은 perc.over에 의해 추가로 생성된 데이터와 비례해서 정해진다. 예를 들어, perc.over에 의해 200개의 추가 데이터가 적은 쪽 분류에 추가로 생성되었고, perc.over가 100이라면 많은 쪽 분류에 속하는 데이터로부터도 200개의 데이터가 취해진다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.