-
S-H-ESD를 node로 포팅CS 2019. 3. 14. 22:38
회사에서 사용하는 다차원분석툴에 abnormal detection을 넣어보면 어떨까 생각을 했다. 여러 서비스들을 한번에 보는 툴이기 때문에 각 서비스별로 패턴이 다르고 다차원분석을 해야하기 때문에 deep learning을 통한 abnormal detection을 하기엔 여러가지 문제점이 있었다.
abnormal detection을 찾아보던중 twitter에서 만든 s-h-esd가 눈에 들어왔다.
https://h3imdallr.github.io/2017-06-20/anomaly_detection/
이상탐지 Anomaly Detection
시계열 이상탐지 중심으로 time series anomaly detection
h3imdallr.github.io
사내에서 사용하는 다차원분석툴은 node로 만들어져있기때문에 R로 짜여진 s-h-esd를 사용하려면 결국 서버를 두고 rest를 쓰든 rpc를 쓰든 해야하지만 뭐든지 찾으면 있다는 npm에 관련된게 없고 코드도 그렇게 길어보이지 않아 포팅을 마음먹고 진행했다.
npm에 패키지들이 많다고는 하지만 s-h-esd에서 사용하는 통계관련 라이브러리가 부족해서 s-h-esd에서 사용되는 확률, 통계 분석에 사용되는 함수들도 직접 구현해야했다는게 제일 힘들었다. R은 원래 데이터분석을 위한 언어이고 위 링크에 나오는 python 포트도 scipy의 통계 함수를 사용했지만 node는 npm에 관련 라이브러리들을 찾기가 힘들어 직접 구현해야했다. 원래는 student-t의 cdf도 직접 구현했지만 lib-r-math.js 패키지에 구현이 돼있어 그냥 가져다 썼다. s-h-esd에선 student-d cdf의 역함수를 사용하고있는데 역함수 식은 찾아도 없어서 무식한 방식으로 계산했다.
여차저차하여 s-h-esd와 그것의 의존성인 stl을 둘 다 구현하고 npm에 배포하였다.
https://github.com/elwlwlwk/s-h-esd
elwlwlwk/s-h-esd
A Node port of Seasonal Hybrid ESD (S-H-ESD), Twitter's AnomalyDetection. - elwlwlwk/s-h-esd
github.com
https://github.com/elwlwlwk/STLnode
elwlwlwk/STLnode
Node port of R's stl function. Contribute to elwlwlwk/STLnode development by creating an account on GitHub.
github.com
https://www.npmjs.com/package/stlnode
stlnode
Node port of Seasonal Decomposition of Time Series by Loess
www.npmjs.com
https://www.npmjs.com/package/s-h-esd
s-h-esd
A Node port of Seasonal Hybrid ESD (S-H-ESD), Twitter's AnomalyDetection.
www.npmjs.com
detect _vec도 포팅해야하지만 현재는 필요한게 ts뿐이라 ts만 포팅했다. 조만간 해야지...
포팅하면서 느낀점은 pandas의 배열연산이 너무나도 그리웠다는것이다. R은 데이터분석 특화언어니까 배열연산이 쉽고 pandas도 R을 따라한것이라면 node는 그런것이 없어 머리를 싸매면서 직접해야했다. 다행히 map과 filter, reduce를 써서 최대한 비슷한 위치에 원본 소스에는 없는 변수 선언을 최소화했다.
댓글