RBM(제한된 볼츠만 머신)을 활용하여 신용카드 거래의 이상징후를 탐지해보자.
RBM에 대한 자세한 설명은 아래 링크에서 확인할 수 있다. 이 포스팅을 정독하여 읽고 RBM에 대하여 확실히 이해하고 분석을 진행하도록 하자.
https://velog.io/@chulhongsung/RBM
Restricted Boltzmann Machines(RBM)
초기 인공 신경망 모형 중 하나인 RBM에 대해서 소개
velog.io
RBM을 사용하여 입력 데이터의 확률분포를 만들 수 있고, 이를 통해 특정 샘플의 발생 확률을 확인할 수 있다. 확률이 적은 샘플이 나타났을 때 이를 이상 징후로 판단할 수 있게 된다. 우리는 이 원리를 사용하여 신용카드 거래의 이상징후를 탐지해 볼 것이다.
먼저 아래 링크에서 분석에 필요한 데이터를 다운받는다.
https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud
Credit Card Fraud Detection
Anonymized credit card transactions labeled as fraudulent or genuine
www.kaggle.com
RBM 학습을 위해 필요한 패키지도 다운받는다.
https://github.com/aaxwaz/Fraud-detection-using-deep-learning
GitHub - aaxwaz/Fraud-detection-using-deep-learning
Contribute to aaxwaz/Fraud-detection-using-deep-learning development by creating an account on GitHub.
github.com
'boltzmann_machines'라는 폴더를 새로 생성한다.
본 분석에는 rbm 폴더만 필요하기 때문에 해당 폴더만을 'boltzmann_machines' 폴더에 넣어준다.
물론, 데이터와 패키지 파일은 파이썬 파일이 있는 경로에 위처럼 넣어주어야 아래 코드들을 그대로 돌렸을 때 문제 없이 실행된다.
이렇게 세팅이 완료 됐다면, 아래 코딩을 돌려보자.
1. 필요한 패키지 불러오기
import pandas as pd
import tensorflow as tf
from sklearn.metrics import roc_auc_score as auc
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from boltzmann_machines.rbm import * #다운받은 패키지
%matplotlib inline
아까 다운받은 패키지와 그 외 필요한 패키지들을 불러온다.
마지막 줄은 주피터 노트북 자체에 그래프를 저장할 수 있도록 하는 구문이다.
2. 데이터 불러오기
df=pd.read_csv("creditcard.csv", sep=",", index_col=None, encoding="utf-8-sig")
데이터의 컬럼이 많은 편이다.
각 시간별로 customer의 신용카드 거래 내역을 PCA를 통해 비식별화한 모습이다.
데이터의 30, 31번째 컬럼은 거래량과 해당 데이터가 정상거래인지 비정상거래인지를 나타낸다.
데이터를 보았을 때, Time열과 Amount열의 값 범위가 상대적으로 큰 편이라 정규화가 필요해보인다.
이렇게 범위가 큰 값들은 RBM 학습을 망칠 수 있기 때문에 정규화가 필수적이다.
아래 구문을 통해 해당 열의 데이터를 표준화 시킨다.
df['Time']=StandardScaler().fit_transform(df['Time'].values.reshape(-1,1))
df['Amount']=StandardScaler().fit_transform(df['Amount'].values.reshape(-1,1))
df.iloc[:,[0]+[29]]
표준화 된 것을 확인한다.
3. 데이터 split
학습을 위한 학습용 데이터와 학습결과의 테스트를 위한 테스트용 데이터로 나눈 후, 각 데이터의 형태를 파악한다.
x_train=df.iloc[:200000, 1:-2].values
y_train=df.iloc[:200000, -1].values
x_test=df.iloc[200000:, 1:-2].values
y_test=df.iloc[200000:, -1].values
print("Shapes:\nx_train: %s\ny_train:%s\n" % (x_train.shape, y_train.shape))
print("Shapes:\nx_test: %s\ny_test:%s\n" % (x_test.shape, y_test.shape))
4. RBM 모형 만들기
아래의 코드를 통해 RBM 모형을 구축한다.
model=RBM(x_train.shape[1], 10, visible_unit_type='gauss', main_dir='./', model_name='rbm_model.ckpt',
gibbs_sampling_steps=4, learning_rate=0.001, momentum=0.95, batch_size=512, num_epochs=20, verbose=1)
파라미터의 해석은 다음과 같다.
- num_visible: visible layer의 노드 수
- num_hidden: hidden layer의 노드 수
- visible_unit_type: visible 단위가 이진 또는 가우스 유형인지
- main_dir: 모델과 데이터 및 요약을 위한 폴더를 저장할 기본 폴더
- model_name: 저장할 때 사용할 모델 이름
- gibbs_sampling_steps: (선택사항) 기본값은 1
- learning_rate:(선택사항) 기본값은 0.01이고 학습속도를 지정
- momentum: 경사 하강법에 사용할 모멘텀 값으로 기본값은 0.9
- l2: 가중치 감소. 기본값은 0.001
- batch_size: (선택사항) 기본값은 10
- num_epochs:(선택사항) 기본값은 10
- stddev: (선택사항) 기본값은 0.1, visible_unit_type이 gauss가 아닌 경우 무시
- verbose: (선택사항) 기본값은 0, 값이 1이면 학습과정이 표시되고 0이면 표시 안됨
- plot_training_loss: 훈련 손실을 표시할지 여부, 기본값은 True
model.fit(x_train, validation_set=x_test)
아까 분리한 데이터를 활용하여 모델을 학습한다.
학습을 진행할 수록 Reconstrunction error가 조금씩 감소하는 모습이다.
5. 모델 평가
테스트 데이터 셋의 각 항목에 대한 확률값을 얻기 위하여 자유 에너지(E(x))를 계산한다.
이 자유 에너지로 각 데이터 항목의 발생 확률을 얻을 수 있다.
costs=model.getFreeEnergy(x_test).reshape(-1)
score=auc(y_test, costs)
print(score)
결과는 0.95이상으로 매우 좋은 성능이다.
6. 비정상거래 데이터 특징
normal=pd.DataFrame(costs[y_test==0])
normal.describe()
anomaly=pd.DataFrame(costs[y_test==1])
anomaly.describe()
정상 데이터의 cost는 0으로 몰려 있는 반면, 비정상 데이터의 cost는 큰 값에 몰려있는 것을 확인할 수 있다.
이것을 시각화해보자.
plt.title('Free Energy vs Probabilities for Test Set')
plt.figure(figsize=(15,10))
plt.xlabel('Free Energy')
plt.ylabel('Probability')
plt.hist(costs[(y_test==0)&(costs<250)], bins=100, color='green',density=True, label='Normal')
plt.hist(costs[(y_test==1)&(costs<250)], bins=100, color='red',density=True, label='Anomaly')
plt.legend(loc="upper right")
위 그림을 보면, 자유 에너지가 클 때 확률이 높은 정상 데이터들이 존재하지 않다는 것을 확인할 수 있다.
-'파이썬 딥러닝으로 시작하는 이상 징후 탐지' 도서를 참고하여 본 포스팅을 작성하였습니다.
'대학원 공부 > anomaly detection' 카테고리의 다른 글
[Anomaly detection] RBM을 이용한 이상 징후 탐지_KDDCUP 데이터셋 (볼츠만 머신, 제한된 볼츠만 머신) (0) | 2023.07.13 |
---|