230417 / BSA05. 데이터 전처리 3 : 데이터 불균형, resampling

BSA05_Imbalanced-Resampling.ipynb

 

필요한 패키지

# !pip install imblearn

from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import NearMiss
from imblearn.under_sampling import RandomUnderSampler

import pandas as pd

 

데이터 불러오기 및 전처리

카드자료 = pd.read_csv('creditcard.csv')
카드자료.info()

# dtype 'int64'를 dtype 'category'로 변경
카드자료["Class"] = 카드자료["Class"].astype('category')

# 메모리 축소를 위해 dtype 'float64'를 dtype 'float32'로 변경
for 변수명 in list(카드자료.columns[:-1]):
  카드자료[변수명] = 카드자료[변수명].astype('float32')
  
카드자료.info()

# 다음 작업에는 위의 작업을 반복하지 않도록 parquet로 저장
카드자료.to_parquet('creditcard.parquet')

 

설명변수(독립변수), 반응변수(종속변수) 분리

# Class별 빈도 확인
카드자료["Class"].value_counts()


X = 카드자료.iloc[:, 0:-1]  # 마지막 한 열('Class')만 제외하고
X.info()

y = 카드자료["Class"]
y.info()

 

oversampling

# sampling_strategy=0.5 : minor class가 major class의 0.5(50%)가 되도록 minor class를 oversampling
X_o, y_o = SMOTE(random_state=316, sampling_strategy=0.5).fit_resample(X, y)

# 'Class 0'(284315), 'Class 1'(142157)
y_o.value_counts()

# Series+Series, DataFrame+Series, DataFrame+DataFrame
## 공통된 변수가 없으므로 concat으로 데이터프레임 결합
카드오버 = pd.concat([X_o, y_o], axis=1)
카드오버["Class"].value_counts()

 

undersampling

# major class에서 minor class의 개수에 맞춰서 major class를 undersampling
## 'Class 0'(492), 'Class 1'(492)
X_u, y_u = NearMiss(version=1).fit_resample(X, y)

카드언더 = pd.concat([X_u, y_u], axis=1)
카드언더["Class"].value_counts()


# sampling_strategy=0.5 : minor class가 major class의 0.5(50%)가 되도록 major class를 undersampling
## 'Class 0'(984), 'Class 1'(492)
X_u, y_u = RandomUnderSampler(random_state=316, sampling_strategy=0.5).fit_resample(X, y)

카드언더 = pd.concat([X_u, y_u], axis=1)
카드언더["Class"].value_counts()