오버샘플링
오버샘플링(Oversampling) 은 소수 클래스의 샘플을 인위적으로 늘려, 모든 클래스가 비슷한 수의 샘플을 가지도록 합니다.
균형 잡힌 데이터셋은 모델이 소수 클래스의 패턴을 더 효과적으로 학습하게 함으로써, 전체적인 성능의 향상을 기대할 수 있습니다.
1. 오버샘플링의 종류
1) 단순 무작위 복제
이 방법은 가장 기본적인 오버샘플링 방식이에요. 마치 파티에 더 많은 손님을 초대하기 위해 친구들의 이름을 여러 번 적어넣는 것과 같죠. 간단하고 쉽지만, 너무 많이 같은 이름을 적으면 파티가 좀 지루해질 수 있어요.
2) SMOTE (Synthetic Minority Over-sampling Technique)
SMOTE는 조금 더 복잡하지만 효과적인 방법이에요.
이는 새로운 손님들을 만들어내는 것처럼, 기존 데이터를 바탕으로 새로운 데이터 포인트를 '합성'해요.
마치 기존 손님들의 특징을 조합해서 새로운 친구를 만드는 것과 비슷하죠.
2.사기 탐지 모델을 위한 데이터셋 준비
import pandas as pd
df = pd.read_csv('df.csv')
display(df.head())
display(df.info())
3. 데이터 전처리 및 분할
from sklearn.model_selection import train_test_split
# 레이블 인코딩
df['거래 유형'] = df['거래 유형'].map({'출금':0, '입금':1, '국내송금':2, '해외송금':3})
df['사기 여부'] = df['사기 여부'].map({'사기': 1, '정상': 0})
X = df.drop('사기 여부', axis=1)
y = df['사기 여부']
# # 훈련 및 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
4. 원본 데이터셋의 클래스 분포 확인
print("원본 데이터셋의 클래스 분포:\n", y_train.value_counts(), "\n")
print("원본 데이터셋의 클래스 분포:\n", y_train.value_counts(normalize=True) * 100)
원본 데이터셋의 클래스 분포:
0 169
1 41
Name: 사기 여부, dtype: int64
원본 데이터셋의 클래스 분포:
0 80.47619
1 19.52381
Name: 사기 여부, dtype: float64
5. 오버샘플링 1: 단순 무작위 복제
이 방법은 데이터 불균형을 해결하기 위해 소수 클래스의 샘플들을 단순히 복사하여 늘리는 접근 방식 을 취합니다.
소수 클래스의 샘플들을 무작위로 선택하고, 이들을 그대로 복사하여 데이터셋에 다시 추가합니다.
이 과정은 소수 클래스의 샘플 수를 증가시켜, 다수 클래스와의 불균형을 줄이는 데 도움을 줍니다.
5.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())
오버샘플링 적용 후의 클래스 분포:
0 169
1 169
Name: 사기 여부, dtype: int64
5.3 단순 무작위 복제 기법의 장단점
※ 장점
1) 간단하고 쉬운 구현
복제 방법은 기술적으로 가장 간단한 오버샘플링 기법 중 하나입니다. 복잡한 알고리즘 없이 데이터의 일부를 복사하여 사용하기 때문에, 쉽게 구현하고 적용할 수 있습니다.
2) 빠른 처리 시간
추가적인 데이터 처리나 복잡한 계산이 필요 없기 때문에, 데이터 증가가 빠르게 이루어집니다.
큰 데이터셋에서도 빠르게 오버샘플링을 수행할 수 있습니다.
3) 데이터 분포 유지
복제 방법은 원본 데이터의 분포를 그대로 유지하면서 샘플 수만 증가시킵니다.
이는 소수 클래스의 특성을 변형시키지 않고 그대로 보존한다는 장점이 있습니다.
※ 단점
1) 과적합(Overfitting)의 위험
복제 방법은 동일한 데이터를 반복하여 추가하기 때문에, 모델이 훈련 데이터에 과도하게 최적화되는 과적합을 일으킬 위험이 있습니다.
이는 모델이 새로운 데이터에 대한 일반화 능력을 잃을 수 있음을 의미합니다.
2) 데이터 다양성 부족
새롭고 다양한 정보를 추가하지 않고 기존 데이터를 단순히 복제하기 때문에, 데이터셋의 다양성이 증가하지 않습니다.
이로 인해 모델이 다양한 상황에 대응하는 능력을 충분히 개발하지 못할 수 있습니다.
3) 실제 분포와의 불일치
특히, 실제 상황에서 소수 클래스가 다양한 형태로 나타날 경우, 단순 복제로는 이러한 다양성을 충분히 반영할 수 없어, 현실 세계의 복잡한 패턴을 모델링하는 데 한계가 있습니다.
6. 오버샘플링 2: SMOTE 기법
오버 샘플링의 두 번째 방법으로, SMOTE(Synthetic Minority Over-sampling Technique), 즉 '합성 소수 오버샘플링 기법'은 데이터 불균형 문제를 해결하는 데 정말 유용한 도구입니다.
SMOTE의 기본 목표는 소수 클래스의 오버샘플링을 통해 보다 균형 잡힌 데이터 세트를 만드는 것입니다.
이 기술은 기존 소수 클래스 인스턴스 간의 특성을 보간하여 새로운 합성 샘플을 생성 합니다.
1) 이웃 선택
SMOTE에서는 먼저 소수 클래스의 특정 인스턴스(데이터 포인트)를 선택합니다.
그 다음, 이 인스턴스와 가장 가까이 있는 다른 소수 클래스 인스턴스들 중에서 하나 이상을 '이웃'으로 선택합니다.
이 이웃들은 선택한 원본 인스턴스와 비슷한 특성을 가진 데이터 포인트들입니다.
2)임의의 이웃 선택
이 중에서 하나의 이웃을 무작위로 선택합니다.
이 과정은 데이터셋에서 다양성을 보장하기 위해 무작위성을 도입하는 것입니다.
선택된 이웃은 원본 인스턴스와 비슷하지만, 완전히 동일하지는 않습니다.
3)특성 차이 계산
선택된 이웃과 원본 인스턴스 간의 각 특성 값(예: 데이터 포인트의 각 변수 값)의 차이를 계산합니다.
이 차이는 새로운 데이터 포인트를 생성하는 데 사용될 '간격' 또는 '벡터'를 나타냅니다.
4)새 인스턴스 생성
계산된 특성 차이에 0과 1 사이의 무작위 수(랜덤 스칼라 값)를 곱합니다.
이것은 새로운 합성 인스턴스가 원본 인스턴스와 선택된 이웃 사이의 '중간점'에 위치하도록 합니다.
무작위 수를 곱함으로써, 생성된 새 인스턴스는 원본 인스턴스와 정확히 동일하지 않고 약간의 변화를 가지게 됩니다.
5)합성 인스턴스 추가
이렇게 계산된 새 특성 값은 원본 인스턴스의 특성 값에 추가되어, 최종적으로 새로운 합성 인스턴스를 생성합니다.
이 새로운 합성 인스턴스는 원본 데이터셋에 추가됩니다.
이러한 방식으로 여러 소수 클래스 인스턴스에 대해 반복함으로써, SMOTE는 원래 데이터 세트에 추가할 수 있는 더 크고 다양한 합성 소수 클래스 인스턴스 세트를 만듭니다.
SMOTE에서 이러한 방식으로 데이터 포인트를 생성하는 것은 데이터셋에 다양성을 추가하고, 모델이 소수 클래스의 특징을 더 잘 학습하도록 돕기 위함입니다. 0과 1 사이의 무작위 수를 사용함으로써, 새로운 데이터 포인트는 원본 데이터셋의 자연스러운 변형을 반영하며, 이는 과적합을 줄이는 데에도 도움이 됩니다.
6.1 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())
오버샘플링 적용 후의 클래스 분포:
0 169
1 169
Name: 사기 여부, dtype: int64
6.2 SMOTE의 효과 시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 피처 선택
feature1 = '이전 거래와의 시간 간격'
feature2 = '거래 금액'
# 원본 데이터 분포 시각화
plt.figure(figsize=(16, 5))
plt.subplot(1, 2, 1)
sns.scatterplot(x=X_train.loc[:, feature1], y=X_train.loc[:, feature2], hue=y_train)
plt.title('Original Data')
# SMOTE 방법으로 오버샘플링한 데이터 시각화
plt.subplot(1, 2, 2)
sns.scatterplot(x=X_smote.loc[:, feature1], y=X_smote.loc[:, feature2], hue=y_smote)
plt.title('SMOTE')
6.3 SMOTE 기법의 장단점
※ 장점
1) 데이터 다양성 증가
SMOTE는 기존 소수 클래스 샘플 사이에 새로운, 합성된 샘플을 생성함으로써 데이터의 다양성을 증가시킵니다.
이는 모델이 더 많은 유형의 패턴을 학습하고 이해하는 데 도움을 줍니다.
2) 과적합 감소
단순한 복제 방법에 비해, SMOTE는 새로운 종류의 샘플을 생성함으로써 모델이 단순히 기존 데이터를 외우는 것이 아니라, 일반화된 학습을 수행할 수 있도록 합니다. 이는 과적합의 위험을 줄여줍니다.
3) 모델 성능 향상
SMOTE로 생성된 다양한 샘플을 통해 모델은 실제 세계의 다양한 시나리오를 더 잘 반영할 수 있게 되며, 결과적으로 모델의 성능이 향상될 수 있습니다.
※ 단점
1) 잘못된 샘플 생성 위험
SMOTE는 새로운 샘플을 생성할 때, 기존 데이터의 패턴을 기반으로 합니다.
이 과정에서 잘못된 정보를 반영하는 샘플을 생성할 수 있으며, 이는 모델의 학습에 부정적인 영향을 미칠 수 있습니다.
2) 계산 복잡성
SMOTE는 단순 복제 방법보다 계산적으로 복잡합니다.
새로운 샘플을 생성하기 위해 기존 데이터 포인트들 사이의 관계를 분석해야 하므로, 더 많은 계산 리소스와 시간이 필요합니다.
3) 적용의 어려움
특히, 노이즈가 많은 데이터셋이나 변수가 많은 복잡한 데이터셋에서는 SMOTE를 적용하기 어려울 수 있으며, 부적절한 적용은 모델의 성능에 부정적인 영향을 미칠 수 있습니다.
'머신러닝 > 머신러닝: 기초 내용' 카테고리의 다른 글
데이터 불균형 극복방법 2 : 언더샘플링 (0) | 2024.12.16 |
---|---|
데이터 불균형 (0) | 2024.12.15 |
피처 엔지니어링 입문 (2) | 2024.12.14 |
다변량 이상치 (0) | 2024.12.13 |
단변량 이상치 (0) | 2024.12.12 |