본문 바로가기

STUDY/인공지능

[머신러닝] 데이터 불균형 처리 방법 및 예제 코드

728x90

불균형한 데이터셋을 처리하는 데 도움이 되는 몇 가지 방법은 아래와 같습니다.

 

1. 언더샘플링 (Undersampling):
언더샘플링은 다수 클래스의 데이터를 일부만 샘플링하여 데이터셋을 균형있게 만드는 방법입니다. 

 

이를 통해 다수 클래스의 데이터를 일부 제거함으로써 데이터셋의 클래스 비율을 조정할 수 있습니다. 그러나 이 방법은 정보 손실을 가져올 수 있으므로 적절한 샘플링 전략을 선택하는 것이 중요합니다.

2. 오버샘플링 (Oversampling):
오버샘플링은 소수 클래스의 데이터를 복제하거나 인공적으로 생성하여 데이터셋에 추가하는 방법입니다. 

 

이를 통해 소수 클래스의 데이터를 늘림으로써 클래스 비율을 조정할 수 있습니다. 일반적으로 SMOTE (Synthetic Minority Over-sampling Technique)와 같은 알고리즘을 사용하여 인공적으로 데이터를 생성하는 방법이 사용됩니다.

3. 클래스 가중치 지정 (Class Weighting):
일부 머신러닝 알고리즘은 클래스 가중치를 설정하는 기능을 제공합니다. 

 

소수 클래스의 데이터에 높은 가중치를 부여하여 모델이 소수 클래스에 더 집중하도록 유도할 수 있습니다. 이는 불균형 데이터셋에서 분류 성능을 향상시키는 데 도움이 될 수 있습니다.

4. 앙상블 학습 (Ensemble Learning):
불균형한 데이터셋에서는 앙상블 학습 기법이 효과적일 수 있습니다. 

 

앙상블 학습은 여러 개의 기본 모델을 조합하여 예측을 수행하는 방식으로, 다수 클래스와 소수 클래스를 동시에 잘 처리할 수 있는 강력한 모델을 만들 수 있습니다. 예를 들어, AdaBoost와 같은 앙상블 기법은 불균형 데이터셋에서 성능이 좋을 수 있습니다.

 

5. 언더샘플링과 오버샘플링 적용 예제코드:

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from imblearn.under_sampling import RandomUnderSampler
from imblearn.over_sampling import SMOTE
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 불균형한 데이터셋 생성
X, y = make_classification(n_samples=1000, n_features=10, weights=[0.1, 0.9], random_state=42)

# 원본 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 언더샘플링 적용
rus = RandomUnderSampler(random_state=42)
X_train_undersampled, y_train_undersampled = rus.fit_resample(X_train, y_train)

# 오버샘플링 적용
smote = SMOTE(random_state=42)
X_train_oversampled, y_train_oversampled = smote.fit_resample(X_train, y_train)

# 모델 학습 및 예측 - 언더샘플링
model_undersampled = LogisticRegression()
model_undersampled.fit(X_train_undersampled, y_train_undersampled)
y_pred_undersampled = model_undersampled.predict(X_test)

# 모델 학습 및 예측 - 오버샘플링
model_oversampled = LogisticRegression()
model_oversampled.fit(X_train_oversampled, y_train_oversampled)
y_pred_oversampled = model_oversampled.predict(X_test)

# 분류 보고서 출력
print("언더샘플링 결과:")
print(classification_report(y_test, y_pred_undersampled))
print("오버샘플링 결과:")
print(classification_report(y_test, y_pred_oversampled))

 

728x90