현재 우울증을 가지고 있는 사람
이 전체 샘플에서 약 10%도 되지 않는다.depressed == 0
or depressed == 1
로 구분한다면, 이 y값 클래스 (0, 1)의 분포가 크게 차이가 나는 것이다.
depressed | count | dist |
---|---|---|
0 | 20019 | 91% |
1 | 1958 | 9% |
depressed == 0
), 즉 가중치가 높은 클래스를 더 예측하려고 하기 때문에 Accuracy는 높아질 수 있지만, 분포가 작은 클래스(depressed == 1
)에 대한 Precision이 낮고 재현율 또한 낮아지는 문제가 발생할 수 있다.1) Under-sampling: 비중이 큰 클래스의 데이터 수를 낮은 클래스 만큼 줄이기
depressed == 0
을 20000→ 2000까지 줄이기.from imblearn.under_sampling import RandomUnderSampler
X = df
rus = RandomUnderSampler(sampling_strategy=0.5, random_state=42) # 0.1 -> 0.5로 변경
X_under, y_under = rus.fit_resample(X, y)
X_under.shape, y_under.shape
2) Over-sampling: 비중이 작은 클래스의 데이터 수를 큰 클래스만큼 늘리기
depressed == 1
을 2000 → 20000까지 늘리기
정보의 손실을 막을 수는 있지만, 오히려 over fitting 을 초래할 수 있음.
어떤 방식으로 늘릴 수 있을까?
Random Over Sampling
Synthetic Minority Oversampling Technique (SMOTE)
Random Over Sampling과는 다르게, 데이터에 새로운 ‘정보’를 추가하기 때문에 더 효과적임.
- 비중이 작은 클래스에서 무작위로 k포인트 선택
- 랜덤한 데이터와 k개의 최근접 이웃 간의 유클리디안 거리를 계산 (=k-nearest neighbors 계산)
- 거리를 0과 1 사이의 랜덤한 수로 곱한 다음, 합성 샘플로 비중이 작은 클래스에 결과를 추가
- 합성 포인트는 선택한 포인트와 인접 포인트 사이에 추가
- 이를 원하는 비율을 충족할 때까지 반복
# over sampling
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_over, y_over = smote.fit_resample(X_under, y_under)
X_over.shape, y_over.shape
Adaptive Synthetic Sampling (ADASYN)
X_samp, y_samp = ADASYN(random_state=0).fit_sample(X_imb, y_imb)
3) Over-sampling followed by under-sampling
from imblearn.combine import SMOTETomek
smt = SMOTETomek(sampling_strategy='auto')
X_sm, y_sm = smt.fit_resample(X,y)