머신러닝 공부를 하며 불균형자료 처리에 대해 다루게 되었다.
과대표집방법에서의 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
댓글