SMOTE에 대한 고찰

dev_ung·2023년 6월 25일

데이터과학

목록 보기
1/1

문제 상황

필자는 컴퓨터과학과 학부생이다. 연구과제로 특수한 질병을 예측하는 모델을 만드는 일을 하게 되었고 불균형한 클래스(Unbalanced Class)와 적은 데이터 수에 의해 Accuracy는 높게 나오지만 F1-Score가 처참하게 깨지는 문제를 겪었다. 그 이유는 질병을 걸리지 않았다는 쪽으로 일방적으로 찍기만해도 Accuracy가 높기 때문에 학습 모델이 이를 알고 질병에 걸리지 않았다고만 예측하기 때문이다.

모델이 한쪽으로만 예측하지 않게하려면?

필자는 당시 OverSampling에 대한 개념이 없어서 모델을 튜닝해서 불균형을 해결해야한다고 생각했다. 그러나 교수님은 불균형 데이터를 보시고 SMOTE를 한번 공부해보라고 권하셨다. SMOTE는 OverSampling 기법 중 하나로 불균형 클래스들의 균형을 맞춰주는 일을 한다. 모델을 학습시킬 데이터를 균형있게 만들어주면 한쪽으로 예측하는 일을 방지할 수 있다.

SMOTE 사용 방법

1. train 데이터와 test 데이터 분리

먼저 해야할 것은 train 데이터와 test 데이터를 분리하는 것이다. 필자는 처음에 전체 데이터를 균형있게 맞추면 된다는 생각에 train과 test를 나누기 이전에 OverSampling을 하였다. 그 말인 즉슨 SMOTE로 만든 가짜 데이터를 test로 사용하고 있다는 의미가 된다. SMOTE를 사용할땐 항상 train데이터만 늘려야 함을 잊지 말아야한다.

2. Library Import & SMOTE 적용

from imblearn.over_sampling import SMOTE

smote = SMOTE()
X_train, y_train = smote.fit_resample(X_train, y_train)

아무런 옵션없이 SMOTE를 적용한다면 minor class의 수가 major class의 수를 맞춘다. 예시로 0 클래스가 500개, 1 클래스가 1000개라면, 0 클래스를 1000개까지 늘려 총 2000개의 데이터를 만든다. (= 1 클래스는 늘어나지 않는다.)

만약, OverSampling된 데이터의 크기를 지정하고 싶다면 다음과 같은 옵션을 넣을 수 있다.

smote = SMOTE(sampling_strategy={0: 2000, 1: 2000})

SMOTE의 문제점

SMOTE는 kNN을 기반으로 데이터를 늘린다. 데이터를 늘릴 때, minor class를 고려하고 major class를 고려하지 않기 때문에 OverSampling된 minor class 데이터가 major class와 겹치는 문제가 발생할 수 있어 노이즈가 생긴다.

SMOTE에 대한 생각

SMOTE는 kNN을 기반으로 데이터를 늘려간다. 이로 인해 노이즈가 생길 수 있는데 이러한 문제를 해결한 OverSampling 기법이 더 있는 것으로 알고있다. 다뤄 볼 기회가 생긴다면 그때 글을 작성해보겠다.
현실에서 데이터를 다룬다면 데이터의 수는 항상 부족할 수 밖에 없다고 생각한다. 그렇기에 SMOTE(OverSampling) 기법은 앞으로 필자가 유용하게 사용할 방법이 될 것이라 생각한다.

0개의 댓글