지도학습 모형에서 데이터 클래스 비율의 차이가 많이 나면 모형이 단순히 다수의 클래스를 택하는 것만으로도 정확도가 높아지므로 예측 모형으로서의 의미가 떨어진다. 실제로 고객의 이탈이나 클레임 제기 여부 등 같이 발생 비율이 적은 범주가 존재하는 데이터를 그대로 학습할 경우 한쪽에 치우친 예측을 남발하는 비정상적인 모형이 생성될 수 있다.
이렇게 각 클래스에 속한 데이터의 비율 차이에 의해 발생하는 문제들을 데이터 불균형 문제 (Imbalanced Data Problem)라고 하고, 이러한 데이터 불균형성을 해결하기 위해 데이터 처리 단계에서 수행하는 방법론을 데이터 밸런싱 (Data Balancing)이라고 한다. 데이터 밸런싱에는 언더 샘플링 (Under Sampling) 방식과 오버 샘플링 (Over Sampling) 방식이 있으며, 보통 오버 샘플링 방식을 주로 사용한다.
[표 1] 데이터 밸런싱 유형
데이터 밸런싱 유형 | 설명 |
언더 샘플링 | 다수 클래스의 값들을 제거하여 데이터 비율을 맞추는 방법 |
오버 샘플링 | 소수 클래스 데이터를 증가시켜 데이터 비율을 맞추는 방법 |
파이썬에서는 imbalanced-learn 라이브러리를 통해 이러한 데이터 불균형성 문제를 해결할 수 있다. imbalanced-learn 라이브러리를 설치하기 위해 아나콘다 프롬프트를 관리자 권한으로 실행한 뒤 다음의 코드를 실행한다.
pip install imbalanced-learn
imbalanced-learn 라이브러리에 대한 자세한 내용은 아래 URL에서 확인할 수 있다.
https://imbalanced-learn.readthedocs.io/en/stable/user_guide.html
1) 언더 샘플링
언더 샘플링 (Under Sampling)은 데이터 세트에서 다수 클래스 (Majority Class)의 비율을 낮추어 데이터의 밸런스를 맞추는 방식이다.
[그림 1] 언더 샘플링
랜덤 언더 샘플링
랜덤 언더 샘플링 (Ramdom Under Sampling)은 언더 샘플링의 대표적인 방법으로서 무작위로 다수 클래스의 데이터를 제거하는 단순한 방법이다. 랜덤 언더 샘플링은 imblearn.under_sampling 모듈의 RandomUnderSampler( ) 함수에 구현되어 있다.
#1. 모듈 및 함수 불러오기
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter
#2. 랜덤 언더 샘플링 실행
X_train_under, Y_train_under = \
RandomUnderSampler(random_state=0).fit_sample(X_train, Y_train)
#3. 결과 출력
print('Original dataset shape %s' % Counter(Y))
print('sampled dataset shape %s' % Counter(Y_train))
print('Resampled dataset shape %s' % Counter(Y_train_under))
2) 오버 샘플링
오버 샘플링 (Over Sampling)은 소수 클래스 (Minority Class) 데이터를 증가시켜 데이터 세트의 밸런스를 맞춰주는 방법이다.
[그림 2] 오버 샘플링
SMOTE
SMOTE (Synthetic Minority Over-sampling Technique)는 오버 샘플링의 대표적인 방법으로서 적은 데이터 세트에 있는 개별 데이터들의 k개의 최근접 이웃을 찾고, 개별 데이터와 k개 이웃들의 차이를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터들을 생성하는 방식이다. SMOTE는 imblearn.over_sampling 모듈의 SMOTE( ) 함수에 구현되어 있다. 아래 코드를 통해 살펴보겠다.
#1. 모듈 및 함수 불러오기
from imblearn.over_sampling import SMOTE
#2. SMOTE 샘플링 실행
X_train_over, Y_train_over = SMOTE(random_state=0).fit_sample(X_train, Y_train)
#3. 결과 출력
print('Original dataset shape %s' % Counter(Y))
print('sampled dataset shape %s' % Counter(Y_train))
print('Resampled dataset shape %s' % Counter(Y_train_over))
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글