Python/Sklearn

파이썬 SMOTE 알고리즘 데이터 불균형 해결 예제

jimmy_AI 2022. 12. 5. 15:01
반응형

Python SMOTE 사용법

파이썬에서 비대칭 데이터 라벨 문제를 해결하는 알고리즘 중 하나인

SMOTE를 사용해보는 예제를 간단하게 다루어보도록 하겠습니다.

 

 

SMOTE 알고리즘이란?

SMOTE는 데이터 불균형 해결 방법 중 적은 수의 라벨 측에 포함된

데이터 샘플 수를 늘리는 대표적인 오버 샘플링 기법 중 하나로,

 

샘플링된 데이터에 대하여 k-최근접 이웃을 고른 뒤, 해당 점과 이웃 점들을 선분으로 잇고

이 선분들 위에서 임의의 점을 골라 새로운 샘플로 취급하는 알고리즘입니다.

 

 

SMOTE 파이썬 코드 예제

먼저, 예시 데이터로 사이킷런의 유방암 예측 데이터셋을 불러오도록 하겠습니다.

 

편의상, 수많은 종류 중 4가지 feature만 골라서 사용하겠습니다.

import pandas as pd
from sklearn import datasets

# 유방암 데이터셋 로드
data = datasets.load_breast_cancer()
df = pd.DataFrame(data.data, columns = data.feature_names)

# 일부 feature만 사용
df = df[['mean radius', 'mean texture', 'mean area', 'mean symmetry']]

# 1이면 양성 종양, 0이면 악성 종양 라벨 열 지정
df['target'] = data.target

 

해당 데이터셋에서는 0과 1의 두 가지 라벨로 구성되어 있는데,

개수를 세어보면 1번 라벨이 357개, 0번 라벨이 212개로 포함 비중이 다릅니다.

df['target'].value_counts()

1    357
0    212
Name: target, dtype: int64

 

학습용 데이터셋에 대해서만 SMOTE를 적용하는 것이 자연스럽기에

먼저, train/test 데이터셋을 분리하도록 하겠습니다.

from sklearn.model_selection import train_test_split

# train, test 셋 분리
X = df[['mean radius', 'mean texture', 'mean area', 'mean symmetry']]
y = df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

 

반응형

 

학습용 데이터셋의 라벨도 역시 불균등하게 분포되어있는 상황입니다.

y_train.value_counts()

1    284
0    171
Name: target, dtype: int64

 

이제, imblearn 모듈에 구현된 SMOTE 메소드를 통하여 SMOTE 알고리즘을

적용해보도록 하겠습니다. 예시 코드는 아래와 같습니다.

# 모듈 미설치 시 !pip install imbalanced-learn 명령어로 설치
from imblearn.over_sampling import SMOTE

new_X_train, new_y_train = SMOTE(random_state = 22).fit_resample(X_train, y_train)

 

라벨 분포를 다시 살펴보면 균등한 개수로 오버 샘플링되어

맞추어져있는 모습을 살펴볼 수 있습니다.

new_y_train.value_counts()

0    284
1    284
Name: target, dtype: int64

 

기존 데이터와 비교해보시면 앞 부분은 그대로 포함되어있는 반면,

뒷 부분에는 새롭게 추가된 데이터들이 들어와 있는 것을 살펴볼 수 있습니다.

 

 

기타 비대칭 데이터 해결 알고리즘 예제

언더 샘플링, ADASYN, Edited Nearest Neighbours(ENN) 등 다양한 비대칭 데이터

라벨 문제를 해결하기 위한 메소드들이 imblearn 모듈에 구현되어 있습니다.

 

또한, SMOTEENN 등 복합 샘플링 방법도 제공하고 있으니,

자세한 내용이 궁금하시다면 아래 링크의 글을 참고해보셔도 좋을 듯 합니다.

 

비대칭 데이터 문제 — 데이터 사이언스 스쿨

.ipynb .pdf to have style consistency -->

datascienceschool.net

 

여기까지 파이썬 SMOTE 예제에 대한 글을 마치도록 하겠습니다. 감사합니다.