25분
불균형 데이터 처리: SMOTE & Class Weights
Day 3: 고장 분류 모델
불균형 데이터 처리: SMOTE & Class Weights
예지보전 — 설비 고장 예측 시스템 > Day 3: 고장 분류 모델
학습 목표
예지보전 데이터의 클래스 불균형 문제를 이해한다 SMOTE, Class Weights, Under-sampling 전략을 비교할 수 있다 상황에 맞는 불균형 처리 방법을 선택할 수 있다
클래스 불균형 문제
설비는 대부분 정상이고, 고장은 드물다.
[일반적인 PdM 데이터 분포]
정상: ████████████████████████ 90%
경고: ████ 7%
고장: █ 3%
→ 모델이 "항상 정상"이라고 예측해도 정확도 90%
→ 하지만 고장을 하나도 못 찾음 (Recall = 0%)
해결 전략 3가지
1. Class Weights (가중치)
소수 클래스의 손실에 가중치를 더 부여한다.
# sklearn
rf = RandomForestClassifier(class_weight='balanced')
# PyTorch
weights = torch.tensor([1.0, 3.0, 10.0]) # 고장에 10배 가중
criterion = nn.CrossEntropyLoss(weight=weights)
| 장점 | 단점 |
|---|---|
| 구현 간단 | 최적 가중치 탐색 필요 |
| 원본 데이터 유지 | 과적합 가능 |
2. SMOTE (합성 오버샘플링)
소수 클래스의 합성 샘플을 생성한다.
[SMOTE 원리]
기존 데이터: X X X (소수 클래스 3개)
Step 1: X1과 X2 사이에 새 점 생성
X---*---X X
Step 2: X2와 X3 사이에 새 점 생성
X---*---X---*---X
결과: 5개로 증가 (실제 + 합성)
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
| 장점 | 단점 |
|---|---|
| 정보 손실 없음 | 과적합 위험 (시계열 주의) |
| 소수 클래스 보강 | 합성 데이터 품질 |
3. Under-sampling (다수 클래스 축소)
다수 클래스에서 일부만 사용한다.
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)
| 장점 | 단점 |
|---|---|
| 빠른 학습 | 정보 손실 |
| 균형 잡힌 데이터 | 다수 클래스 패턴 놓침 |
전략 선택 가이드
| 상황 | 추천 전략 |
|---|---|
| 데이터 충분, 불균형 심하지 않음 | Class Weights |
| 소수 클래스 매우 적음 (<100건) | SMOTE |
| 데이터 매우 많고 학습 느림 | Under-sampling |
| 실무 추천 | Class Weights + 임계값 조정 |
핵심: 시계열 데이터에 SMOTE를 적용할 때는 시간 순서를 무시하지 않도록 피처 레벨에서 적용한다. 원시 시퀀스에 직접 SMOTE를 쓰면 비현실적인 패턴이 생긴다.
AI로 학습하기 — 꿀팁
✅SMOTE 예지보전 적용 효과 검증AI 학습 팁
SMOTE가 항상 불균형 데이터 문제를 해결한다는 믿음은 잘못된 경우가 많습니다. 예지보전 맥락에서 실제 한계를 점검하세요.
'예지보전 데이터 불균형 문제는 SMOTE를 쓰면 해결된다'는 주장을 비판적으로 검토해주세요. (1) SMOTE가 예지보전 시계열 데이터에 적용됐을 때 발생하는 구체적 문제(시간 순서 위반, 물리적으로 불가능한 합성 샘플 생성 등), (2) 설비 고장률 0.1% 이하의 극단적 불균형 상황에서 SMOTE vs Class Weights vs Under-sampling의 실제 F1 Score 개선 효과 비교(논문 또는 벤치마크 기반), (3) 예지보전에서 SMOTE보다 효과적인 것으로 알려진 대안 접근법과 그 이유를 알려주세요.
이 팁이 도움이 됐나요?