본문 바로가기
머신러닝&딥러닝/머신러닝

[불균형자료 (Imbalanced data)] 처리

by happy_bigdata 2022. 3. 16.

머신러닝 공부를 하며 불균형자료 처리에 대해 다루게 되었다.

과대표집방법에서의 SMOTE, ADASYN에 대해 정확히 짚고 넘어가기 위해 여러 자료를 찾고, 최종적으로 이해한 결과를 적어보려고 한다.  

 

 

: 과대표집(oversampling), 과소표집(undersampling)은 어떠한 자료를 다루기 위해서는 꼭 알고 있어야 하는 부분 중 하나라고 생각한다. 하지만 무작정 쓰기 보다는 소수클래스에 맞게 썼을 때 결과가 잘 나오면 쓰는 것이고, 잘 안나오면 안쓰면 되는 것이다. 이렇게 생각을 하고, 불균형자료를 처리하며 진행해야 한다고 생각한다. 

 

과대표집방법의 대표적인 방법은 SMOTE (합성소수표집법)과 ADASYN (조절합성표집법)이 있다.

 

1. SMOTE

: 소수 클래스에 속한 i 번째 관측치의 특성변수 xi에 대해 k-nearest neighbors 셋 Si를 생성한다. 이때, k개의 neighbors는 모두 소스클래스에 속한 관측치이다. 

 

Xsyn = Xi  + λ(Xk - Xi)  (λ : uniform distribution에서 0~1값으로 임의로 추출한 값)

 

아이패드로 그려본 데이터 ... .

 

2. ADASYN

: SMOTE와 동일하나, 소수클래스 주변의 다수클래스 수에 따라 유동적으로 oversampling 개수를 생성한다.

 소수클래스에 있는 각 xi에 대응하여 생성된 합성표본수를 Si 안에 포함된 다수클래스의 표본 수에 비례하도록 추출한   것에 차이가 있는 것이다.

 따라서, SMOTE 보다 조금 ADVANCED한 표집 방법이라고 할 수 있을 것이며, 샘플링하는 개수를 위치에 따라 다르게   적용된다.

 

ri = Δi / K  (i=1, ... , m)

               (Δi : 소수 클래스 xi의 주변 K 개중 다수 클래스의 관측치 개수)

               (m : 소수 클래스 내 관측치 총 개수)

 

 

코드)

# 과소표집(undersampling) : 다수클래스의 표본을 임의로 학습데이터로부터 제거하는 것
# 과대표집(oversampling) : 소수클래스의 표본을 복제하여 이를 학습데이터에 추가하는 것
#  : 합성소수표집법(SMOTE), 조절합성표집법(ADASYN)

!pip3 install imblearn

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE, ADASYN
X, y = make_classification(n_classes=3, weights=[0.03, 0.07, 0.9], n_features=10,
                          n_clusters_per_class=1, n_samples=2000, random_state=10)
# 범주 : 3개 / weights 비율 : 0.03, 0.07, 0.9 / feature 변수 10개 / 군집 1개
print('Original dataset shape %s' % Counter(y))


print(X); print(y)

sm = SMOTE(random_state=42) #람다
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

ada = ADASYN(random_state=0)
X_syn, y_syn = ada.fit_resample(X, y)
print('Resampled dataset shape from ADASYN %s' % Counter(y_syn))

 

 

Reference)

- 박유성,『파이썬을 이용한 통계적 머신러닝』, 자유아카데미(2020)

- https://www.youtube.com/watch?v=Vhwz228VrIk&t=2679s

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

[머신러닝] 개념  (0) 2021.09.27

댓글