본문 바로가기

Python/머신러닝

SMOTE : Over Sampling

요즘 DACON 문제를 풀고 있다. 

https://dacon.io/competitions/official/235689/overview/

 

운동 동작 분류 AI 경진대회

출처 : DACON - Data Science Competition

dacon.io

해당 문제를 풀면서 과적합이 일어났고, 모델 성능을 높이기 쉽지 않았다. 

그 문제가 데이터의 부족은 아니였을까 하는 생각에 Over Sampling 을 시도했다. 

 

< Over Samling > 

신용카드 사기 등 이상값을 검출하는 모델을 구상할 때, "이상" 레이블 데이터에 비해 "정상" 레이블 데이터가 지나치게 많을 경우, 모델이 정상 레이블을 검출하는 것에 초점이 맞춰진다. '이상'이라고 한 만큼 데이터의 부족이 있을 수 밖에 없지만 레이블의 불균형은 모델을 학습시킴에 있어 성능 하락의 원인이 되기도 한다. 그리하여 두 레이블의 데이터의 수를 Under Sampling과 Over Sampling 방식을 사용하여 맞추어 줄 수 있다.  언더 샘플링의 경우 정상 데이터를 이상 데이터의 수 만큼 감소시키는 것으로 정상 레이블에 대한 학습이 제대로 이루어지지 않을 가능성이 높아 주로 사용되지 않는다고 한다. 오버 샘플링은 이상 데이터의 수를 정상 데이터의 수만큼 추가로 생성하는 것이다. 

 

이 문제를 풀 때 SMOTE 라는 패키지를 사용했다. SMOTE는 적은 데이터 세트의 개별 데이터의 K-Nearest Neighbor을 찾아 이 데이터와 K개의 이웃들의 차이를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터들을 생성하는 방식이다. 

 

conda install -c conda-forge imbalanced-learn

 

해당 명령어를 통해 쉽게 설치가 가능하다. 

 

import imblearn.over_sampling import SMOTE

 

SMOTE를 사용하기 위해 import 하고, fit_sample을 통해 데이터를 생성할 있다.  

설명에는 이상 레이블과 정상 레이블이라는 두 가지의 Class의 경우를 이야기 했지만, SMOTE는 모든 레이블의 크기를 맞추어 준다.

클래스가 A(200개), B(50개), C(10개), D(34개) 이렇게 되어 있다고 했을 때, 

가장 많은 데이터를 가진 클래스의 데이터 수만큼 다른 클래스의 데이터를 확장한다. 

SMOTE.fit_sample(data, label) 을 실행할 경우, 

즉, A, B, C, D 클래스 모두 각각 200개의 데이터을 가지게 되어 총 800개의 데이터를 가지게 된다. 

이전의 데이터셋의 크기 294개 에서 800개로 데이터셋이 확장되었음을 알 수 있다. 

 

이상 레이블이 하나인 데이터셋 뿐만 아니라 여러 개의 Multi labels 을 가진 분류 문제일 경우에도 각 레이블이 가진 데이터의 수가 불균형할 경우에 활용할 수 있는 방법이다. 

 

 

 

 

'Python > 머신러닝' 카테고리의 다른 글

선형 회귀 모델  (0) 2021.01.13
Mac에 Xgboost 설치하기 (Python 버전 3.8 )  (0) 2021.01.05