관리 메뉴

꿈 많은 사람의 이야기

SMOTE data oversampling으로 머신러닝 성능 향상시키기 본문

machine learning(머신러닝)

SMOTE data oversampling으로 머신러닝 성능 향상시키기

이수진의 블로그 이수진의 블로그 2019.10.09 20:44

지난 포스팅에 머신러닝으로 신용카드 사기 탐지하는 포스팅을 작성하였습니다.

첫 번째 아무것도 하지 않았을 때의 평가와

두 번째 IQR을 이용해 데이터의 이상치를 탐지해 이상치를 제거 후 모델의 성능 평가를 진행해보았습니다.

엄청난 성능 향상이 있었죠!

 

하지만 이 kaggle의 신용카드 사기 탐지 데이터 셋은 사기를 친 데이터 셋이 너무 부족한 것이 문제였습니다.

즉, 데이터의 balance가 완전히 무너진 상태이죠.

 

이 balance가 무너진 dataset에서 data를 균형있게 맞추어주는 방법이 있습니다.

SMOTE라는 방법인데요. 오늘은 이 SMOTE 방법에 대해서 알아보고 머신러닝 모델에 적용해보겠습니다.

그래서 최종적으로 kaggle의 credict card fraud를 탐지하는 머신러닝 model을 만들어보겠습니다.

 

undersampling & oversamling

다시 한 번 강조하면 이 데이터 셋은 데이터가 매우매우 불균형합니다. 왜냐하면 보통 사기를 치는 경우가 보통의 경우보다 데이터가 매우 적으니까요.

이렇게 데이터가 매우 불균형하면 좋은 model이 나오기 힘듭니다. 그래서 좋은 machine learning model을 만들기 위해 이 데이터를 핸들링하는 방법이 있습니다.

데이터를 더 적게하거나(undersampling) 데이터를 증폭시키는 것이죠(oversampling)

 

 

undersampling은 잘 사용하지 않습니다. 데이터가 많아야 하는데 데이터를 더 적게하는 이유가 있으니까요.

너무 많은 정상 데이터를 감소시켜서 오히려 모델의 성능이 더 악화될 수 있습니다.

그래서 oversampling을 많이 사용하는데요. oversampling은 적은 데이터 세트를 충분히 확보하는 방법입니다.

뭐 동일한 데이터를 증식하는 방법도 있겠지만 이는 overfitting을 초래할 수 있기 때문에 좋지 못합니다. 

그래서 SMOTE(Synthetic Minority Over-sampling Technique)를 사용합니다.

 

SMOTE

SMOTE는 적은 데이터 세트에 있는 개별 데이터들의 KNN를 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어 기존 데이터와 약간 차이가 나는 새로운 데이터를 생성합니다.

 

 

 

위 그림과 같이 말이죠!

그리고 python에서는 이와 같은 SMOTE와 관련된 패키지를 제공해주는데요.

imbalanced-learn 이라는 패키지입니다.

pip install imbalanced-learn 을 통해 설치할 수 있습니다.

 

 

이렇게말이죠!

 

python SMOTE 적용하기

 

자 그럼 바로 imbalance한 데이터에 SMOTE를 적용시켜봅시다.

SMOTE를 적용할 때는 train data set만 oversampling해야합니다. 검증, 테스트 데이터 셋을 oversampling하게 되면 올바른 검증/테스트가 될 수 없기 때문입니다.

 

 

from imblearn.over_sampling import SMOTE를 통해 SMOTE를 불러올 수 있습니다.

smote = SMOTE()

로 객체를 생성하고 smote.fit_sample(X_train, y_train)을 통해 데이터를 증식하여 가지고옵니다.

그러면 위와 같이 SMOTE전, 후를 비교해보면 train set의 개수가 늘어난 것을 볼 수 있습니다.

 

 

그리고 위 차트를 보면 원본 데이터에서 0인 데이터 즉, 신용카드 사기가 아닌 데이터가 훨씬 많았지만

SMOTE를 적용한 후에는 신용카드 사기 건의 데이터와 사기가 아닌 정상 데이터의 개수가 같아졌습니다.

자! 이제 이 데이터를 가지고 다시 머신러닝 모델을 훈련시켜보죠.

먼저 로지스틱 회귀입니다.

 

 

로지스틱 회귀에 적용하니까 f1-score와 정밀도가 박살이났습니다.

이 정도로 정밀도가 박살이 나면 사용할 수 없는 모델입니다.

이렇게 된 이유는 oversampling으로 인해 실제 원본 데이터의 유형보다 너무 많은 class = 1인 데이터를 학습하면서 실제 테스트 데이터 세트에서 예측을 지나치게 class = 1로 적용해 정밀도가 떨어진 경우입니다.

그래서 보통 SMOTE를 적용한 후에 정밀도가 떨어진다고하네요 ㅠㅠ

그래프로 한 번 살펴보죠

sklearn의 precision_recall_curve를 활용해서 

정밀도, 재현율 그래프를 살펴봅니다.

 

 

임계값이 0.98 정도에서 갑자기 서로 올라가고 떨어집니다.

로지스틱 회귀에서는 이런 성능을 보여주었는데요

그러면 LightGBM은 어떨까요?

 

LightGBM에서는 안전한 결과가 나왔습니다.

그리고 예측 성능도 좋네요.

 

자! 이렇게 머신러닝에서 data가 imbalance 할 때 SMOTE라는 기법으로 데이터를 증식시키는 방법에 대해서 알아보았습니다.

되도록이면 이런 imbalance한 데이터가 나오지 않도록 하는 것이 좋겠죠 ㅎㅎ

 

이상입니다!

0 Comments
댓글쓰기 폼