Auto Encoder로 Anomaly Detection 하는 방법 설명 및 Kaggle 사례 소개
오토인코더로 이상치를 탐지하는 방법에 대해 설명하기에 앞서, 이상 탐지가 무엇인지 간단히 설명하겠다.
1. Anomaly Detection이란?
Normal(정상) Sample과 Abnomal(비정상, 이상치, 특이치) Sample을 구별해내는 문제로, 제조업/CCTV/의료 영상/Social Network 등 다양한 분야에서 응용되고 있다.
출처 : github.com/hoya012/awesome-anomaly-detection
위 그림에서 왼쪽 그림은 시계열 데이터로, 일정 주기로 일정 패턴을 보이다가 이상치를 보이는 부분이 있다. 오른쪽 그림은 이미지 데이터로, 역시 이상치를 보이는 부분이 있으며, 이러한 이상치를 Anomaly or Abnormal 이라 하고, 이를 찾아내는 것이 Anomaly Detection이다.
2. 학습 데이터에 따른 분류
Anomaly Detection은 학습시 비정상 Sample의 사용 여부 및 Label 유무에 따라 Supervised, Semi-supervised, Unsupervised Anomaly Detection으로 분류할 수 있다.
2-1. Supervised Learning
주어진 학습 데이터 셋에 정상 sample과 비정상 sample의 Data와 Label이 모두 존재하는 경우를 Supervised Learning이라 한다.
장점 : 양/불 판정 정확도가 높다.
단점 : 비정상 sample을 취득하는데 시간과 비용이 많이 든다. / Class-Imbalance 문제를 해결해야 한다.
실제 Anomaly Detection 문제를 해결하고자 해 본 경험이 있다면, Class-Imbalance 문제가 얼마나 흔한지 알고 있을 것이다.
예로, 아래 설명할 Kaggle의 Credit Card Fraud Detection 문제에서도 전체 284,807건의 데이터 중 비정상 sample은 오직 492건 뿐이다. 즉, 전체 0.172% 밖에 되지 않는다.
이를 해결하기 위한 방법으로는 Data Augmentation(증강), Loss function 재설계, Batch Sampling 등이 있다.
위 Kaggle 문제에서는 많은 참가자들이 주로 정상 데이터를 비정상 데이터 개수에 맞춰 sampling 하는 방법으로 이를 해결했다.
2-2. Semi-supervised Learning
위 Supervised Learning의 Class-Imbalance 문제를 해결하기 위한 방법 중 하나로, 오직 정상 sample만을 사용해서 모델을 학습하는 방식이다.
대표적인 알고리즘은 One-Class SVM이 있으며, 동작 원리는 정상 sample들을 둘러싸는 discriminative boundary를 설정하고, 이 boundary를 최대한 좁혀 boundary 밖에 있는 sample들을 모두 비정상으로 간주한다. 즉, 최대한 정상 특징을 잡아내고, 그 특징을 벗어나면 비정상으로 판단하는 원리이다.
장점 : 정상 Sample만 있어도 학습이 가능하다.
단점 : Supervised Learning 대비 정확도가 떨어진다.
2-3. Unsupervised Learning
Label이 존재하지 않을 때, 대부분의 데이터를 정상 Sample이라 가정하고 학습시키는 방식이다.
대표적인 알고리즘으로는 AutoEncoder가 있으며, 이는 아래 자세히 설명하겠다.
장점 : Labeling과정이 필요하지 않다.
단점 : 양/불 판정 정확도가 높지 않다. / hyper parameter에 매우 민감하다.
사실, 일반적으로 Semi-supervised와 Unsupervised Learning을 구분하지는 않는다. 굳이 구분하자면, 오직 정상 sample만 학습시키는 것을 Semi-supervised, Label이 없어 대부분 정상 sample이라 간주하고 학습시키는 것을 Unsupervised라 한다.
다음으로 학습 데이터가 아니라, 판정하고자 하는 비정상 sample 정의 방식에 따라 Novelty Detection과 Outlier Detection으로 구분할 수 있다.
3. 비정상 Sample 정의 방식에 따른 분류
위 예시에서 강아지 사진들을 Normal Class라 정의했을 때, 강아지 사진이긴 하지만, 이전에 없던 형태의 새로운 강아지가 등장하는 경우, 이러한 sample을 찾아내는 것을 Novelty Detection 이라 한다. 즉, 지금까지 등장하지는 않았지만, 충분히 등장할 수 있는 sample을 찾아내는 연구에 적합하다.
반면, 강아지가 아닌 호랑이, 말, 운동화, 비행기 등 강아지와 전혀 관련 없는 sample을 찾아내는 방법론을 Outlier Detection이라 하며, 등장할 가능성이 거의 없는 sample을 찾아내는 연구에 적합하다.
이 두개를 합쳐 Anomaly Detection이라 한다.
그럼 이제 이상치를 탐지하는 여러 알고리즘 중 Auto Encoder에 대해 알아보겠다.
어떻게 적용하는지에 앞서, 오토인코더가 무엇인지 먼저 알아보겠다.
4. AutoEncoder란?
오토인코더의 특징은 다음과 같다.
- Unsupervised Learning
- 입력과 출력층의 뉴련 수가 동일한 신경망 모델
- Loss function은 입력과 출력의 차이(MSE)로 계산. 즉, 입력과 출력이 동일해지도록 학습
- 저차원의 hidden layer가 입력과 같은 출력을 내기위해 학습하는 과정에서 입력 데이터의 가장 중요한 특성(feature)를 학습
입력층과 출력층 사이 hidden layer의 dimension은 hyper parameter로, 몇 층을 쌓을지, 몇 개의 뉴런으로 할지는 성능과 목적에 따라 지정해주면 된다.
가운데 Bottleneck layer를 기점으로 나비모양의 대칭이 가장 큰 특징이다.
Input Layer부터 Bottleneck layer 까지를 Encoder라 하며, 입력을 내부 표현으로 변환하는 과정이다. AutoEncoder를 전체 학습 후, 이 부분만 따로 차원축소에 사용하기도 한다.
Bottleneck layer 부터 Output Layer 까지를 Decoder라 하며, 내부 표현을 출력으로 변환하는 과정이다.
참고로 Bottleneck layer는 Latent Variable, Feature, Hidden representation라 부르기도 한다.
그래서 이러한 오토인코더의 특성을 활용하여 Anomaly Detection 하는 방법은,
5. Anomaly Detection by Auto Encoder
오토인코더의 특성이 입력 데이터의 가장 중요한 특징을 학습하는 것이므로, noise가 아닌 주요 특징에 대해서만 학습하게 된다.
즉, 아래 사진과 같이 정상 데이터를 입력하면 입력과 동일한 output이 나오게 되어, output과 input의 차이가 거의 없을 것이고,
비정상 데이터를 입력하면 비정상적인 부분이 noise로 인식되어 그 noise가 제외된, 정상 sample과 비슷한 output이 나오게 되면서, output과 input의 차이가 커지게 될 것이다.
즉, 비정상 sample이 정상 sample에 비해 복원 loss(=MSE)가 커지게 된다.
따라서, 이 복원 loss가 일정 threshold를 넘으면 비정상, 그렇지 않으면 정상으로 판명한다.
이를 그림으로 도식화하면 다음과 같다.
6. Kaggle 사례
오토인코더를 이상치 탐지 문제에 적용한 Kaggle Compitition이 있어 소개하고자 한다.
www.kaggle.com/mlg-ulb/creditcardfraud
2013년 9월 유럽, 2일동안 발생한 신용카드 거래내역에 대해 Fraud(사기)를 검출하는 문제이며, 데이터는 보안상 PCA 변환하여 제공되었다.
데이터는 총 284,807건의 transaction 중 492건(0.172%)만이 Fraud transaction으로 매우 Imbalance하며, 31개 컬럼으로 이루어져 있다.
Columns
- Time : 첫 번째 transaction으로부터 경과된 시간(초)
- V1 ~ V 28 : PCA 변환된 데이터
- Amount : 거래 금액
- Class : Target (0 : 정상, 1 : 비정상)
이를 AutoEncoder로 해결한 코드 중 가장 추천을 많이 받은 2개 코드에 대해 소개하겠다.
하나는 위에서 설명한 대로 input과 output의 차이가 크면 비정상, 작으면 정상으로 판단한 방법이고,
다른 하나는 오토인코더를 차원축소로만 사용, 차원 축소된 값으로 다시 Classfication 하는 코드이다.
6-1. Using MSE
www.kaggle.com/robinteuwens/anomaly-detection-with-auto-encoders
이 코드의 특징은
① Amount : log 변환; amount 컬럼이 한 쪽으로 치우쳐 있으므로, log를 취해 정규화한다.
② 200,000개의 non Fraud sample만 사용하여 Auto Encoder 학습
③ 0-1 Scale한 데이터로 학습
④ Test Set에 대해 MSE(= mean((output - input)^2)) 계산 후, 수정된 Z-score로 thresholding
④ 에 계산된 MSE는 다음과 같다.
clean(=normal =non fraud)와 fraud의 MSE 분포가 확연이 다르다. 즉, 비정상 sample의 input과 output의 차이가 정상 sample에 비해 큰 것을 알 수 있다.
이 값을 바로 일정 기준 이상으로 정상/비정상을 판단하는 것이 아니라, Z-score를 활용했다.
Z-score는 정규분포에서 평균을 기준으로 표준편차에 몇배 정도 떨어져 있는지를 수치화 한 지표이다.
이 Z-score를 시각화 하면 다음과 같다.
그냥 MSE에 비해 fraud와 non-fraud가 더 확연히 잘 구분되는 것을 볼 수 있다.
이 Z-score에 threshold를 3으로 주어, 3 초과이면 fraud, 이하이면 non-fraud로 구분하였다.
성능은 다음과 같다.
Test Set 84,807건 중 fraud 492건, non-fraud 84,315건 이다.
비정상 492건 중 361건은 맞추었고, 131건은 틀렸다.
참고로 학습된 AutoEncoder에 대해 Encoder 부분만 활용하여 데이터를 2차원으로 축소하여 시각화한 결과는 다음과 같다.
다음으로, AutoEncoder를 차원축소로만 활용하여, Classification한 코드를 소개하겠다.
6-2. Using Encoder
www.kaggle.com/shivamb/semi-supervised-classification-using-autoencoders
이 코드의 특징은
① Time 변환 : Time = Time / 3600 % 24
② 2,000개의 non Fraud sample만 사용하여 Auto Encoder 학습
③ 0-1 Scale한 데이터로 학습
④ 학습된 AutoEncoder에 Encoder만 활용하여 차원 축소 후, 축소된 데이터로 다시 Classification(LogisticRegression)
성능은 다음과 같다.
총 873건의 Test Set 중 non-fraud는 740건, fraud는 133건이고,
fraud 133건 중 118건은 맞추고, 15건은 틀렸다.
이 코드에서 Network의 구조(뉴런 수)는 input -> 100 -> 50 -> 50 -> 100 -> input 으로, 가운데(Bottleneck Layer) Dimension이 50이라, 시각화 하는 과정에서 이를 다시 2차원으로 t-SNE를 활용하여 축소하고, 시각화한다. 그 결과는 다음과 같다.
위 코드에서 차원 축소 알고리즘을 t-SNE와 비교하는 과정에서 시각화결과는 다음과 같다.
왼쪽이 t-SNE로 차원 축소한 결과, 오른쪽이 오토인코더에서 Encoder로 차원 축소한 결과이다.
이렇게 보면 오토인코더의 결과가 Fraud와 non-Fraud를 구분하기 훨씬 좋아보이나, 사실 두 알고리즘에 인풋으로 들어가는 데이터가 다르다.
t-SNE에 들어가는 데이터는 정상 sample에서 3,000개를 sampling했고, AutoEncoder에 들어가는 데이터는 정상 sampel에서 2,000개를 sampling 했으며, AutoEncoder에 들어가는 데이터만 Scale 했다.
실제, 같은 데이터로 t-SNE 해보았더니 거의 비슷한 결과가 나왔다.
같은 데이터로 t-SNE 한 결과는 다음과 같다.
실제로 해당 compitition에서 가장 추천을 많이 받은 코드는 non-fraud도 fraud sample 개수 만큼 sampling 하고, scale 후 t-SNE로 차원 축소하고, 그 값으로 다시 Classification한 코드이다.
즉, 딥러닝이라고 머신러닝에 비해 항상 성능이 좋은 것이 아니라, 나의 목적과 내가 가지고 있는 데이터의 형태에 따라 알고리즘을 잘 선택하여야 한다.
출처 및 참고 : hoya012.github.io/blog/anomaly-detection-overview-1/
'AI > Anomaly Detection' 카테고리의 다른 글
Isolation Forest (for Anomaly Detection) (2) | 2023.02.02 |
---|---|
RaPP(Novelty Detection with Reconstruction along Projection Pathway) 구현 :: Tensorflow, mnist (7) | 2021.06.21 |