본문 바로가기
Machine Learning

39. 이상(사기) 탐지 : Anomaly Detection System 만들기

by 대소니 2016. 8. 28.


머신 러닝 알고리즘을 평가하는 방법으로 실제 숫자로 나타내어 평가하는 방법에 대해서 이전 시간에도 알아보았습니다. Anomaly Detection System을 만들때도 이러한 방법이 유용하게 사용됩니다.

지금까지 살펴본 anomaly data들은 unlabeled data 였습니다만, labeled data가 될 수 있다면 평가하는 것이 가능할 겁니다. 그래서 만약 특정 data가 anomaly data라면 y=1로 정의하고, 그렇치 않다면 즉, 정상적인 normal data라면 y=0으로 하여 label을 생성할 것입니다. 이를 위해서 data set을 분리하고 어떻게 label을 만드는지 알아보겠습니다.


비행기 엔진을 예를 들어서 아래와 같이 설명을 할 수 있습니다.

10,000개의 정상적인 엔진이 있고 20개의 비정상적인 엔진이 있습니다. 정상적인 엔진이 월등하게 많고 비정상적인 엔진은 상대적으로 적은 수만큼만 존재합니다.

이제 dataset을 나눕니다. 6,000개의 normal data(y=0)를 training set으로 사용하고, 나머지 데이터중에서 2,000개의 normal data와 10개의 anomaly data를 cv set으로 만듭니다. 그리고 남은 2,000개의 normal data와 10개의 anomaly data는 test set으로 하면 되겠습니다. 약 60%:20%:20% 의 비율로 data set을 만드는것이 일반적이며 추천하는 방법입니다.

그런데 많은 사람들이 아래 그림의 하단과 같이 6,000개의 normal data를 training set으로 사용하고, 나머지 4,000개,10개를 cv set으로 또 4,000개, 10개를 test set으로 사용하는 실수를 합니다. 이것은 동일한 data로 cv, test set이 구성이 되므로 좋치 않습니다.


알고리즘을 평가하는 방법에 대해서 알아보겠습니다.

먼저 위와 같이 생성한 training set을 이용해서 p(x) model을 찾습니다. p(x)는 가우시안 분포를 나타내는 함수였습니다.

그리고 cv/test set을 이용해서 y 가 1인지 0인지 확인을 합니다. 이때 기준이 되는 threshold 값이 epsilon이 됩니다.
여기서 1인지 0인지로 구분을 하는 것이 마치 supervised learning algorithm과 비슷해 보이는 느낌입니다.

이렇게 label 된 data를 평가하는 방법는 우리가 이전에 배운 방법으로 Precision/Recall을 구해서 F1 score 값을 비교하는 것이 좋습니다. 이를 위해서 cv set을 이용해서 다양한 epsilon에 대한 F1 score 값을 비교해서 가장 최적의 epsilon 값을 찾아 낼 수 있습니다.

그리고 최종적으로 algorithm에 대한 평가를 할때 test set을 이용하는 것입니다.


위에서 잠시 언급했던 것과 같이 labeled data를 생성하는 부분이 Anomaly detection과 Supervised learning이 비슷해 보였습니다. 대략적으로 보면 둘다 가능하지 않을까 하는 생각이 드는데 실제로 어떻게 다른지 차이점을 알아보겠습니다.

아래 그림과 같이 비교를 할 수 있습니다. 

Anomaly detection은 아주 작은 수의 anomaly data(0~20개)임에도 이것을 발견할 수 있습니다. 이전에 배운 skewed data에 대한 문제와 비슷합니다. 그렇기에 상대적으로 아주 많은 수의 normal data가 존재해도 사용이 가능합니다. 이런 data들은 p(x) 함수에 수용이 되기 때문입니다. 그리고 정확한 타입을 알지 못하더라도 anomaly data를 찾을 수 있는 장점이 있습니다. 이전에 SPAM 메일을 처리하는 부분에서 살펴본것과 같이 다양한 타입이 있고 이를 위해 다양한 대응을 해주어야 했습니다. 이러한 것들이 해결이 될 수 있는 것이지요. 또 현재까지는 발견되지 않은 anomalies data도 충분히 대응이 가능할 것입니다.

반면에, Supervised learning은 충분히 많은 수의 normal / anomaly data가 필요합니다. 그래야 anomaly data를 통해서 학습하여 다른 anomaly data들을 찾을 수 있기 때문입니다. 그렇기에 현재 학습이 되어 있는 비슷한 data 만 찾을 수 있을 것입니다.


위와 같은 특성이 있기에 다음과 같은 분양에서 각각 응용이 되는 것을 알 수 있습니다. 비슷해 보이면서 조금 다른 부분이 있습니다. 중요한 것은 현재까지의 data를 학습하여 비슷한 data들을 예측하는 것인지와 현재까지의 data와 전혀 다른 성격의 data를 발견해야 하는가에서 큰 차이가 나는 것 같습니다.


항상 모든 데이터셋들이 가우시안 분포를 따른다면 문제가 없겠지만, 그렇치 않은 경우도 있습니다. 그런경우도 적용이 될 수 있을까요?

아래 그림의 왼쪽 상단의 그래프는 가우시안 분포를 따르는 dataset입니다. Octave에서는 hist라는 명령어를 사용해서 그래프로 표현할 수 있는 기능을 제공하고 있습니다.

왼쪽 하단의 그래프는 가우시안 분포를 따르지 않는 dataset의 모습니다. 하지만 아주 쉽게 오른쪽 그래프와 같이 변형을 할 수 있습니다. 모든 x data에 log() 함수를 적용하거나 루트(제곱근) 함수를 적용하면 됩니다. 이것은 dataset의 성향에 따라서 적절한 값을 찾아서 만들어주면 됩니다. 보통 x 에 대해서 다음과 같은 방법들이 가능합니다.

x -> log(x)
x -> log(x + c)
x -> x ^ 1/2
x -> x ^ 1/3


이번에는 anomaly detection을 위한 error analysis에 대해서 알아보겠습니다.

이전에 배운 supervised learning에서 error analysis하는 방법과 비슷합니다. cv set을 이용해서 algorithm을 수행하고 그 결과중에서 잘못된 것을 분석하여 그 원인이 해결될 수 있는 새로운 정보(new features)를 생성하는 것입니다.

아래 그림에서의 예제와 같이 x1의 분포상에 내부에 존재하여 normal data 처럼 보이지만 실제적으로는 오른쪽 그림에서와 같이 분포상에서 멀리 떨어져서 존재하는 anomaly data 일수도 있습니다. 이러한 문제가 발견이 되면 이를 해결하기 위한 방안을 고민해 봐야합니다.


그러기 위해서 어떤 값이 비정상적으로 발생하는지를 확인하고 그에 대한 새로운 feature를 생성합니다. 아래와 같이 데이터 센터에서 컴퓨터들을 모니터링하는 경우를 생각해보겠습니다. 메모리 사용률도 확인할수 있고, 디스크 사용도 확인할 수 있고 CPU 사용량, 네트워크 사용량등도 확인이 가능할 것입니다.

 이때 분석을 한 결과 네트워크 사용에 비해서 CPU 사용이 비정상적으로 높다면 이상한 컴퓨터다라고 판단을 할 수 있을 것입니다. 접속자가 많치 않음에도 불구하고 혼자 무언가를 수행하는 것이니까요. 이런 컴퓨터는 이상하므로 모니터링을 해야한다면 아래 그림 하단의 파란색 공식과 같이 두가지 정보를 통해서 새로운 feature를 생성하고 만약에 필요하다면 scaling을 해주도록 합니다.

댓글