클래스 불균형은 한 클래스의 샘플 수가 다른 클래스의 샘플 수보다 현저히 적은 분류 모델에서 흔히 발생하는 문제입니다. 이는 사기 적발, 의학적 소견 및 희귀 사건 예측과 같은 다양한 작업에서 수행할 수 있습니다. 이 블로그 게시물에서는 클래스 불균형으로 인한 문제와 이 문제를 해결하는 데 사용할 수 있는 몇 가지 방법을 다룰 것입니다.
클래스 불균형의 도전
클래스 불균형의 주된 문제는 예측 정확도가 부족한 편향된 모델로 이어질 수 있다는 것입니다. 대부분 분류 모델은 전체적인 정확도를 극대화하도록 설계되었기 때문에 다수 클래스에 집중하고 소수 클래스를 무시하는 경향이 있습니다. 이것은 소수 클래스에 대한 높은 위음성 비율에 영향을 미칠 수 있으며, 이는 많은 긍정적인 예시가 부적절하게 부정적인 것으로 분류됨을 의미합니다.
이 문제를 설명하기 위해 클래스 A와 클래스 B의 두 클래스가 있는 데이터 세트가 있는 예를 살펴보겠습니다. 클래스 A에는 90%의 샘플이 있는 반면 클래스 B에는 10%의 샘플만 있습니다. 그러나 클래스 불균형을 계산하지 않고 이 데이터 세트에서 모델을 훈련한다면 모든 샘플을 클래스 A로 분류할 것입니다. 이것은 전반적으로 높은 정확도에 영향을 주지만 클래스 B 샘플을 예측하는 데는 소용이 없습니다.
클래스 불균형을 해결하는 방법
분류 모델의 클래스 불균형을 해결하는 데 사용할 수 있는 여러 가지 방법이 있습니다. 아래에서 가장 일반적인 세 가지를 살펴볼 것입니다.
1. 소수 집단에 대한 오버 샘플링
클래스 불균형을 해결하는 한 가지 방법은 소수 클래스를 과도하게 샘플링하는 것입니다. 여기에는 샘플을 복제하거나 새 샘플을 생성하여 소수 클래스에 대한 새로운 샘플을 만드는 작업이 포함됩니다. 이것은 랜덤 오버샘플링 또는 SMOTE(Synthetic Minority Oversampling Technique)와 유사한 방법을 사용하여 수행할 수 있습니다.
# 랜덤 오버샘플링 예시
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)
# SMOTE 예시
from imblearn.over_sampling import SMOTE
smote = SMPTE(random_state=0)
X_resampled, y_resampled = smote.fit_resample(X, y)
2. 다수 클래스의 언더샘플링
클래스 불균형을 해결하는 또 다른 방법은 다수 클래스를 언더샘플링하는 것입니다. 여기에는 소수 클래스의 샘플 수와 일치하도록 다수 클래스의 샘플 수를 줄이는 작업이 포함됩니다. 이는 무작위 언더샘플링 또는 Tomek 링크와 유사한 기술을 사용하여 수행할 수 있습니다.
# 랜덤 언더샘플링 예시
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X, y)
# Tomek 링크 예시
from imblearn.under_sampling import TomekLinks
tl = TomekLinks()
X_resampled, y_resampled = tl.fit_resample(X, y)
3. 분류 알고리즘 수정
클래스 불균형을 해결하는 세 번째 방법은 분류 알고리즘 자체를 수정하는 것입니다. 여기에는 비용에 민감한 학습 또는 앙상블 학습과 유사하게 불균형 데이터 세트용으로 특별히 설계된 알고리즘을 사용하는 것이 포함될 수 있습니다. 불균형을 조정하기 위해 알고리즘의 결정 임계값을 수정하는 작업도 포함될 수 있습니다.
# 비용에 민감한 학습 예시
from sklearn.svm import SVC
from sklearn.utils import class_weight
class_weights = class_weight.compute_class_weight('balanced', classes=np.unique(y), y=y)
svc = SVC(kernel='linear', class_weight=class_weights)
# 앙상블 학습 예시
from imblearn.ensemble import EasyEnsembleClassifier
eec = EasyEnsembleClassifier(n_estimators=10)
eec.fit(X, y)
결론적으로 클래스 불균형은 예측 정확도가 부족한 편향된 모델로 이어질 수 있는 분류 모델의 일반적인 문제입니다. 여전히 이 문제를 해결하는 데 사용할 수 있는 몇 가지 방법이 있습니다. 소수 클래스의 오버샘플링, 다수 클래스의 언더샘플링, 분류 알고리즘 자체 수정 등이 있습니다.
클래스 불균형을 처리할 때 정밀도, 재현율 및 F1 점수와 유사한 기준을 사용하여 모델의 성능을 정확하게 평가하는 것이 중요합니다. 또한 각 클래스에 대한 false positives 및 false negatives 비용을 고려하고 결과적으로 알고리즘의 결정 임계값을 조정시키는 것이 중요합니다.
클래스 불균형을 해결함으로써 다양한 작업에서 분류 모델의 정확성과 유용성을 개선시킬 수 있습니다. imbalanced-learn 및 scikit-learn과 같은 Python 라이브러리의 도움으로 이러한 방식을 적용하는 것이 이제 더 쉬워졌습니다.
'IT' 카테고리의 다른 글
Python의 nunique() 함수 이해: 예제 가이드 (0) | 2023.04.24 |
---|---|
분석 모델 프로그래밍 Python 코드 가이드 (0) | 2023.04.23 |
나만의 감정 분류 설계 및 평가 Python 예시와 함께 제공 (0) | 2023.04.21 |
Unixtime을 사용한 시간 점수 계산: Python 예제 가이드 (0) | 2023.04.20 |
Python을 사용하여 Z-Score로 데이터 분석 피처 표준화 (0) | 2023.04.19 |