머신러닝

심전도 데이터 Time Series Anomaly Detection

coding art 2022. 2. 13. 14:17
728x90

 

Intro to Autoencoders

https://developer.habana.ai/tutorials/tensorflow/intro-to-autoencoders/

 

기계장치의 Anomaly Detection 보다 흥미로울 수 있는 ECG5000 심전도 데이터세트를 사용하는 시계열상의 Anomaly Detection 코드를 고려하자. 

 

헤더 영역에서 불러들여야 할 라이브러리들을 살펴보자. fashion_mnist 는 심전도 문제와는 연관이 없으므로 제외 가능하다.

여러 곳에서 ECG5000 데이터세트를 다운받을 수 있으나 여기서는 구글 텐서플로우 사이트로부터 다운 받자.

로드한 raw_data 리스트에 심전도 데이터와 라벨 값이 함께 들어 있으므로 분리해 내도록 한다. raw_data는 마지막이 라벨 데이터(raw_data[ :, -1])이며 이를 제외한 140개 단위로 총  4998개((raw_data[ 4998, 140])로 이루어져 있다.

라벨 값인 test_labels 를 출력해 보면 1.0 과 0.0 이 혼재해 있음을 알 수 있다.

정상적인 부분과 anomay를 포함하는 비정상 부분으로 구성된 이 라벨 값들로부터 학습용과 validation 부분을 각각 분리하여 사용할 필요가 있다.

아울러 test_size = 0.2 를 적용하면 학습용이 3998개 validation 용이 1000 개임을 알 수 있다. 이들은 다시 정상용과 비정상용으로 분리해야 한다. 정상용은 학습용 2359개와 validation 용은 560개로 이루어 비정상용은 학습용 1639개와 validation 용은 440개로 이루어진다. 이들은 라벨 값에서 1.0은 정상용이며 0.0은 비정상용이다.

학습용과 validation(test)용에서 최대 최소 값을 찾아 스케일링 작업을 하고 Tensor 화 한다.

train_labels 와 test_labels를 불리언으로 type을 설정한다. 라벨 값들은 원래 1.0과 0.0으로 설정되어 있었는데 True, False 로 변경과 아울러 이들을 train_data 와 test_data에 넣게 되면 True 인 경우만 수집이 되어 normal_train_data 와 normal_test_data로 분리된다. anomalous_train_data 와 anomalous _test_data 는 라벨 값을 "~" 를 사용하여 각 비트들의 값을 뒤지븐 후 적용하면 마찬가지로 분리된 데이터를 얻을 수 있다.

아래의 그래프는 정상과 비정상적인 경우를 보여준다.

Anomaly Detection 코드의 핵심 부분을 살펴보자. 클라스 AnomalyDetector 는 super 기법을 사용하는데 이 기법은 PyTorch 예제들과 여기서 tensorflow.keras에서 사용되고 있으며 그대로 사용하도록 한다. 아울러 이 클라스 코드는 CNN이 아닌 딥러닝 방식으로 작성되었음에 유의하자. 이코드를 1차원 CNN 으로 변환하는 방법은 별도로 다루어 볼 예정이다.

 

autoencoder에 의한 학습과정에서 에포크 수는 현재 20 이지만 컴퓨팅 부담이 별로 없으므로 200 으로 값을 올려 cost 함수들의 최소화 과정을 살펴보자.

아래의 그래프들은 validation test data와 오토엔코딩 된 결과 validation test data와 오토엔코딩 된 결과와의 mae 에러 분포를 나타낸다. mae 에러는 파이값의 절대값을 나타낸다. 그렇다면 정상이든 비정상이든 140개 각각의 에러분포 그래프에서 mae 값 계산이 가능해진다.

정상 학습용 데이터에 대해서 autoencoding 된 결과와 원래의 데이터와의 오차의 절대값 2359개를 평가하여 아래 왼쪽의 그래프를 작성하자. 마찬가지로 비정상 테스트(validation) 데이터  용은 440개를 대상으로 평가하여 오른쪽 그래프를 얻을 수 있다.

 

가시적 비교에 의하면 2개의 mae분포가 확연히 다르다는 점을 알 수 있다.

정상 학습용 데이터에 대해서 통상 평균값을 기준으로 표준편차 1 시그마까지를 임계치(Threshold)로 잡을 경우 

0.032 임을 알 수 있다. 이에 비해 비정상-테스트 그래프는 대부분의 분포가 0.035 이상에 몰려 있음을 알 수 있다.

 

즉 autoencoding  된 결과들과의 오차절대값 비교관점에서 두 분포는 이질적이다 즉 Anomaly 가 포착되었다고 볼 수 있다.

Anomaly를 찾기 위한 비교의 대상으로서 추가로 비정상-학습 결과를 세밀히 조사해야 할 필요가 있을는데 다음의 그래프가 그 결과이다. 비정상 학습 데이터를 처리해본 결과도 비정상 테스트 데이터와 대단히 유사함을 관찰할 수 있다.

첨부된 코드를 다운받아 실행시켜보자.

ecgautoencoding.ipynb
0.14MB

 

참고블로그

http://blog.daum.net/ejleep1/1188

 

Keras 기초 예제: Time series anomaly detection using an Autoencoder

※파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 발행 http://blog.daum.net/ejleep1/1175 파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 (하이퍼링크) 목차 pdf

blog.daum.net

 

 

Under Construction ...