본문 바로가기
AI/Machine-Learning

불균형 데이터 처리 - 샘플링

by Wikinist 2023. 9. 3.

불균형 데이터를 다루는 것은 기계 학습 모델을 훈련시킬 때 중요한 과제 중 하나입니다. scikit-learn의 imbalanced-learn 라이브러리는 불균형 데이터셋에 대한 다양한 샘플링, 가중치 조정 및 리샘플링 기술을 제공하여 이러한 문제를 해결하는 데 도움을 줍니다. 아래에서는 imbalanced-learn 모듈을 사용하여 불균형 데이터를 다루는 주요 기술과 함수들에 대해 간단히 설명하겠습니다.

오버샘플링 (Over-sampling)

오버샘플링은 소수 클래스의 샘플 수를 증가시켜 데이터셋의 클래스 균형을 조정하는 기술입니다.
RandomOverSampler, SMOTE, ADASYN 등 다양한 오버샘플링 방법을 imbalanced-learn에서 제공합니다.

RandomOverSampler

RandomOverSampler는 소수 클래스의 샘플을 복제하여 데이터셋의 클래스 균형을 조정하는 가장 간단한 오버샘플링 방법 중 하나입니다.
소수 클래스의 샘플을 무작위로 선택하고 복제하여 샘플 수를 증가시킵니다.
장점: 구현이 간단하고 빠르며 많은 데이터가 없을 때 유용합니다.
단점: 무작위로 복제하므로 학습 데이터에 노이즈가 추가될 수 있습니다.

SMOTE (Synthetic Minority Over-sampling Technique)

SMOTE는 소수 클래스(다수 클래스에 비해 샘플이 적은 클래스)의 샘플을 합성하여 데이터셋을 균형있게 만드는 방법으로 작동합니다. 다음은 SMOTE의 주요 아이디어와 작동 방식에 대한 설명입니다:

  1. 소수 클래스의 각 샘플에 대해 고려합니다.
  2. SMOTE는 이 샘플 주변에 있는 최근접 이웃(nearest neighbors)을 찾습니다. 일반적으로, 이웃은 유클리디안 거리(Euclidean distance)를 사용하여 측정됩니다.
  3. 샘플과 그 최근접 이웃 사이의 선상에 있는 임의의 점을 선택합니다. 이때, 0과 1 사이의 임의의 값인 비율을 사용하여 샘플과 이웃 사이의 위치를 조절합니다.
  4. 선택한 점을 사용하여 새로운 합성 샘플을 생성합니다. 이 합성 샘플은 원래 샘플과 그 최근접 이웃 사이의 위치를 바탕으로 생성되며, 샘플의 특성 값들을 조정하여 새로운 데이터 포인트를 얻습니다.
  5. 이렇게 생성된 합성 샘플을 원래 데이터셋에 추가하여 오버샘플링을 수행합니다.

SMOTE의 주요 장점 중 하나는 새로 생성된 합성 샘플이 실제 데이터 포인트와 유사하게 보이므로 정보 손실이 적습니다. 이로써 모델이 더 잘 일반화되고 클래스 불균형 문제를 완화할 수 있습니다. 그러나 SMOTE도 몇 가지 주의할 점이 있습니다. 예를 들어, SMOTE는 모델이 노이즈에 민감해질 수 있으며, 데이터가 선형 분리 가능한 경우에는 더 잘 작동합니다. 또한, SMOTE를 사용할 때는 적절한 비율을 설정하는 것이 중요하며, 너무 많은 합성 샘플을 생성하면 과적합(overfitting) 문제가 발생할 수 있습니다.

ADASYN (Adaptive Synthetic Sampling)

 ADASYN은 소수 클래스(다수 클래스에 비해 샘플이 적은 클래스)의 샘플을 합성하여 데이터셋을 균형있게 만드는 데 중점을 둡니다. 그러나 SMOTE와 달리 ADASYN은 합성할 샘플의 수를 자동으로 조절하여 더욱 불균형한 데이터셋에서도 효과적으로 작동하도록 설계되었습니다.

ADASYN의 주요 아이디어와 작동 방식에 대한 설명은 다음과 같습니다:

  1. ADASYN은 소수 클래스의 각 샘플에 대해 샘플 주변에 있는 최근접 이웃(nearest neighbors)을 찾습니다. 이때, 유클리디안 거리(Euclidean distance) 등의 거리 측정 방법을 사용합니다.
  2. 각 샘플에 대해 먼저 해당 샘플과 그 최근접 이웃 사이의 거리 비율을 계산합니다. 이 거리 비율은 해당 샘플과 최근접 이웃 사이의 거리를 소수 클래스의 평균 거리로 나눈 값입니다. 이 거리 비율은 샘플마다 다르게 계산됩니다.
  3. ADASYN은 소수 클래스의 각 샘플에 대해 설정한 임계값을 기반으로 합성할 샘플의 수를 조정합니다. 임계값은 샘플마다 다르며, 거리 비율이 임계값을 초과하는 샘플에 대해 더 많은 합성을 수행합니다. 이렇게 함으로써 소수 클래스의 어려운 예제에 더 많은 합성 샘플을 생성하여 모델이 더 잘 일반화되도록 도와줍니다.
  4. 합성된 샘플은 원래 데이터셋에 추가되어 오버샘플링을 수행합니다.

ADASYN은 데이터의 불균형 정도에 따라 자동으로 합성 샘플의 수를 조절하므로, 더 어려운 예제에 더 많은 주의를 기울이며 합성합니다. 이로써 SMOTE와 같은 고정된 비율을 사용하는 방법보다 데이터셋의 균형을 더 효과적으로 조절할 수 있습니다. ADASYN은 불균형한 클래스 분포를 가진 데이터셋에서 분류 모델의 성능을 향상시키는 데 도움을 줄 수 있습니다.

이러한 오버샘플링 기술은 데이터셋에 따라 다르며, 어떤 기술을 사용할지는 문제의 특성과 데이터셋의 크기에 따라 달라집니다. 때때로 실험을 통해 어떤 방법이 가장 잘 작동하는지 확인하는 것이 좋습니다.

언더샘플링 (Under-sampling)

언더샘플링은 다수 클래스의 샘플 수를 줄여 데이터셋의 클래스 균형을 조정하는 기술입니다.
RandomUnderSampler, TomekLinks, EditedNearestNeighbours 등 다양한 언더샘플링 방법을 사용할 수 있습니다.

RandomUnderSampler

RandomUnderSampler는 다수 클래스의 샘플을 무작위로 제거하여 데이터셋의 클래스 균형을 조정하는 간단한 언더샘플링 방법 중 하나입니다.
다수 클래스의 샘플 중 일부를 무작위로 선택하여 제거하여 소수 클래스와 다수 클래스 간의 샘플 수 차이를 줄입니다.
장점: 구현이 간단하고 빠르며 작은 데이터셋에서 효과적일 수 있습니다.
단점: 정보 손실이 발생할 수 있으며, 중요한 다수 클래스 샘플이 제거될 수 있습니다.

TomekLinks

TomekLinks는 불균형한 데이터셋에서 발생하는 클래스 불균형 문제를 해결하기 위한 언더샘플링(undersampling) 기법 중 하나입니다. TomekLinks는 주로 데이터셋에서 다수 클래스와 소수 클래스 간의 결정 경계를 개선하고 노이즈를 제거하기 위해 사용됩니다.

TomekLinks는 다음과 같은 원리로 작동합니다:

  1. TomekLinks는 두 가지 클래스 사이에 속하는 가까운 인스턴스들을 식별합니다. 이러한 가까운 인스턴스 쌍을 TomekLinks pairs 또는 Tomek pairs라고 합니다.
  2. Tomek pairs는 서로 다른 클래스에 속한 인스턴스가 쌍으로 구성되는데, 이 중에서 다수 클래스에 속한 인스턴스가 소수 클래스에 가장 가깝게 위치한 인스턴스와만 연결됩니다.
  3. 이렇게 연결된 인스턴스는 제거되어 언더샘플링이 이루어집니다. 즉, 다수 클래스에 속한 가까운 이웃을 제거함으로써 소수 클래스의 경계를 더욱 명확하게 만듭니다.

TomekLinks를 제거하면 클래스 간 경계가 더욱 명확해지고 노이즈가 줄어듭니다.
장점: 다수 클래스와 소수 클래스 사이의 경계를 개선하고 노이즈를 감소시킬 수 있습니다.
단점: 정보 손실이 발생할 수 있으며, 클래스 간 거리가 멀 경우 효과적이지 않을 수 있습니다.

EditedNearestNeighbours (ENN)

Edited Nearest Neighbors (ENN)는 클래스 불균형 문제를 해결하기 위한 언더샘플링(undersampling) 기법 중 하나로, 데이터셋에서 다수 클래스의 특이한 샘플을 제거하여 데이터셋을 더 균형있게 만드는 방법입니다. 이 방법은 주로 데이터셋에서 노이즈로 간주되는 다수 클래스의 샘플을 제거하여 모델의 성능을 향상시키려고 할 때 사용됩니다.

Edited Nearest Neighbors의 작동 방식은 다음과 같습니다:

  1. ENN은 다수 클래스의 각 샘플에 대해 가장 가까운 이웃을 찾습니다. 이웃은 주로 유클리디안 거리(Euclidean distance)를 사용하여 측정됩니다.
  2. ENN은 각 샘플과 해당 이웃 간의 레이블(클래스)을 비교합니다. 만약 두 샘플의 레이블이 다르다면, 해당 샘플은 노이즈로 간주되고 제거 대상이 됩니다.
  3. ENN은 이러한 노이즈로 간주되는 샘플을 데이터셋에서 제거합니다. 이로써 불균형한 클래스 분포에서 발생하는 잡음을 줄이고, 모델이 더 정확하게 학습하도록 도움을 줍니다.

Edited Nearest Neighbors의 주요 목표는 데이터셋에서 다수 클래스의 노이즈를 제거하여 모델의 성능을 향상시키는 것입니다. 그러나 ENN을 사용할 때 주의해야 할 점은 언더샘플링으로 인해 정보 손실이 발생할 수 있다는 것입니다. 노이즈로 간주된 샘플이 실제 유용한 정보를 포함하고 있을 수 있으므로, ENN을 적용하기 전에 충분한 분석과 실험을 수행하여 모델의 성능을 최적화해야 합니다. ENN은 클래스 불균형을 다루는 방법 중 하나로 고려할 수 있지만, 데이터셋의 특성과 문제에 따라 다른 언더샘플링 기법을 고려해야 합니다.

복합샘플링 (Combined Sampling)

오버샘플링과 언더샘플링을 조합하여 불균형 데이터에 대한 더 나은 균형을 찾을 수 있습니다.
SMOTEENN 및 SMOTETomek과 같은 방법들이 있습니다.

SMOTEENN (SMOTE + Edited Nearest Neighbours)

SMOTEENN은 SMOTE (Synthetic Minority Over-sampling Technique)와 ENN (Edited Nearest Neighbors) 두 가지 다른 샘플링 기법을 결합하여 클래스 불균형 문제를 해결하기 위한 복합 샘플링(ensemble sampling) 기법입니다. 이 방법은 소수 클래스의 샘플을 합성하고 동시에 다수 클래스의 이상치나 노이즈를 제거하여 데이터셋을 균형있게 만듭니다. SMOTEENN은 클래스 불균형 문제를 처리하면서 모델의 성능을 향상시킬 수 있는 강력한 방법 중 하나입니다.

SMOTEENN의 주요 작동 방식은 다음과 같습니다:

  1. 먼저, SMOTE를 사용하여 소수 클래스의 샘플을 합성합니다. SMOTE는 소수 클래스의 샘플 주변에 가상의 샘플을 생성하여 데이터셋을 오버샘플링합니다. 이로써 소수 클래스의 샘플 수가 늘어나고 클래스 간 균형을 조정합니다.
  2. 합성된 가상 샘플을 포함하여 데이터셋을 사용하여 ENN을 적용합니다. ENN은 데이터셋에서 다수 클래스의 이상치나 노이즈로 간주되는 샘플을 제거합니다. 이로써 데이터셋에서 불필요한 다수 클래스 샘플을 줄이고, 모델이 더 정확하게 학습할 수 있도록 도움을 줍니다.
  3. SMOTE와 ENN을 반복적으로 적용하여 최종적으로 균형 잡힌 데이터셋을 얻습니다. 이 데이터셋을 사용하여 모델을 훈련하고 분류나 예측 작업을 수행할 수 있습니다.

SMOTEENN의 장점 중 하나는 클래스 불균형 문제를 다루는 동시에 데이터셋에서의 노이즈나 이상치를 처리할 수 있다는 것입니다. 이러한 전처리 과정은 모델의 성능을 향상시키고, 과적합을 줄여주는 데 도움을 줄 수 있습니다. 그러나 SMOTEENN을 적용할 때에도 주의해야 할 점이 있습니다. 예를 들어, 적절한 SMOTE 및 ENN 매개변수 설정과 실험을 통한 최적화가 필요합니다. 또한, 데이터의 특성과 문제에 따라 다른 오버샘플링 및 언더샘플링 기법을 고려해야 합니다.

SMOTETomek (SMOTE + TomekLinks)

SMOTETomek은 SMOTE (Synthetic Minority Over-sampling Technique)와 TomekLinks 두 가지 다른 샘플링 기법을 결합하여 클래스 불균형 문제를 해결하기 위한 복합 샘플링(ensemble sampling) 기법입니다. 이 방법은 소수 클래스의 샘플을 합성하고 동시에 다수 클래스와 소수 클래스 간의 경계를 더 명확하게 만듭니다. SMOTETomek은 클래스 간의 거리를 증가시켜 클래스 분리를 촉진하면서 불필요한 소수 클래스 샘플을 줄이는 효과가 있습니다.

SMOTETomek의 주요 작동 방식은 다음과 같습니다:

  1. 먼저, SMOTE를 사용하여 소수 클래스의 샘플을 합성합니다. SMOTE는 소수 클래스의 샘플 주변에 가상의 샘플을 생성하여 데이터셋을 오버샘플링합니다. 이로써 소수 클래스의 샘플 수가 늘어나고 클래스 간 균형을 조정합니다.
  2. 합성된 가상 샘플을 포함하여 데이터셋을 사용하여 TomekLinks를 적용합니다. TomekLinks는 데이터셋에서 클래스 간의 경계를 정의하는 쌍(pair) 중에서 서로 소수 클래스와 다수 클래스에 속한 샘플이 가까이 위치한 쌍을 식별합니다. 이러한 TomekLinks pairs를 찾고, 이 쌍 중에서 다수 클래스에 속한 샘플을 제거합니다.
  3. 이 과정을 반복적으로 수행하여 최종적으로 균형 잡힌 데이터셋을 얻습니다. 이 데이터셋은 클래스 간 경계가 명확하게 정의되고, 노이즈와 이상치를 줄이며 모델의 성능을 향상시킬 수 있습니다.

SMOTETomek은 클래스 불균형 문제를 다루는 동시에 데이터셋에서의 노이즈나 이상치를 처리할 수 있다는 장점을 가지고 있습니다. 그러나 SMOTETomek을 적용할 때에도 적절한 매개변수 설정과 실험을 통한 최적화가 필요합니다. 

클래스 가중치 조정 (Class Weighting)

일부 알고리즘은 클래스 가중치를 조정하여 불균형 데이터에 대응할 수 있습니다. class_weight 파라미터를 설정하여 모델 학습 시 클래스별 가중치를 조절할 수 있습니다.

분류 성능 지표 (Classification Metrics)

불균형 데이터셋에서는 정확도만으로 모델의 성능을 판단하기 어려울 수 있습니다. imbalanced-learn은 다양한 분류 성능 지표를 계산할 수 있는 함수를 제공합니다.
precision, recall, F1-score, ROC-AUC 등을 계산할 수 있습니다.

이러한 기술들을 활용하여 불균형 데이터를 다룰 때, 데이터셋의 특성과 모델의 요구사항에 맞게 적절한 방법을 선택하고 조정하는 것이 중요합니다. imbalanced-learn은 이러한 다양한 기술을 편리하게 사용할 수 있도록 도와줍니다.

예제

오버샘플링 (RandomOverSampler 사용 예제)

from imblearn.over_sampling import RandomOverSampler
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 불균형한 데이터셋 생성
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, random_state=42)

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

# 오버샘플링 수행
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X_train, y_train)

# 이제 X_resampled 및 y_resampled를 사용하여 모델을 학습하고 평가할 수 있습니다.

언더샘플링 (RandomUnderSampler 사용 예제)

from imblearn.under_sampling import RandomUnderSampler
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 불균형한 데이터셋 생성
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, random_state=42)

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

# 언더샘플링 수행
undersampler = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = undersampler.fit_resample(X_train, y_train)

# 이제 X_resampled 및 y_resampled를 사용하여 모델을 학습하고 평가할 수 있습니다.

클래스 가중치 조정 (Class Weighting 사용 예제)

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 불균형한 데이터셋 생성
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, random_state=42)

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

# 클래스 가중치 조정을 사용하여 모델 학습
classifier = RandomForestClassifier(class_weight='balanced', random_state=42)
classifier.fit(X_train, y_train)

# 모델 평가
y_pred = classifier.predict(X_test)
# 추가적인 평가 지표를 계산할 수 있습니다.


위 예제 코드는 각각 오버샘플링, 언더샘플링, 클래스 가중치 조정을 사용한 간단한 불균형 데이터 다루기 방법을 보여줍니다. 데이터와 문제에 따라 더 적합한 방법을 선택하고 파라미터를 조정해야 할 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

[NumPy] nditer()  (0) 2023.09.07
모델별 적합한 상황과 장단점  (0) 2023.09.04
시계열 데이터 분석 - ARIMA  (0) 2023.09.02
[sklearn] KMeans  (0) 2023.08.31
[sklearn] KFold와 cross_val_score  (0) 2023.08.31