언더샘플링 (Undersampling)
언더샘플링은 다수 클래스의 샘플을 줄이는 방식으로, 희귀 사건들을 모두 선택하고 풍부한 사건들을 적절히 추출하여 데이터셋을 균일하게 만듭니다.
이는 큰 데이터셋에서 중요하지 않은 정보를 줄여주어 모델이 핵심 패턴에 더 집중할 수 있게 도와줍니다.
언더샘플링을 통해, 모델이 소수 클래스에 더 집중하고, 이를 통해 전반적인 성능을 향상시킬 수 있습니다.
1. 언더샘플링의 종류
1) 무작위 언더샘플링 (Random UnderSampling)
가장 간단한 형태의 언더샘플링 방법입니다.
이 방법은 다수 클래스의 데이터 포인트들을 무작위로 제거합니다.
하지만 이 방식은 중요한 데이터를 잃어버릴 위험이 있습니다.
2) NearMiss
다수 클래스의 데이터 포인트 중 소수 클래스의 데이터 포인트와 가장 가까운 것들만을 보존하는 방법입니다.
이 방법은 데이터의 균형을 맞추면서도 소수 클래스에 유사한 다수 클래스의 데이터를 유지하려고 시도합니다.
2. 사기 탐지 모델을 위한 데이터셋 준비
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv('df.csv')
# 레이블 인코딩
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)
3. 언더 샘플링 1: 무작위 언더샘플링
언더샘플링의 첫 번째 방법으로, '무작위 제거 방법(Random UnderSampling)'은 언더샘플링의 가장 기본적인 형태입니다.
이 방법은 다수 클래스에서 데이터 포인트를 무작위로 선택하여 제거 함으로써, 소수 클래스와 다수 클래스 간의 균형을 맞춥니다.
이 방식의 핵심은 간단함과 직관성입니다.
예를 들어, 만약 정상 거래가 사기 거래보다 훨씬 많다면, 무작위로 일부 정상 거래 데이터를 제거하여 사기 거래 데이터의 비중을 상대적으로 높일 수 있습니다.
이 과정은 데이터셋의 전체 크기를 줄이면서도, 소수 클래스에 대한 모델의 학습 효율성을 향상시킬 수 있습니다.
하지만 이 방법에는 명확한 한계가 있습니다.
무작위로 데이터를 제거하는 과정에서 중요한 정보를 잃을 수 있으며, 이는 모델의 성능에 부정적인 영향을 미칠 수 있습니다.
그래서 이 방법은 데이터셋의 크기가 매우 크고, 중요한 정보의 손실이 상대적으로 덜 중요한 경우에 적합할 수 있습니다.
3.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())
언더샘플링 적용 후의 클래스 분포:
0 41
1 41
Name: 사기 여부, dtype: int64
3.2 무작위 언더샘플링 기법의 장단점
※ 장점
1) 간단함과 접근성
복잡한 알고리즘이나 추가적인 데이터 처리가 필요 없어, 쉽게 구현하고 적용할 수 있습니다.
2) 계산 효율성
데이터를 줄이는 과정이 간단하기 때문에, 처리 시간과 계산 비용이 낮습니다.
※ 단점
1) 중요 정보 손실
무작위로 데이터를 제거하므로, 중요한 정보나 패턴을 잃어버릴 수 있습니다.
2) 데이터 대표성 저하
데이터셋에서 중요한 다양성이나 대표성이 줄어들 수 있어, 모델의 일반화 능력에 영향을 미칠 수 있습니다.
4. 언더 샘플링 2: NearMiss 기법
언더 샘플링의 두 번째 방법으로, NearMiss는 다수 클래스의 샘플 중 소수 클래스 샘플과 가장 가까운 것들을 선택하여 보존합니다.
NearMiss 방법에는 여러 버전이 있으며, 각각 다른 기준으로 가까운 샘플들을 선택합니다.

- NearMiss(version=1)은 각 소수 클래스 샘플에 대해 가장 가까운 다수 클래스 샘플을 선택 합니다. 이 방법은 소수 클래스 샘플과 가장 가까운 다수 클래스 샘플을 유지하여 데이터의 균형을 맞춥니다.
- NearMiss(version=2)는 다수 클래스 샘플 중에서 소수 클래스 샘플과 가장 가까운 평균 거리 를 가진 샘플을 선택합니다. 이 방법은 다수 클래스 내에서 소수 클래스 샘플과 전반적으로 가까운 샘플을 유지합니다.
- NearMiss(version=3)는 소수 클래스 샘플의 이웃을 먼저 찾은 후, 이 이웃 중 다수 클래스 샘플을 선택 합니다. 이는 소수 클래스 샘플과 직접적으로 연관된 다수 클래스 샘플을 유지하는 방식입니다.
이 방법은 다수 클래스의 중요한 샘플을 보다 효과적으로 보존할 수 있는 장점이 있습니다.
4.1 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-1 적용 후의 클래스 분포:
0 41
1 41
Name: 사기 여부, dtype: int64
NearMiss-1 적용 후의 클래스 분포:
0 41
1 41
Name: 사기 여부, dtype: int64
NearMiss-1 적용 후의 클래스 분포:
0 41
1 41
Name: 사기 여부, dtype: int64
4.2 NearMiss 기법의 효과 시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 특성 선택
feature1 = '이전 거래와의 시간 간격'
feature2 = '거래 금액'
# 시각화
plt.figure(figsize=(16, 5))
# 원본 데이터 분포 시각화
plt.subplot(1, 4, 1)
sns.scatterplot(x=X_train.loc[:, feature1], y=X_train.loc[:, feature2], hue=y_train)
plt.title('Original Data')
# NearMiss-1 데이터 시각화
plt.subplot(1, 4, 2)
sns.scatterplot(x=X_nm1.loc[:, feature1], y=X_nm1.loc[:, feature2], hue=y_nm1)
plt.title('NearMiss-1')
# NearMiss-2 데이터 시각화
plt.subplot(1, 4, 3)
sns.scatterplot(x=X_nm2.loc[:, feature1], y=X_nm2.loc[:, feature2], hue=y_nm2)
plt.title('NearMiss-2')
# NearMiss-3 데이터 시각화
plt.subplot(1, 4, 4)
sns.scatterplot(x=X_nm3.loc[:, feature1], y=X_nm3.loc[:, feature2], hue=y_nm3)
plt.title('NearMiss-3')
4.3. NearMiss 기법의 장단점
※ 장점
1) 클래스 간 균형 개선
NearMiss는 다수 클래스의 샘플을 줄여 소수 클래스와의 균형을 개선합니다. 이는 특히 소수 클래스에 중요한 정보가 있는 경우 머신러닝 모델의 성능 향상에 도움이 됩니다.
2) 과적합 감소
다수 클래스의 지배적인 영향을 줄임으로써, 모델이 소수 클래스를 무시하고 다수 클래스에 과적합되는 것을 방지할 수 있습니다.
3) 노이즈 및 이상치 제거
특정 버전의 NearMiss는 다수 클래스 내의 노이즈와 이상치를 제거할 수 있으며, 이는 더 깨끗하고 일반화된 데이터셋을 생성하는 데 도움이 됩니다.
※ 단점
1) 정보 손실 위험
다수 클래스에서 중요한 샘플을 제거할 위험이 있습니다. 이로 인해 모델이 중요한 정보를 놓칠 수 있으며, 전체적인 성능이 저하될 수 있습니다.
2) 선택 기준의 한계
NearMiss는 가까운 샘플을 기준으로 선택하기 때문에, 항상 가장 유용하거나 대표적인 샘플을 선택한다는 보장이 없습니다. 따라서, 때로는 중요하지 않은 샘플을 유지하고 중요한 샘플을 제거할 수도 있습니다.
3) 데이터 분포의 왜곡
특히 NearMiss-1과 같은 방법은 데이터의 원래 분포를 왜곡시킬 수 있으며, 이는 모델이 실제 세계 데이터에 적용될 때 문제를 일으킬 수 있습니다.
4) 계산 복잡성
특히 NearMiss-3 같은 방법은 계산이 복잡하고 시간이 많이 소요될 수 있으며, 큰 데이터셋에서는 비효율적일 수 있습니다.
NearMiss 기법은 소수 클래스의 패턴이 중요한 경우에 유용하지만, 적용하기 전에 데이터셋의 특성과 어떤 정보가 중요한지를 충분히 고려해야 합니다.
'머신러닝 > 머신러닝: 기초 내용' 카테고리의 다른 글
데이터 불균형 극복방법 1 : 오버샘플링 (0) | 2024.12.15 |
---|---|
데이터 불균형 (0) | 2024.12.15 |
피처 엔지니어링 입문 (2) | 2024.12.14 |
다변량 이상치 (0) | 2024.12.13 |
단변량 이상치 (0) | 2024.12.12 |