이번에는 SMOTE를 활용한 오버샘플링을 적용해보겠습니다.
일반적으로 언더샘플링보다 오버샘플링이 예측 성능상 더 유리한 경우가 많아 주로 사용됩니다.
## 오버샘플링?
이상 데이터와 같이 적은 데이터 세트를 증식하여 학습을 위한 충분한 데이터를 확보하는 방법으로, 동일한 데이터의 단순 증식은 과적합을 유발할 수 있기 때문에 의미가 없으므로 원본 데이터의 피처값들을 아주 약간씩 변형하여 증식
여기서 주의할 점은
SMOTE를 적용할 때는 반드시 학습 데이터 세트만 오버샘플링을 해야합니다!!!
검증 데이터 세트 혹은 테스트 데이터 세트를 오버샘플링 하는 경우 결국 원본 데이터가 아닌 데이터 세트에서 검증되기 때문에 올바른 검증이 되지 않습니다.
캐글의 Credit Card Fraud Detection 데이터를 활용하여 Fraud에 해당하는 데이터를 증식하고
이를 Light GBM을 통해 학습시켜보겠습니다.
SMOTE의 fit_sample() 메서드를 사용하여 증식한 뒤 증식 전/후를 비교해보겠습니다.
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_train_over, y_train_over = smote.fit_sample(X_train, y_train)
print("SMOTE 적용 전 학습용 피처/레이블 데이터 세트 : ", X_train.shape, y_train.shape)
print('SMOTE 적용 후 학습용 피처/레이블 데이터 세트 :', X_train_over.shape, y_train_over.shape)
print('SMOTE 적용 후 값의 분포 :\n',pd.Series(y_train_over).value_counts() )
결과를 보면 거의 2배 가까이로 데이터가 증식된 것을 볼 수 있으며
fraud에 해당하는 1값이 0과 동일하게 증식된 것을 확인할 수 있습니다.
증식한 데이터를 활용하여 Light GBM을 적용하여 학습 및 예측, 평가를 진행해보겠습니다.
## 증식한 데이터로 LGBM 적용
lgbm_clf = LGBMClassifier(n_estimators=1000, num_leaves=64, n_jobs=-1, boost_from_average=False)
get_model_train_eval(lgbm_clf, X_train_over, X_test, y_train_over, y_test)
데이터 증식 전에 비해 정밀도는 낮아지고, 재현율은 높아진 것을 볼 수 있습니다.
일반적으로 SMOTE를 적용하면 재현율은 높아지나 정밀도는 낮아집니다.
좋은 SMOTE 패키지일수록 재현율의 증가율은 높이고 정밀도의 감소율은 낮출 수 있도록 효과적으로 데이터를 증식합니다.
앞서 사용한 get_model_train_eval 함수는 이전 글에서 확인할 수 있습니다 :)
2022.03.26 - [python] - [python] LGBMClassifier 단번에 성능 높이기
'python > 파이썬 머신러닝 완벽가이드' 카테고리의 다른 글
[NLP] pipeline을 활용한 직관적인 코드짜기! (0) | 2022.05.03 |
---|---|
[NLP] 피처백터화 / 희소행렬 (0) | 2022.05.02 |
[NLP] NLP 기초, 텍스트 전처리의 모든 것 (0) | 2022.04.30 |
[python] LGBMClassifier 단번에 성능 높이기 (0) | 2022.03.26 |
[python] 교차검증을 간단하게 cross_val_score() (0) | 2022.03.15 |