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 등 복합 샘플링 방법도 제공하고 있으니,
자세한 내용이 궁금하시다면 아래 링크의 글을 참고해보셔도 좋을 듯 합니다.
여기까지 파이썬 SMOTE 예제에 대한 글을 마치도록 하겠습니다. 감사합니다.
'Python > Sklearn' 카테고리의 다른 글
[Sklearn] 파이썬 모델 앙상블 : 배깅 / 부스팅 / 보팅 함수 정리 (1) | 2022.09.25 |
---|---|
[Sklearn] 파이썬 feature selection 함수 RFE, RFECV 예제 (1) | 2022.09.24 |
[Sklearn] 파이썬 ROC 커브, AUC 면적 구하기 예제 (0) | 2022.09.16 |