본문 바로가기

cs,코딩,알고리즘/<파이썬 머신러닝 완벽 가이드>스터디

분류 머신러닝 알고리즘(SMOTE, LightGBM을 이용)_신용사기검출

728x90

몇주를 안했더니 말하는 감자가 되었다..... ADsP준비하면서 비슷한 용어들도 나와서 그나마 감을 다시 잡는데에는 시간이 얼마 안걸린것 같기도...

  • 지도 학습: 데이터 분석의 목적이 명확하게 정의된 형태의 특정 필드 값을 구하는 것-> 분석하고 지식을 도출하는 것이 목적
  • 분류: 속성값이 범주형-> 데이터의 실체가 어디에 속하는지 예측(그룹은 각각의 특성으로 정의되어있다.)

그래서 오늘 할 분류 실습은,  신용카드 데이터를 사용해서 신용카드 사기 검출을 분류하는 실습

->성능 평가 결과 로지스틱 회귀와 LightGBM 모델 모두 변환 전과 후를 비교

 

신용 사기 검출

https://www.kaggle.com/mlg-ulb/creditcardfraud/version/3

 

Credit Card Fraud Detection

Anonymized credit card transactions labeled as fraudulent or genuine

www.kaggle.com

타이타닉보다 훨씬 현실적인 것 같은 느낌이 든다

1. 데이터 뜯어보기
2. 학습용/테스트용 데이터 나누기
3. 데이터 전처리 후 모델 학습/예측/평가
  3-1. 데이터 분포도 변환
  3-2. 이상치 데이터 제거
  3-3. SMOTE 오버 샘플링
4. 결과

1. 데이터 뜯어보기

Amount 피처는 신용카드 사용 금액/   Time 피처는 의미가 없는 피처임으로 삭제/ V1~V28 피처는 개인정보에 관련된 피처인듯?.?

근데 여기서 문제점, Class 값을 보면 데이터가 상당히 불균형함을 확인할 수 있다. (0: 정상 트랜잭션/1: 사기 트랜잭션) 여기서 전체 데이터의 약 0.172%만이 레이블 값이 1이다. (사기와 같은 이상현상은 전체 데이터에서 차지하는 비중이 매우 적을 수 밖에 없다)

언더 샘플링과 오버 샘플링의 이해

예측 성능의 문제: 레이블이 불균형한 분포를 가진 데이터 세트를 학습시킬 때 이상 레이블을 가지는 데이터 건수는 매우 적기 때문에 제대로 다양한 유형을 학습하지 못한다. 반면에 정상 레이블을 가지는 데이터 건수는 매우 많기 때문에 일방적으로 정상 레이블로 치우친 학습을 수행해서 제대로된 이상 데이터 검출이 어려워진다.

=> 지도학습에서 극도로 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해서는 적절한 학습데이터 확보가 필요

  • 언더 샘플링: 많은 데이터 세트를 적은 데이터 세트 수준으로 감소시키는 방식(정상:이상=10,000:100-> 정상을 100건으로) 이렇게 학습을 수행하면 과도하게 정상 레이블로 학습/예측하는 부작용을 개선할 수 있지만, 너무 많은 정상 레이블 데이터를 감소시켜 정상 레이블의 경우 오히려 제대로 된 학습을 할 수 없다는 단점이 있어 잘 적용하지 않는다.
  • 오버 샘플링: 이상 데이터와 같은 적은 데이터 세트를 아주 약간만 변형해서 증식하는 방법. (동일한 데이터를 단순히 증식하면 과적합이 되기 때문) 대표적으로 SMOTE(Synthetic Minority Over-sampling Technique) 방법이 있는데, 이는 적은 데이터 세트에 있는 개별 데이터들의 K Nearest Neighbor 를 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어 기존 데이터와 약간 차이가 나는 새로운 데이터를 생성하는 방식이다.

 

2. 학습용/테스트용 데이터 나누기

데이터를 뜯어봤으니 학습과 예측을 위해 데이터를 학습용과 테스트용으로 나눠야 한다.

이때, 불균형한 데이터이기 때문에 Stratified 방식으로 나눠야 Class의 분포가 균등하게 나눠질 수 있습니다.

->데이터의 원본을 유지한 채로 데이터를 전처리하고 나누기 위해 get_preprocessed_df 와 get_train_test_dataset 함수를 만들어 진행

학습 데이터 레이블의 경우 1값이 약 0.172, 테스트 데이터 레이블의 경우 1값이 약 0.173%-> 학습데이터랑 테스트 데이터랑 큰 차이없이 분할되었다.

 

3. 데이터 전처리 후 모델 학습/예측/평가

예측 성능 평가도 하고,(정확도, 정밀도, 재현율, F1, AUC)

각 데이터 전처리 하고 모델의 예측 성능 평가를 매번 할 것이기 때문에 get_model_train_eval() 함수를 만들었음

평가는 정확도, 정밀도, 재현율, f1 스코어, roc-auc 스코어를 통해  진행

모델은 분류에 대표적으로 쓰이는 로지스틱 회귀 모델과 최근 캐글에서 인기있는 앙상블 방법인 LightGBM 모델을 사용

위의 방법으로모델을 학습한 뒤 별도의 테스트 데이터 세트에서 예측 평가를 수행

lIGHTgbm 안깔려 있으면 저번처럼 pip install lightgbm

3-1. 데이터 분포도 변환

데이터 세트에서 Amount 피처의 값이 한쪽에 쏠려있는 상당히 불균형한 분포를 가지고 있었기 때문에

1,000불 이하의 데이터가 대부분이며, 26,000불까지 꼬리가 긴 형태의 분포 곡선을 가지고 있다

 

정규화

: 데이터 세트에서 Amount 피처의 값이 한쪽에 쏠려있는 상당히 불균형한 분포를 가지고 있었기 때문에 이러한 분포를 StandardScaler를 통해 정규 분포 형태로 변환해서 평가해보고,

Amout 피처값을 정규화 한 데이터 세트를 이용한 모델의 성능은 원본 데이터를 이용한 모델에 비해  성능이 개선되지 않았다

② 로그 변환

두 모델 모두 정밀도, 재현율, ROC-AUC에서 약간씩 성능 개선

 

3-2. 이상치 데이터 제거

이상치 데이터란 전체 데이터의 패턴에서 벗어난 이상 값을 가진 데이터

->머신러닝 모델의 성능을 저하시킬 가능성이 높다

->이상치를 찾는 방법 중 대표적인 방법은 IQR 방법입니다.(경영통계에서도 ADsP에서도 등장..)

Q1-(IQR*1.5) 에서 Q3+(IQR*1.5) 구간을 벗어나면 이상치 데이터로  간주

이상치 데이터를 제거하기 위해 먼저 어떤 피처의 이상치 데이터를 제거할 것인지가 필요

target값과 가장 상관성이 높은 피처들을 위주로 이상치를 제거하는 것이 좋다

(밑에)피처들의 상관도를 히트맵임!

'RdBu'-> 양의 상관관계가 높을 수록 색깔이 진한 파란색에 가까우며, 음의 상관관계가 높을 수록 색이 진한 발간생으로 표현

맨 아래줄을 보면 Class와 다른 피처들의 상관관계를 볼 수가 있는데 음의 상관관계가 가장 높은 피처인 V14(-0.3)와 V17(-0.33) 대해서 이상치를 검출하고 제거해보자

->8296, 8615, 9035, 9252 번 Index가 이상치로 추출되었다. 

이상치 제거 후 로지스틱 회귀의 경우 재현율이 0.6014 에서 0.6712 로, LightGBM의 경우 0.7635 에서 0.8288 로 크게 증가했다.

 

3-3. SMOTE 오버 샘플링

SMOTE를 적용할 때에는 반드시 학습 데이터 세트만 오버 샘플링해야한다.(검증 데이터 세트나 테스트 세트를 오버 샘플링하면 결국 원본데이터가 아니라서 의미가 없다)

-먼저, 로지스틱 회귀모델

SMOTE 적용 전 199362건이 적용 후 2배에 가까운 398040건으로 늘어났고, 레이블 값이 0과 1의 분포가 동일하게 199020개로 생성되었다.
로지스틱 회귀는 SMOTE 적용 후 재현율이  0.6712  에서  0.9247  로 크게 증가하지만 정밀도가  0.8750  에서  0.0542  로 크게 저하되었다
0.99 이하에서 재현율이 매우 좋고, 정밀도가 극단적으로 낮다가 0.99 이상에서 반대로 값이 증가하고 감소한다. 임곗값을 조정하더라도 민감도가 너무 심해 올바른 재현율/정밀도 성능을 얻을 수 없다.

-LightGBM모델

이상치만 제거한 경우와 비교해서 재현율이  0.8288  에서  0.8493  으로 높아졌고, 정밀도는  0.9603  에서  0.9118  로 낮아졌다. 일반적으로  SMOTE  를 적용하면 재현율은 높아지지만 정밀도는 떨어진다

4. 결과

추가로, SMOTE 오버 샘플링은 로지스틱 회귀 정밀도 0.0540, 재현율 0.9247, ROC-AUC 0.9737/ LightGBM은 정밀도 0.9323, 재현율 0.8493, ROC-AUC 0.9789가 나왔다는 것.