[python] scikit-learn을 활용한 클래스 불균형 처리 결과 시각화

소개

데이터셋에서 클래스 간에 불균형이 존재하는 경우, 모델 학습과 평가 과정에서 정확한 결과를 얻기 어렵습니다. scikit-learn은 이러한 클래스 불균형을 처리하기 위한 다양한 기능을 제공합니다. 이 글에서는 scikit-learn을 사용하여 클래스 불균형을 처리한 후, 결과를 시각화하는 방법에 대해 알아보겠습니다.

클래스 불균형 처리

scikit-learn에서 클래스 불균형을 처리하기 위한 주요 기능은 다음과 같습니다:

  1. 언더샘플링(Undersampling): 다수 클래스의 샘플을 제거하여 클래스 간의 균형을 맞춥니다.
  2. 오버샘플링(Oversampling): 소수 클래스의 샘플을 복제하여 클래스 간의 균형을 맞춥니다.
  3. 합성샘플링(Synthetic Sampling): 소수 클래스의 샘플을 합성하여 클래스 간의 균형을 맞춥니다.

이러한 기능들을 사용하여 클래스 불균형을 처리하고, 처리된 데이터셋을 활용하여 모델 학습을 수행합니다.

결과 시각화

모델을 학습하고 예측한 결과를 시각화하여 클래스 불균형 처리의 효과를 확인할 수 있습니다. 예를 들어, 다수 클래스와 소수 클래스의 분포를 시각화하여 균형이 맞춰졌는지 확인할 수 있습니다. 또한, 정확도, 정밀도, 재현율 등의 평가 지표를 시각화하여 처리 결과를 비교할 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 데이터셋 생성
X, y = make_classification(
    n_samples=1000,
    weights=[0.95, 0.05],  # 클래스 비율 설정
    random_state=42
)

# 클래스 불균형 처리
# (이 부분에 언더샘플링, 오버샘플링, 합성샘플링 코드를 추가하면 됩니다.)

# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 로지스틱 회귀 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측 결과 시각화
y_pred = model.predict(X_test)

plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred)
plt.title("Predicted Results")
plt.show()

# 평가 지표 시각화
report = classification_report(y_test, y_pred, output_dict=True)
accuracy = report['accuracy']
precision = report['1']['precision']
recall = report['1']['recall']

metrics = ['Accuracy', 'Precision', 'Recall']
values = [accuracy, precision, recall]

plt.bar(metrics, values)
plt.title("Evaluation Metrics")
plt.show()

위의 예제 코드는 scikit-learn의 make_classification 함수를 사용하여 클래스 불균형이 있는 데이터셋을 생성하고, 로지스틱 회귀 모델을 학습한 후 예측 결과를 시각화하는 방법을 보여줍니다.

참고 자료