세로형
Recent Posts
Recent Comments
Link
03-29 03:47
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

머신러닝으로 신용카드 사기 탐지하기 2편 - 데이터 정규화(data normalization) 본문

machine learning(머신러닝)

머신러닝으로 신용카드 사기 탐지하기 2편 - 데이터 정규화(data normalization)

이수진의 블로그 2019. 12. 12. 09:18

포스팅 주제

더보기

이번 포스팅은 지난 포스팅에 이어서 캐글의 신용카드 사기 탐지(kaggle credit card fraud detection) 데이터를 활용합니다.

또한, kaggle credit card fraud detection의 커널 중 

https://www.kaggle.com/janiobachmann/credit-fraud-dealing-with-imbalanced-datasets

커널을 참조하여 공부하고 정리하였습니다.

이번 글은 지난 글에서 진행한 신용카드 사기 탐지 데이터의 데이터 스케일(data scale)을 변경시켜보려고 합니다.

그리고 이렇게 데이터 스케일이 변경되었을 때 머신러닝 모델 성능이 어떻게 변화되는지 살펴보겠습니다.

 

지난 포스팅에서는 데이터 원본을 그대로 사용하여 단순히 신용카드 사기를 탐지했습니다.

궁금하신 분들은 지난 포스팅을 보시면 되겠습니다.(https://lsjsj92.tistory.com/553)

 

머신러닝으로 신용카드 사기 탐지하기 1편- kaggle credit card fraud

이번 포스팅은 머신러닝으로 신용카드 사기를 탐지하는 모델을 만들어보려고 합니다. 해당 포스팅의 데이터는 kaggle에서 제공해준 kaggle credit card fraud를 사용했습니다. 또한, 한 커널을 필사하면서 진행하..

lsjsj92.tistory.com

 

코드는 아래 github에 존재합니다.

https://github.com/lsjsj92/machine_learning_basic

 

lsjsj92/machine_learning_basic

Repo for everyone who wants a machine learning basic - lsjsj92/machine_learning_basic

github.com

11번에 코드가 존재합니다.

 


데이터 분포 변경 - 데이터 정규화(data normalization)

캐글의 신용카드 사기 탐지 데이터를 살펴보면 Amount라는 column과 Time이라는 column이 존재합니다.

그리고 V1에서 V28까지의 컬럼도 존재하지만 이게 정확히 어떤 것을 뜻하는 것인지 알 수가 없죠.

그러니 이번에는 Amount와 Time 컬럼에 focus를 두고 데이터를 살펴봅니다.

먼저 Amount와 Time의 데이터 분포를 살펴봅니다.

 

python seaborn을 사용하여서 distplot을 이용해 데이터 분포를 살펴보겠습니다.

seaborn의 distplot을 이용해서 amount와 time을 보았는데 데이터가 특이한 점이 있습니다.

Amount는 대부분 0 부분쪽에 쏠려있는 경향이 있습니다. 하지만 아~주 미세하게 25000까지 쭉 이어져있죠.

또한, Time 컬럼은 데이터 분포가 Amount보다는 고르지만 최소 0부터 16만이 넘는 값이 존재하고 있습니다.

 

이 두 개의 문제는 지금 데이터 분포가 너무 크다는 것입니다.

이렇게 데이터 분포가 커지게 되면 머신러닝 모델이 제대로 동작되지 않을 수 있습니다. 큰 값에 쏠려버리는 경우가 있을 수 있기 때문입니다.

따라서 이렇게 데이터 분포가 고르지 않을 경우에는 데이터 분포를 data normalization 과정을 거쳐주어야 합니다.

data normalization 과정에서는 표준화(Standardization)으로 바꿔주는 방법, 0 ~ 1 범위로 축소하는 방법 등 다양한 방법이 있습니다.

여기서는 Standardization과 log scale 등을 적용해보겠습니다.

 

Amount 컬럼 data normalization

먼저 Amount 컬럼에 데이터 정규화를 적용하고 다시 seaborn으로 살펴보겠습니다.

 

Amount에서는 StandardScaler를 사용해서 Standardization 분포와 log scale을 살펴봅니다.

왼쪽이 log scale로 데이터 정규화를 진행한 그래프고 오른쪽이 standard scale로 변경한 그래프입니다.

둘 다 데이터 분포가 0 ~ 25000이 되었던 것에 비해서 상당히 많이 줄었습니다.

이 중 standard scale은 기존에 Amount와 데이터 분포가 상당히 유사합니다.

그래서 여기서는 standard scale을 채택하려고 합니다!

 

Time 컬럼 data normalization

다음으로 Time 컬럼을 보겠습니다.

Time에서는 Robust scale과 log scale, standard scale 3개의 scaler로 데이터 normalization을 진행하겠습니다.

3개의 그림은 왼쪽부터 robust scale, log scale, standard scale입니다.

기존 데이터 분포와 비슷한 것은 robust scale과 standard scale입니다. 

그 중 robust scale이 데이터 분포가 좀 더 적게 나왔고 (결과론 적이지만) overfitting이 걸리지 않기 때문에 이것으로 채택하겠습니다.

 

정규화(data normalization)된 데이터 추가

자! 여기까지 TIme과 Amount에 대해서 데이터 정규화를 진행했습니다.

그리고 Amount에서는 standard(표준화)를, Time에서는 Robust를 채택하기로 했죠

이제 Amount와 TIme 데이터를 이 정규화된 데이터로 바꿔주고 기존에 불필요한 데이터는 drop하겠습니다.

 

dataframe에 있었던 불필요한 컬럼을 drop해줍니다.

근데 문제가 이렇게 하면 맨 마지막에 scaled_amount와 scaled_time이 들어가있습니다.

이를 맨 앞으로 빼내야지 나중에 class(target)을 뽑을 떄 불편하지도 않고 보기도 좋습니다.

 

그래서 맨 앞으로 빼냅니다

 

머신러닝 모델 평가

자! 이제 이 상태에서 머신러닝 모델을 평가해보겠습니다.

지난 포스팅에서 로지스틱 회귀(logistic regression)과 lightgbm 2개의 머신러닝 모델을 적용해서

신용카드 사기를 탐지할 수 있는 모델을 만들었는데요

 

이제 데이터 정규화(data normalization)을 진행한 현재 상태에서 머신러닝 모델들이 어떻게 성능이 변화되는지 살펴봅니다.

 

짠! 이렇게 나오는군요

지난 포스팅에서 logistic regression 모델의 평가는 아래와 같았습니다.

  • 정밀도 : 0.77
  • 재현율 : 0.53
  • f1-score : 0.62

하지만 지금 로지스틱 회귀 성능을 보시면 

  • 정밀도 : 0.87
  • 재현율 : 0.66
  • f1-score : 0.75

이렇게 변경이 되었습니다. lightgbm의 모델 성능은 변화가 없구요.

즉, 여기서 알 수 있는 것은! 로지스틱 회귀(logistic regression)의 성능은 데이터 분포가 중요하다!

이것을 알 수 있습니다.

 

이제 다음 포스팅에서 더 이어서 신용카드 사기 탐지를 진행해보겠습니다.

https://lsjsj92.tistory.com/556

 

머신러닝, 딥러닝 이상치(outlier) 데이터 탐지 및 제거 하기 - outlier data detection and remove

포스팅 개요 이번 포스팅은 머신러닝과 딥러닝에서 많이 사용하는 데이터 이상치 탐지(outlier detection)에 대해서 작성합니다. 또한, 지난 포스팅인 캐글의 신용카드 사기 탐지 대회 데이터셋(kaggle credit car..

lsjsj92.tistory.com

 

반응형
그리드형
Comments