데이터 불균형

CHOI CHOI·2024년 6월 27일
0

파이썬 중급

목록 보기
28/30

1. 소수 클래스의 과소평가
가장 먼저, 소수 클래스인 '사기 거래'가 과소평가될 위험이 있다
정상 거래가 많다보니, 컴퓨터는 사기 거래를 찾아내는게 아니라, 그냥 모든 거래를 '정상'으로 분류해버릴 수도 있다.

이런 상황에서는 사기 거래를 제대로 잡아내지 못하고 그냥 지나쳐버릴 수 있다
그 결과, 은행은 사기를 감지하지 못할 수 있다.

2. 모델의 과적합
데이터 불균형은 또한 모델이 과적합을 일으킬 수 있다
모델이 정상 거래 데이터만 너무 많이 보고 학습하다 보면, 실제 세상에서는 드문 사기 거래를 제대로 인식하지 못할 수 있다
마치 한 가지 문제 풀이 방식만 너무 잘 알고 다른 문제에는 적용하지 못하는 학생과 같아질 수 있다

3. 일반화 능력의 저하
'일반화 능력'이란, 모델이 학습한 내용을 새로운, 보지 못한 데이터에도 잘 적용하는 능력
하지만 데이터가 불균형이라면, 모델은 오로지 '정상 거래'에만 너무 치우쳐 학습하게 되고, 새로운 유형의 사기 거래에는 제대로 대응하지 못할 수 있다

불균형을 균형있게 만드는 방법

  • 언더 샘플링 : 다수 클래스의 샘플을 줄이는 방식으로, 회귀 사건들을 모두 선택하고 풍부한 사건들을 적절히 추출하여 데이터셋을 균일하게 만든다

  • 오버 샘플링 : 소수 클래스의 샘플을 인위적으로 늘려, 모든 클래스가 비슷한 수의 샘플을 가지도록한다. 이 방식은 모델이 소수 클래스에 대해 더 많은 정보를 학습하도록 하여 보다 균형 잡힌 예측을 가능하게 한다

오버샘플링

  1. 단위 무작위 복제
    가장 기본적인 오버샘플링 방식. 예를들자면 마티에 더 많은 손님을 초대하기 위해 친구들의 이름을 여러번 적는 것과 같음.
    소수 클래스의 샘플들을 단순히 복사하여 늘리는 접근 방식을 취한다.

단순 무작위 복제 기법 코드

from imblearn.over_sampling import RandomOverSampler

# 오버샘플링 적용
ros = RandomOverSampler(random_state=42)
X_resampled, y_resampled = ros.fit_resample(X_train, y_train)

# 결과 출력
print("오버샘플링 적용 후의 클래스 분포:\n", y_resampled.value_counts())

장점 👍

  • 간단하고 쉬운 구현
    복제 방법은 기술적으로 가장 간단한 오버샘플링 기법 중 하나입니다.
    복잡한 알고리즘 없이 데이터의 일부를 복사하여 사용하기 때문에, 쉽게 구현하고 적용할 수 있습니다.

  • 빠른 처리 시간
    추가적인 데이터 처리나 복잡한 계산이 필요 없기 때문에, 데이터 증가가 빠르게 이루어집니다.
    큰 데이터셋에서도 빠르게 오버샘플링을 수행할 수 있습니다.

  • 데이터 분포 유지
    복제 방법은 원본 데이터의 분포를 그대로 유지하면서 샘플 수만 증가시킵니다.
    이는 소수 클래스의 특성을 변형시키지 않고 그대로 보존한다는 장점이 있습니다.

단점 👎

  • 과적합(Overfitting)의 위험
    복제 방법은 동일한 데이터를 반복하여 추가하기 때문에, 모델이 훈련 데이터에 과도하게 최적화되는 과적합을 일으킬 위험이 있습니다.
    이는 모델이 새로운 데이터에 대한 일반화 능력을 잃을 수 있음을 의미합니다.

  • 데이터 다양성 부족
    새롭고 다양한 정보를 추가하지 않고 기존 데이터를 단순히 복제하기 때문에, 데이터셋의 다양성이 증가하지 않습니다.
    이로 인해 모델이 다양한 상황에 대응하는 능력을 충분히 개발하지 못할 수 있습니다.

  • 실제 분포와의 불일치
    특히, 실제 상황에서 소수 클래스가 다양한 형태로 나타날 경우,
    단순 복제로는 이러한 다양성을 충분히 반영할 수 없어, 현실 세계의 복잡한 패턴을 모델링하는 데 한계가 있습니다.

  1. SMOTE(Synthetic Minority Over-sampling Technique)
    좀 더 복잡하지만 효과적인 방법
    기존 데이터를 바탕으로 새로운 데이터 포인트를 '합성'
  • SMOTE의 기본 목표는 소수 클래스의 오버샘플링을 통해 보다 균형 잡힌 데이터 세트를 만드는것

기존 소수 클래스 인스턴스 간의 특성을 보간하여 새로운 합성 샘플을 생성
1. 이웃 선택
SMOTE에서는 먼저 소수 클래스의 특정 인스턴스(데이터 포인트)를 선택합니다.
그 다음, 이 인스턴스와 가장 가까이 있는 다른 소수 클래스 인스턴스들 중에서 하나 이상을 '이웃'으로 선택합니다.
이 이웃들은 선택한 원본 인스턴스와 비슷한 특성을 가진 데이터 포인트들입니다.

  1. 임의의 이웃 선택
    이 중에서 하나의 이웃을 무작위로 선택합니다.
    이 과정은 데이터셋에서 다양성을 보장하기 위해 무작위성을 도입하는 것입니다.
    선택된 이웃은 원본 인스턴스와 비슷하지만, 완전히 동일하지는 않습니다.

  2. 특성 차이 계산
    선택된 이웃과 원본 인스턴스 간의 각 특성 값(예: 데이터 포인트의 각 변수 값)의 차이를 계산합니다.
    이 차이는 새로운 데이터 포인트를 생성하는 데 사용될 '간격' 또는 '벡터'를 나타냅니다.

  3. 새 인스턴스 생성
    계산된 특성 차이에 0과 1 사이의 무작위 수(랜덤 스칼라 값)를 곱합니다.
    이것은 새로운 합성 인스턴스가 원본 인스턴스와 선택된 이웃 사이의 '중간점'에 위치하도록 합니다.
    무작위 수를 곱함으로써, 생성된 새 인스턴스는 원본 인스턴스와 정확히 동일하지 않고 약간의 변화를 가지게 됩니다.

  4. 합성 인스턴스 추가
    이렇게 계산된 새 특성 값은 원본 인스턴스의 특성 값에 추가되어, 최종적으로 새로운 합성 인스턴스를 생성합니다.
    이 새로운 합성 인스턴스는 원본 데이터셋에 추가됩니다.

SMOTE 기법 코드 실습

from imblearn.over_sampling import SMOTE

# SMOTE 적용
smote = SMOTE(random_state=42)
X_smote, y_smote = smote.fit_resample(X_train, y_train)

# 결과 출력
print("오버샘플링 적용 후의 클래스 분포:\n", y_smote.value_counts())

장점 👍

  • 데이터 다양성 증가
    SMOTE는 기존 소수 클래스 샘플 사이에 새로운, 합성된 샘플을 생성함으로써 데이터의 다양성을 증가시킵니다.
    이는 모델이 더 많은 유형의 패턴을 학습하고 이해하는 데 도움을 줍니다.

  • 과적합 감소
    단순한 복제 방법에 비해, SMOTE는 새로운 종류의 샘플을 생성함으로써 모델이 단순히 기존 데이터를 외우는 것이 아니라,
    일반화된 학습을 수행할 수 있도록 합니다. 이는 과적합의 위험을 줄여줍니다.

  • 모델 성능 향상
    SMOTE로 생성된 다양한 샘플을 통해 모델은 실제 세계의 다양한 시나리오를 더 잘 반영할 수 있게 되며, 결과적으로 모델의 성능이 향상될 수 있습니다.

단점 👎

  • 잘못된 샘플 생성 위험
    SMOTE는 새로운 샘플을 생성할 때, 기존 데이터의 패턴을 기반으로 합니다.
    이 과정에서 잘못된 정보를 반영하는 샘플을 생성할 수 있으며, 이는 모델의 학습에 부정적인 영향을 미칠 수 있습니다.

  • 계산 복잡성
    SMOTE는 단순 복제 방법보다 계산적으로 복잡합니다.
    새로운 샘플을 생성하기 위해 기존 데이터 포인트들 사이의 관계를 분석해야 하므로, 더 많은 계산 리소스와 시간이 필요합니다.

  • 적용의 어려움
    특히, 노이즈가 많은 데이터셋이나 변수가 많은 복잡한 데이터셋에서는 SMOTE를 적용하기 어려울 수 있으며,
    부적절한 적용은 모델의 성능에 부정적인 영향을 미칠 수 있습니다.

언더샘플링

  1. 무작위 언더 샘플링
    가장 간단한 형태의 언더 샘플링 방법
    이 방식은 중요한 데이터를 잃어버릴 위험이 있다

다수 클래스에서 데이터 포인트를 무작위로 선택하여 제거함으로서 소수 클래스와 다수 클래스간의 균형을 맞춘다

이 방법은 명확한 한계가 존재하는데, 무작위로 데이터를 제거하는 과정에서 중요한 정보를 잃을 수 있으며, 이는 모델의 성능에 부정적인 영향을 미칠 수 있다. 이 방법은 데이터셋의 크기가 매우 크고, 중요한 정보의 손실이 상대적으로 덜 중요한 경우에 적합하다.

무작위 언더샘플링 기법 코드

from imblearn.under_sampling import RandomUnderSampler

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

# 결과 출력
print("언더샘플링 적용 후의 클래스 분포:\n", y_under.value_counts())

무작위 제거 방법의 장단점

장점 👍

  • 간단함과 접근성
    복잡한 알고리즘이나 추가적인 데이터 처리가 필요 없어, 쉽게 구현하고 적용할 수 있습니다.

  • 계산 효율성
    데이터를 줄이는 과정이 간단하기 때문에, 처리 시간과 계산 비용이 낮습니다.

단점 👎

  • 중요 정보 손실
    무작위로 데이터를 제거하므로, 중요한 정보나 패턴을 잃어버릴 수 있습니다.

  • 데이터 대표성 저하
    데이터셋에서 중요한 다양성이나 대표성이 줄어들 수 있어, 모델의 일반화 능력에 영향을 미칠 수 있습니다.

2.NearMiss기법
다수 클래스의 샘플 중 소수 클래스 샘플과 가장 가까운 것들을 선택하여 보존한다. 여러 버전이 있으며, 각각 다른 기준으로 가까운 샘플들을 선택한다.
NearMiss(version=1)은 각 소수 클래스 샘플에 대해 가장 가까운 다수 클래스 샘플을 선택 합니다. 이 방법은 소수 클래스 샘플과 가장 가까운 다수 클래스 샘플을 유지하여 데이터의 균형을 맞춥니다.

NearMiss(version=2)는 다수 클래스 샘플 중에서 소수 클래스 샘플과 가장 가까운 평균 거리 를 가진 샘플을 선택합니다. 이 방법은 다수 클래스 내에서 소수 클래스 샘플과 전반적으로 가까운 샘플을 유지합니다.

NearMiss(version=3)는 소수 클래스 샘플의 이웃을 먼저 찾은 후, 이 이웃 중 다수 클래스 샘플을 선택 합니다. 이는 소수 클래스 샘플과 직접적으로 연관된 다수 클래스 샘플을 유지하는 방식입니다.

NearMiss 기법 코드

from imblearn.under_sampling import NearMiss

# NearMiss 버전별 적용
nm1 = NearMiss(version=1)
nm2 = NearMiss(version=2)
nm3 = NearMiss(version=3)

X_nm1, y_nm1 = nm1.fit_resample(X_train, y_train)
X_nm2, y_nm2 = nm2.fit_resample(X_train, y_train)
X_nm3, y_nm3 = nm3.fit_resample(X_train, y_train)

# 결과 출력
print("NearMiss-1 적용 후의 클래스 분포:\n", y_nm1.value_counts())
print("NearMiss-1 적용 후의 클래스 분포:\n", y_nm2.value_counts())
print("NearMiss-1 적용 후의 클래스 분포:\n", y_nm3.value_counts())

NearMiss기법의 장단점

장점 👍

  • 클래스 간 균형 개선
    NearMiss는 다수 클래스의 샘플을 줄여 소수 클래스와의 균형을 개선합니다. 이는 특히 소수 클래스에 중요한 정보가 있는 경우 머신러닝 모델의 성능 향상에 도움이 됩니다.

  • 과적합 감소
    다수 클래스의 지배적인 영향을 줄임으로써, 모델이 소수 클래스를 무시하고 다수 클래스에 과적합되는 것을 방지할 수 있습니다.

  • 노이즈 및 이상치 제거
    특정 버전의 NearMiss는 다수 클래스 내의 노이즈와 이상치를 제거할 수 있으며, 이는 더 깨끗하고 일반화된 데이터셋을 생성하는 데 도움이 됩니다.

단점 👎

  • 정보 손실 위험
    다수 클래스에서 중요한 샘플을 제거할 위험이 있습니다. 이로 인해 모델이 중요한 정보를 놓칠 수 있으며, 전체적인 성능이 저하될 수 있습니다.

  • 선택 기준의 한계
    NearMiss는 가까운 샘플을 기준으로 선택하기 때문에, 항상 가장 유용하거나 대표적인 샘플을 선택한다는 보장이 없습니다. 따라서, 때로는 중요하지 않은 샘플을 유지하고 중요한 샘플을 제거할 수도 있습니다.

  • 데이터 분포의 왜곡
    특히 NearMiss-1과 같은 방법은 데이터의 원래 분포를 왜곡시킬 수 있으며, 이는 모델이 실제 세계 데이터에 적용될 때 문제를 일으킬 수 있습니다.

  • 계산 복잡성
    특히 NearMiss-3 같은 방법은 계산이 복잡하고 시간이 많이 소요될 수 있으며, 큰 데이터셋에서는 비효율적일 수 있습니다.

profile
뭐가 됐든 데이터분석가

0개의 댓글