python, 전처리, 통계, 가설검정, 기계학습, 회귀, 분류, 군집, 모델 학습, 모델 평가
불균형 데이터(Imbalanced Data)는 타겟 클래스 간 샘플 수의 차이가 큰 데이터셋을 의미한다. 예를 들어, 사기 거래 탐지 문제에서 정상 거래가 99%, 사기 거래가 1%인 경우가 대표적이다. 불균형 데이터로 학습된 모델은 다수 클래스에 편향되어 소수 클래스를 제대로 예측하지 못하는 문제가 발생한다. 이 장에서는 불균형 데이터의 문제점을 진단하고, 데이터 수준 처리(언더샘플링, 오버샘플링, SMOTE)와 모델 수준 처리(클래스 가중치 조정) 방법을 학습한다.
예제: 데이터 로드
import seaborn as snsimport pandas as pdimport numpy as np# 데이터 로드df = sns.load_dataset("penguins").dropna(subset=["species"])print("데이터 크기:", df.shape)print("\n클래스 정보:")print(df["species"].unique())
데이터 크기: (344, 7)
클래스 정보:
<StringArray>
['Adelie', 'Chinstrap', 'Gentoo']
Length: 3, dtype: str
9.1 불균형 데이터의 문제점
불균형 데이터로 학습된 모델은 다수 클래스만 예측하는 경향이 있다. 이 경우 전체 정확도(Accuracy)는 높아 보이지만, 실제로 중요한 소수 클래스는 거의 예측하지 못한다.
문제 상황 예시
의료 진단 모델에서 질병이 있는 경우가 5%, 없는 경우가 95%라고 가정하자.
지표
값
해석
전체 정확도
95%
모든 환자를 “질병 없음”으로 예측해도 달성
질병 재현율
10%
실제 질병 환자 중 10%만 탐지
결과
잘못된 모델
높은 정확도에도 불구하고 실제로는 쓸모없음
이는 “잘 맞춘 것처럼 보이지만 중요한 건 다 틀림” 상황으로, 정확도만으로는 모델의 실제 성능을 평가할 수 없음을 보여준다.
from sklearn.linear_model import LogisticRegression# 클래스 가중치 자동 조정model_balanced = LogisticRegression( class_weight="balanced", max_iter=1000, random_state=42)# 학습model_balanced.fit(X_train, y_train)y_pred_balanced = model_balanced.predict(X_test)print("가중치 조정 모델 평가:")print(classification_report(y_test, y_pred_balanced))
도메인 지식에 따라 클래스별 가중치를 수동으로 설정할 수 있다. 특정 클래스의 오분류 비용이 클 때 유용하다.
예제: 수동 클래스 가중치
# 수동 가중치 설정 (중요한 클래스에 더 높은 가중치)weights = {"Adelie": 1.0,"Gentoo": 1.5,"Chinstrap": 2.0# 가장 희귀한 클래스에 높은 가중치}model_weighted = LogisticRegression( class_weight=weights, max_iter=1000, random_state=42)model_weighted.fit(X_train, y_train)y_pred_weighted = model_weighted.predict(X_test)print("수동 가중치 모델 평가:")print(classification_report(y_test, y_pred_weighted))
from imblearn.ensemble import BalancedRandomForestClassifier# Balanced Random Forest 모델 생성brf = BalancedRandomForestClassifier( n_estimators=100, random_state=42, n_jobs=-1)# 학습 및 예측brf.fit(X_train, y_train)y_pred_brf = brf.predict(X_test)print("Balanced Random Forest 평가:")print(classification_report(y_test, y_pred_brf))
이 장에서는 불균형 데이터의 문제점과 다양한 처리 방법을 학습했다. 주요 내용은 다음과 같다.
불균형 데이터 처리 방법 비교
방법
원리
장점
단점
적용 상황
언더샘플링
다수 클래스 제거
빠름, 과적합 감소
정보 손실
데이터 충분, 노이즈 많음
오버샘플링
소수 클래스 복제
정보 손실 없음
과적합 위험
데이터 적음
SMOTE
합성 샘플 생성
과적합 감소, 공간 확장
노이즈 증폭
데이터 적음, 연속형 변수
클래스 가중치
모델 학습 조정
데이터 변경 없음
극심한 불균형 한계
데이터 충분, 원본 유지
앙상블
여러 모델 결합
강건성 높음
계산 비용 높음
성능 중요, 트리 모델
권장 처리 전략
상황
1순위 권장
2순위 권장
이유
데이터 적음 (수천 개 이하)
SMOTE
오버샘플링
정보 손실 최소화
데이터 많음 (수만 개 이상)
클래스 가중치
언더샘플링
원본 보존, 학습 속도
노이즈 많음
언더샘플링
Borderline-SMOTE
노이즈 제거 효과
범주형 변수 포함
SMOTE-NC
클래스 가중치
범주형 처리 가능
트리 기반 모델
클래스 가중치
Balanced RF
가중치 기본 지원
극심한 불균형 (100:1 이상)
SMOTE + 가중치
앙상블
복합적 접근
불균형 데이터 처리 프로세스
불균형 진단: 클래스 분포 확인 및 비율 계산
평가 지표 설정: Precision, Recall, F1-score, ROC-AUC 등 선택
처리 방법 선택: 데이터 크기, 특성, 모델에 따라 결정
Pipeline 구성: 데이터 누수 방지를 위한 안전한 적용
교차 검증: Stratified K-Fold로 성능 평가
하이퍼파라미터 튜닝: 처리 방법별 최적 파라미터 찾기
주의사항
데이터 누수 방지: 샘플링은 반드시 학습 데이터에만 적용
평가 지표: 정확도 대신 Recall, F1-score 등 사용
Stratified Split: 학습/테스트 분리 시 클래스 비율 유지
과적합 모니터링: 학습/검증 성능 차이 확인
불균형 데이터 처리는 실무에서 매우 흔하게 마주치는 문제이다. 데이터의 특성과 비즈니스 목표를 고려하여 적절한 방법을 선택하고, Pipeline을 사용하여 안전하게 적용하는 것이 중요하다. 이제 전처리의 모든 과정을 마쳤으며, 다음 단계로 정제된 데이터를 활용한 모델링을 진행할 수 있다.