불균형 데이터를 다루는 방법은 꼭 샘플링만 있는 것은 아니다.
일부 모델은 class_weight 옵션을 통해 클래스별 가중치를 자동으로 조정할 수 있다.
이 방법은 별도의 데이터 증강 없이도 불균형 문제를 완화할 수 있다는 장점이 있다.
⚖️ Class Weight의 기본 아이디어
- 다수 클래스보다 소수 클래스에 더 큰 가중치를 부여한다.
- 손실 함수(loss function)를 계산할 때 소수 클래스 오류에 더 큰 패널티를 준다.
- scikit-learn에서는
class_weight="balanced"옵션을 제공하며, 클래스 빈도에 반비례하도록 자동 계산된다.
👉 즉, 데이터 개수를 억지로 맞추는 대신 학습 과정에서 균형을 맞추는 방식이다.
📊 적용 가능한 모델
- 로지스틱 회귀:
LogisticRegression(class_weight="balanced") - 랜덤 포레스트:
RandomForestClassifier(class_weight="balanced") - XGBoost / LightGBM:
scale_pos_weight또는class_weight파라미터 제공
샘플링 기법과 달리, 한 줄 옵션으로 적용 가능하다는 점이 큰 장점이다.
🔍 SMOTE / SMOTENC vs Class Weight
| 구분 | SMOTE / SMOTENC | Class Weight |
|---|---|---|
| 접근 방식 | 데이터 수준 (샘플링) | 모델 수준 (손실 함수 가중치) |
| 적용 대상 | 학습 데이터 자체를 수정 | 모델 학습 과정에서 가중치 반영 |
| 장점 | 데이터 균형을 직접 맞춤, 시각적으로 명확 | 간단 적용 가능, 데이터 손실 없음 |
| 단점 | 합성 샘플 과적합 위험, 계산량 증가 | 성능 개선 제한적, 극단적 불균형에 취약 |
| 적합한 상황 | 소수 클래스 데이터가 너무 적을 때 | 빠른 baseline 확인, 샘플링과 병행 |
👉 정리하자면, SMOTE/SMOTENC는 데이터 자체를 바꾸는 방법,
Class Weight는 모델 학습 방식을 조정하는 방법이라고 할 수 있다.
🧪 우리의 실험 결과
제조 기업 데이터를 대상으로 class_weight 옵션을 적용해보았다.
| 모델 | 기법 | F1-macro | PR-AUC | 해석 |
|---|---|---|---|---|
| Logistic Regression | baseline | 0.42 | 0.43 | 기준 성능 |
| Logistic Regression | + class_weight | 0.33 | 0.34 | 성능 저하 발생 |
| RandomForest | baseline | 0.41 | 0.45 | 기준 성능 |
| RandomForest | + class_weight | 0.33 | 0.44 | F1 성능 저하, PR-AUC 비슷 |
👉 실험 결과, class_weight 옵션만으로는 성능이 개선되지 않았다.
일부 모델에서는 F1-macro가 오히려 하락하였고, PR-AUC는 큰 차이가 없었다.
🚀 다음 단계
Class Weight는 빠르게 적용할 수 있는 간단한 방법이지만,
우리의 실험에서는 샘플링 기법에 비해 성능 개선 효과가 크지 않았다.
따라서 실무에서는 baseline 확인용 또는 샘플링 기법과의 조합으로 사용하는 것이 적합하다.
다음 글에서는 지금까지 다룬 SMOTE, SMOTENC, Class Weight를 종합적으로 비교하고,
실무에서 어떤 상황에 어떤 기법을 선택하면 좋을지 정리하고자 한다.
✅ 마무리
Class Weight는 "데이터를 건드리지 않고 모델 학습 과정에서 균형을 잡는 방법 이라는 점에서 의미가 있다.
하지만 단독으로는 성능 향상이 제한적이었다.
👉 결국 불균형 데이터 대응은 데이터 기법과 모델 기법을 함께 고려해야 한다는 사실을 확인할 수 있었다.
'데이터 사이언스 > 프로젝트' 카테고리의 다른 글
| [아이펠톤 프로젝트 회고] 누설자속 데이터 기반 교정 시점 예측 (0) | 2025.09.19 |
|---|---|
| [데이터 불균형 실험노트] SMOTE vs SMOTENC vs Class Weight, 최종 승자는 누구일까? (0) | 2025.09.03 |
| [데이터 불균형 실험노트] SMOTENC: 범주형 변수까지 공략하기 (0) | 2025.09.03 |
| [데이터 불균형 실험노트] SMOTE: 합성 데이터로 불균형을 돌파하다 (0) | 2025.09.03 |
| [데이터 불균형 실험노트] 불균형 데이터란? Accuracy의 함정을 격파하기 (0) | 2025.09.03 |