딥러닝 모델을 학습시키다 보면 현실 세계에서 불균형한 데이터 세트를 접하는 경우가 많다.
예를 들어, 의료 진단 데이터에서 질병이 있는 환자보다 건강한 환자가 훨씬 많거나, 금융 사기 탐지 데이터에서 정상 거래가 부정 거래보다 압도적으로 많은 경우가 그렇다. 이런 불균형 데이터는 모델의 학습과 성능 평가에 심각한 영향을 미칠 수 있다. 그렇다면, 모델의 성능을 저하시키지 않으면서 불균형 데이터를 학습하려면 어떤 방법을 사용할 수 있을까? 이번 포스팅에서 효과적인 해결 방법을 알아보자.
불균형 데이터는 특정 클래스의 샘플 수가 다른 클래스보다 현저히 적거나 많은 경우를 의미한다. 이로 인해 모델이 다수 클래스를 과도하게 학습하고, 소수 클래스에 대해 제대로 학습하지 못하는 문제가 발생한다. 이 문제를 해결하는 접근법은 크게 두 가지로 나뉜다.
- 데이터 레벨에서 해결 - 데이터 자체를 조정하여 균형을 맞추는 방법
- 알고리즘 레벨에서 해결 - 학습 과정에서 모델이 불균형을 고려하도록 하는 방법
1. 데이터 레벨에서 다루기
데이터 레벨에서 해결한다는 것은 데이터 자체를 변형하거나 증강하여 균형을 맞추는 방법을 의미한다. 주로 지도학습(supervised learning)에서 사용된다.

1-1 언더샘플링 (Undersampling)
다수 클래스를 줄여서 균형을 맞추는 방법으로, 주요 기법은 다음과 같다.
- 랜덤 언더샘플링: 무작위로 다수 클래스 데이터를 줄이는 방법이지만, 중요한 정보를 잃을 위험이 있다.
- NearMiss: 다수 클래스 데이터 중 소수 클래스와 가장 유사한 샘플만 남기는 기법으로, 데이터 손실을 최소화하면서 불균형을 해결할 수 있다.
1-2 오버 샘플링 (Oversampling)
소수 클래스를 인위적으로 증가시켜 데이터를 균형 맞추는 기법이다. 대표적인 방법은 다음과 같다.
- 랜덤 오버샘플링: 단순히 부족한 클래스를 복제하여 개수를 늘리는 방법이다. 이 방법은 부족한 클래스의 데이터 자체를 복사해서 넣는 방식이므로 데이터의 다양성이 부족해진다는 문제가 있다.
- SMOTE (Synthetic Minority Over-sampling Technique): 소수 클래스 샘플들 사이에서 새로운 데이터를 생성하는 방법으로, 데이터의 다양성을 유지하면서 불균형을 완화할 수 있다는 장점이 있다.
- ADASYN (Adaptive Synthetic Sampling): SMOTE와 유사하지만, 학습이 어려운 샘플 근처에서 데이터를 더 많이 생성하는 방식이다.
1-3 데이터 증강 (Data Augmentation)
이미지나 텍스트 데이터에서는 데이터 증강을 통해 부족한 클래스의 데이터를 보강할 수 있다. 데이터가 어떤 특징을 가지고 있는 지에 따라 다양한 증강 기법이 적용된다.
- 이미지 데이터: 회전, 크롭, 밝기 조정, 좌우 반전 등의 기법 활용
- 텍스트 데이터: 동의어 교체, 문장 구조 변경, 역번역(Back Translation) 등을 활용하여 데이터 생성
2. 알고리즘 레벨에서 해결하기
알고리즘 레벨에서 해결한다는 것은 데이터를 변경하지 않고, 모델이 불균형을 고려할 수 있도록 학습 방식을 조정하는 방법을 통칭하는 것이다.
2-1 가중치 조정 (Class Weighting)
손실 함수에서 소수 클래스(라벨링 기준)에 더 높은 가중치를 부여하여 모델이 해당 클래스를 더 중요하게 학습하도록 유도할 수 있다. 이미 구현된 머신러닝, 딥러닝 프레임워크나 라이브러리에서 적용할 수 있다. 예를 들어 PyTorch나 TensorFlow에서는 class_weight 옵션을 활용하여 가중치를 조정할 수 있다.
2-2 특수한 손실 함수 사용
불균형 데이터에 적응하여 학습하도록 유도하는 손실함수도 있다. 가령 분류 task에서 크로스 엔트로피 손실 함수 대신 Focal Loss를 사용하면 효과적이다.
- Focal Loss: 학습이 어려운 샘플(소수 클래스)에 더 큰 가중치를 부여하는 손실 함수로, 모델이 해당 클래스를 학습하도록 유도한다.
2-3 앙상블 학습 (Ensemble Learning)
여러 개의 모델을 조합하는 앙상블 방법도 효과적이다. 특히 Bagging이나 Boosting 기법을 활용하면 모델이 불균형한 데이터를 더 잘 다룰 수 있다. 대표적인 알고리즘으로 Balanced Random Forest나 XGBoost의 가중치 조정 기능이 있다.
3. 평가 방법 고려하기
불균형 데이터에서는 지표를 단순히 정하면 평가 해석에 대한 왜곡이 생기게 된다.
예를 들어 불균형 데이터 셋에서 단순히 정확도(Accuracy)를 평가 지표로 사용하면 정확한 평가 척도로 사용되지 않는다. 가령 전체 데이터 중 99%가 정상 거래이고 1%만이 사기 거래인 데이터 세트에서 모든 데이터를 정상 거래로 예측하면 99%의 정확도를 얻을 수 있지만, 이는 무용지물인 것과 같다. 이러한 점을 고려했을 때 생각해 볼 수 있는 평가 지표는 다음과 같다.
- 정밀도(Precision): 모델이 예측한 긍정 클래스 중 실제로 맞는 비율
- 재현율(Recall): 실제 긍정 클래스 중 모델이 맞게 예측한 비율
- F1-score: 정밀도와 재현율의 조화 평균으로, 불균형 데이터에서 유용
- AUC-ROC Curve: 모델이 클래스 구분을 얼마나 잘하는지 평가
4. 마무리
이번 포스팅에서는 불균형한 데이터 세트를 다룰 때 어떠한 기법을 적용할 수 있는 지 알아봤다. 보다 자세하게 어떻게 적용하는지는 다른 포스팅에서 따로 언급을 하겠다. 내용을 정리해보면 다음과 같다.
- Oversampling, Undersampling, Data Augmentation을 활용하여 데이터 자체를 수정
- 가중치 조정, 특수한 손실 함수, 앙상블 학습 등을 적용하여 알고리즘을 조정
- 정확도 외에 F1-score, AUC-ROC 등의 평가 지표를 활용하여 모델 검증
앞으로 마주한 데이터 불균형 문제에서는 이 방법들을 조합하여 적용하는 것을 고려해보면 좋을 것 같다.
'인공지능 > ML-DL 기초' 카테고리의 다른 글
| Cross-Entropy란? (3) | 2024.10.02 |
|---|---|
| Inductive bias란? (2) | 2024.05.28 |
| 모델의 평가 방식: Evaluation Metric (0) | 2024.03.13 |
| Regularization(모델의 규제, 정칙화)에 대한 이해 (3) | 2023.12.23 |
| 활성화 함수에 대한 이해 (3) | 2023.12.01 |