anomaly-detection | machine-learning | svm | logistic-regression | data-science

이상탐지 기초, EDA부터 SVM·로지스틱 회귀 지도학습까지

이상탐지가 무엇인지 정의부터 살펴보고, 탐색적 데이터 분석과 SVM·로지스틱 회귀 같은 지도학습 기반 이상탐지의 원리와 한계를 예제 코드와 함께 설명합니다.

Mimul
MimulAugust 02, 2024 · 26 min read · Last Updated:

이상탐지는 정상적인 패턴에서 벗어난 데이터를 찾아내는 작업이다. 제조 공정의 불량품 검출, 금융 거래의 사기 탐지, 서버 지표의 장애 예측처럼 현업에서 마주치는 문제 상당수가 이상탐지 문제로 환원된다. 이 글은 통계 기법부터 시계열 탐지까지 단계적으로 정리하는 이상탐지 시리즈의 첫 번째 편이다. 이상탐지가 푸는 문제를 정의하고, 실제로 이상탐지를 수행하는 흐름과 수법을 고르는 기준을 세운 뒤, 데이터를 먼저 들여다보는 탐색적 데이터 분석을 거쳐 SVM과 로지스틱 회귀라는 두 가지 지도학습 기법으로 이상탐지를 구현한다. 이상탐지를 처음 접하는 개발자와 데이터 엔지니어를 대상으로 하며, 이 글을 읽고 나면 이상탐지 문제를 어떻게 정의하고 어떤 접근으로 풀어야 할지 판단하는 기준을 세울 수 있다.

이상탐지란 무엇인가

정상 상태와 이상 상태를 가르는 기준은 데이터의 확률분포다. 어떤 관측값이 정상 데이터가 따르는 분포에서 나올 가능성이 낮을수록 그 값은 이상에 가깝다. 이 정의는 단순해 보이지만, 실무에서 이상탐지를 어렵게 만드는 원인이기도 하다. 정상 상태의 분포조차 미리 알 수 없는 경우가 많고, 이상 상태는 정의상 자주 일어나지 않으므로 데이터로 관찰하기 어렵기 때문이다.

이런 제약은 이상탐지를 일반적인 이진분류 문제와 다르게 만든다. 일반적인 분류 문제는 두 클래스의 데이터를 고르게 모아 학습할 수 있다고 가정하지만, 이상탐지에서는 정상 데이터가 압도적으로 많고 이상 데이터는 극히 적은 클래스 불균형이 기본값이다. 게다가 실제로 마주칠 이상이 학습 데이터에 담긴 이상과 같은 종류라는 보장도 없다. 제조 라인에서 새로운 고장 유형이 생기거나 금융 거래에서 이전에 없던 사기 수법이 등장하면, 학습 데이터에는 없던 패턴의 이상이 발생한다.

그래서 이상탐지는 두 갈래로 접근한다. 하나는 정상과 이상 라벨이 모두 있다고 가정하고 분류 모델을 학습하는 지도학습이고, 다른 하나는 정상 데이터의 분포만 학습해서 그 분포에서 벗어나는 정도로 이상을 판정하는 비지도학습이다. 라벨이 부족하고 미지의 이상까지 대응해야 하는 실무 상황에서는 비지도학습이 더 널리 쓰이지만, 라벨을 충분히 확보할 수 있다면 지도학습이 더 직접적인 선택이 된다. 이 글에서는 먼저 지도학습으로 이상탐지의 감각을 잡고, 다음 편부터 비지도학습으로 넘어간다.

이상탐지를 실제로 수행하는 흐름

이상탐지 프로젝트는 대개 비슷한 절차를 따른다. 먼저 어떤 관측 단위(공정의 센서값, 거래 한 건, 서버의 지표 하나)를 이상탐지의 대상으로 삼을지 정의하고, 그 대상에서 어떤 변수를 측정할지 정한다. 다음으로 수집한 데이터를 탐색적으로 분석해 변수들의 분포와 관계를 파악하고, 이 파악을 바탕으로 정상 상태를 모델링할 방법(지도학습 분류기, 확률분포 기반 통계 모델, 회귀 모델 등)을 고른다. 모델을 학습한 뒤에는 정상과 이상을 가르는 임계값을 정하고, 실제 운영 데이터에 적용해 성능을 평가한다. 운영에 들어간 뒤에도 데이터의 분포가 시간에 따라 바뀔 수 있으므로 주기적으로 모델을 재검토해야 한다.

이 흐름에서 실제로 가장 많은 시간이 드는 단계는 데이터를 탐색하고 정상 상태를 정의하는 앞부분이다. 모델 자체는 상대적으로 짧은 코드로 구현할 수 있지만, 어떤 변수가 이상을 잘 설명하는지, 정상 데이터에 결측치나 이상치가 섞여 있지는 않은지 확인하는 작업은 데이터셋마다 달라진다. 이 글의 뒷부분에서 다루는 탐색적 데이터 분석은 이 단계를 위한 도구다.

어떤 수법을 고를 것인가

이상탐지 수법을 고르는 첫 번째 기준은 라벨의 유무다. 정상과 이상 데이터에 모두 라벨이 붙어 있고 그 수가 충분하다면 지도학습으로 분류 모델을 학습할 수 있다. 반대로 라벨이 없거나 이상 데이터의 수가 통계적으로 의미 있는 학습을 하기에 너무 적다면, 정상 데이터의 분포만으로 이상을 판정하는 비지도학습으로 접근해야 한다.

두 번째 기준은 변수의 개수와 관계다. 변수가 하나뿐이라면 그 변수의 확률분포를 직접 추정해서 이상을 판정할 수 있지만, 변수가 여럿이고 서로 상관관계를 가진다면 변수 간의 관계까지 반영하는 다변량 기법이 필요하다. 세 번째 기준은 데이터에 입력과 출력의 관계가 있는지다. 입력값에 따라 출력값이 달라지는 구조라면, 출력 하나만으로 이상을 판정하기보다 입력에 대한 출력의 예측 오차로 이상을 정의하는 회귀 기반 접근이 더 정확하다.

이 세 기준은 이 시리즈의 뒤 편에서 다룰 내용과도 맞물린다. 라벨 없는 단일 변수와 다변량 데이터는 2편에서, 입출력 관계가 있는 데이터는 3편에서 다룬다. 이번 편에서는 라벨이 있다고 가정하는 가장 단순한 경우, 즉 지도학습으로 이상탐지에 접근한다.

실 시스템에서 흔히 빠지는 함정

이상탐지를 실제 시스템에 붙일 때 반복되는 실수가 몇 가지 있다. 가장 흔한 것은 학습 데이터에 담긴 이상 사례만으로 모델의 성능을 낙관하는 것이다. 이상 데이터의 수가 워낙 적다 보니 학습에 쓰지 않은 소수의 이상 사례로 평가해도 지표상으로는 높은 성능이 나오기 쉽다. 하지만 실제 운영에서는 학습 데이터에 없던 새로운 유형의 이상이 나타나므로, 이 지표가 그대로 유지된다는 보장은 없다.

또 다른 함정은 정상 데이터의 분포가 시간에 따라 바뀐다는 사실을 놓치는 것이다. 계절에 따라 생산 조건이 바뀌거나 서비스 이용 패턴이 달라지면, 예전에는 이상으로 판정되던 값이 지금은 정상일 수 있다. 이런 변화를 반영하지 않으면 오탐(false positive)이 늘어나 운영자가 알림을 무시하게 되고, 결국 진짜 이상을 놓치는 결과로 이어진다. 마지막으로 이상탐지 모델의 출력을 임계값 하나로 정상과 이상을 가르는 이분법으로만 쓰는 경우가 많은데, 실제로는 이상 점수(anomaly score) 자체를 운영자에게 보여주고 우선순위를 매기는 방식이 알림 피로를 줄이는 데 더 효과적이다.

데이터를 먼저 들여다보기, 탐색적 데이터 분석과 시각화

모델을 고르기 전에 데이터부터 살펴봐야 한다. 이 절에서는 5개 공정으로 이뤄진 가상의 생산 라인을 예로 든다. 각 공정에는 온도 센서가 하나씩 있고, 정상 상태에서는 목표 온도를 중심으로 정규분포를 따라 온도가 흩어진다고 가정한다. 공정 1~3은 물리적으로 가까워 온도가 서로 영향을 주고받으므로 상관관계가 생기고, 이상 상태는 온도 조절 기능 고장으로 평균 온도가 일정량 어긋나는 것으로 정의한다. 이 가정으로 정상 데이터 1500건과 이상 데이터 30건을 생성한다. (예제: series01/common.py)

데이터를 살펴볼 때 가장 먼저 확인할 것은 요약 통계량과 결측치다. 평균, 표준편차, 사분위수 같은 요약 통계량은 각 변수가 어떤 범위에서 움직이는지 알려주고, 결측치 비율은 이후 모델을 고를 때 결측 데이터를 다룰 수 있는 모델인지 아닌지를 가르는 기준이 된다. 변수 간 상관계수도 함께 확인해두면 좋다. 상관이 큰 변수들은 서로 중복된 정보를 담고 있을 가능성이 높고, 이 정보는 뒤에서 다룰 SVM처럼 거리 기반 알고리즘을 쓸 때 변수를 어떻게 조합할지 판단하는 데 도움이 된다.

숫자로 된 요약만으로는 데이터의 분포 형태나 정상·이상 데이터의 분리 정도를 파악하기 어렵다. 히스토그램으로 변수별 분포를 그려보면 두 그룹이 얼마나 겹치는지 눈으로 확인할 수 있다.

정상 데이터와 이상 데이터의 변수별 히스토그램
정상 데이터와 이상 데이터의 변수별 히스토그램

다섯 변수 중 temp2의 분포가 정상과 이상 데이터 사이에서 가장 뚜렷하게 갈라지고, temp1과 temp3이 그 뒤를 잇는다. 반면 temp4와 temp5는 두 그룹의 분포가 거의 겹친다. 이 차이는 애초에 이상 데이터를 생성할 때 temp1부터 temp3까지의 평균만 어긋나도록 정의했기 때문에 나타난 결과이지만, 실제 데이터에서도 이런 식으로 히스토그램만으로 어떤 변수가 이상 판별에 유용한지 가늠할 수 있다.

변수가 다섯 개를 넘어가면 하나씩 그려보는 것만으로는 전체 구조를 파악하기 어렵다. 이럴 때는 주성분분석(PCA)으로 차원을 2개로 줄여 산점도를 그려보면 다변량 데이터의 전체적인 분리 정도를 한눈에 볼 수 있다.

주성분분석으로 2차원에 투영한 정상 데이터와 이상 데이터
주성분분석으로 2차원에 투영한 정상 데이터와 이상 데이터

다섯 개 변수를 두 개의 주성분으로 압축한 뒤에도 정상과 이상 데이터가 어느 정도 갈라져 있음을 확인할 수 있다. 이 결과는 이어서 다룰 SVM과 로지스틱 회귀 같은 지도학습 모델이 이 데이터에서 합리적인 성능을 낼 수 있으리라는 근거가 된다. (예제: series01/eda.py)

SVM으로 이상을 탐지하기

정상과 이상 라벨이 모두 있는 데이터라면, 두 클래스를 가르는 결정 경계를 학습하는 분류 모델을 바로 적용할 수 있다. SVM(서포트 벡터 머신)은 두 클래스 사이의 마진을 최대화하는 경계를 찾는 알고리즘으로, 커널 트릭을 쓰면 선형으로 나뉘지 않는 데이터도 비선형 경계로 분류할 수 있다.

다음 코드는 temp1과 temp2 두 변수만으로 SVM을 학습하고 결정 경계를 그린다. SVM은 특징 공간에서의 거리(유클리드 거리)에 기반한 알고리즘이므로, 변수의 스케일이 다르면 스케일이 큰 변수가 거리 계산을 지배해버린다. 그래서 학습 전에 표준화를 거쳐야 하고, 표준화와 SVM을 하나의 파이프라인으로 묶어 학습과 추론에서 같은 변환이 일관되게 적용되도록 한다.

from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

svm = SVC(C=10, gamma=0.1)
clf = Pipeline([("scaler", StandardScaler()), ("svm", svm)])
clf.fit(X, y)
SVM으로 학습한 정상/이상 결정 경계
SVM으로 학습한 정상/이상 결정 경계

결정 경계가 곡선으로 그려진 것은 커널 트릭 덕분이다. 또한 일부 데이터가 경계를 넘어가도 이를 허용하는 소프트 마진 덕분에, 데이터에 섞인 노이즈에 결정 경계가 지나치게 휘둘리지 않는다.

SVM에는 감마(gamma)와 C라는 두 하이퍼파라미터가 있고, 이 값을 어떻게 정하느냐에 따라 결정 경계의 모양이 크게 달라진다. 감마는 가우스 커널의 폭을 조절하는데, 값이 커질수록 각 데이터 포인트에 더 좁고 뾰족하게 반응하는 경계가 그려진다.

감마 값에 따른 SVM 결정 경계 변화
감마 값에 따른 SVM 결정 경계 변화

감마가 클수록 학습 데이터 하나하나에 맞춰 구불구불한 경계가 만들어진다. 이렇게 학습 데이터에 지나치게 맞춰진 모델은 학습 데이터에 대한 성능은 높아 보이지만, 학습에 쓰지 않은 새로운 데이터에 대한 예측 성능(일반화 성능)은 오히려 떨어진다. 이 현상을 과적합(overfitting)이라 부르고, 운영 중인 시스템에서 실제로 마주칠 미지의 이상 패턴에 대응해야 하는 이상탐지에서는 특히 주의해야 할 문제다. C는 이 마진 위반을 얼마나 허용할지 조절하는 정칙화 파라미터로, C가 클수록 정칙화 효과가 작아져 과적합 쪽으로, C가 작을수록 결정 경계가 완만해지는 쪽으로 움직인다. 실무에서는 교차검증으로 이 두 값을 함께 탐색해 미지 데이터에 대한 성능을 최대화하는 조합을 찾는다. (예제: series01/supervised.py)

로지스틱 회귀로 이상을 탐지하기

로지스틱 회귀도 정상과 이상 라벨을 목적 변수로 삼아 학습하는 지도학습 분류 모델이다. SVM과 다른 점은 결정 경계를 직접 최적화하는 대신, 각 클래스에 속할 확률을 로지스틱 함수로 모델링하고 이 확률의 최우추정으로 파라미터를 구한다는 것이다.

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(penalty=None)
clf.fit(X, y)
로지스틱 회귀로 학습한 정상/이상 결정 경계
로지스틱 회귀로 학습한 정상/이상 결정 경계

같은 데이터에 SVM을 적용했을 때와 비교하면 차이가 뚜렷하다. 로지스틱 회귀의 결정 경계는 직선이다. 커널 트릭 없이 변수의 선형 결합만으로 확률을 모델링하기 때문에, 데이터가 선형으로 잘 나뉘지 않는 경우에는 SVM보다 표현력이 떨어진다. 대신 계산이 가볍고 각 변수가 결과에 얼마나 기여하는지 계수로 직접 해석할 수 있다는 장점이 있다.

로지스틱 회귀는 학습 과정에서 이미 각 클래스에 속할 확률을 계산하므로, predict_proba 메서드로 이 확률을 바로 꺼내 쓸 수 있다.

로지스틱 회귀가 추정한 이상 확률 분포
로지스틱 회귀가 추정한 이상 확률 분포

결정 경계 부근에서 확률이 급격하게 바뀌는 것을 확인할 수 있다. 이 확률값은 정상과 이상을 이분법으로 가르는 대신, 이상 점수로 활용해 알림의 우선순위를 매기는 데 쓸 수 있다. SVM도 Platt Scaling이라는 방법으로 결정 함수 값에 로지스틱 함수를 사후적으로 맞춰 클래스 확률을 구할 수 있지만, 이 경우 확률 분포가 SVM의 곡선형 결정 경계를 따라 로지스틱 회귀보다 더 구불구불한 형태를 띤다. (예제: 앞서 SVM에서 본 것과 같은 파일인 series01/supervised.py)

지도학습 기반 이상탐지가 갖는 한계

SVM과 로지스틱 회귀는 정상과 이상 라벨이 모두 충분할 때 잘 동작한다. 하지만 이 조건 자체가 실무에서는 자주 무너진다. 이상 데이터는 정의상 드물게 일어나므로, 통계적으로 안정된 학습이 가능할 만큼 이상 사례를 모으는 데 오랜 시간이 걸리거나 애초에 불가능한 경우가 많다. 이 글의 예제에서도 생성한 데이터 중 학습에 쓴 1000건에는 이상 데이터가 20건뿐이었다. 이런 극단적인 클래스 불균형에서는 모델이 이상 클래스의 경계를 제대로 학습하지 못하고, 다수 클래스인 정상 쪽으로 치우친 예측을 내놓기 쉽다.

더 근본적인 문제는 지도학습이 학습 데이터에 있던 이상의 종류만 인식할 수 있다는 점이다. 지도학습 분류기는 학습한 이상 패턴과 비슷한 새로운 사례는 잘 잡아내지만, 학습 데이터에 없던 완전히 새로운 유형의 이상에는 무력하다. 제조 라인에 새로운 고장 유형이 생기거나 금융 거래에 이전에 없던 사기 수법이 등장하는 상황이 바로 이런 경우이며, 실무에서 이상탐지가 요구되는 상황 자체가 대개 이렇게 미지의 이상까지 잡아내야 하는 경우다.

이 한계 때문에 실무 이상탐지에서는 정상 데이터의 분포만으로 이상을 판정하는 비지도학습이 더 널리 쓰인다. 라벨이 있는 이상 사례에 의존하지 않고 정상 데이터가 형성하는 분포에서 얼마나 벗어났는지로 이상을 정의하기 때문에, 학습 데이터에 없던 이상에도 대응할 수 있다. 다음 편부터는 이 비지도학습 접근을 확률분포와 최우추정이라는 도구로 구현하는 방법을 다룬다.

한편 이 글에서 다룬 SVM은 논문 “Dive into Time-Series Anomaly Detection: A Decade Review”의 분류체계에서 밀도 기반, 그중에서도 분포 기반 방법으로 분류된다. One-Class SVM처럼 정상 데이터만으로 학습하는 변형이 이 계열의 대표적인 방법이며, 이 시리즈 4편에서 시계열 이상탐지의 전체 분류체계를 다룰 때 이 대응 관계를 다시 살펴본다.

요약

이상탐지는 정상 데이터의 분포에서 벗어난 정도로 이상을 정의하는 문제이며, 클래스 불균형과 미지의 이상이라는 두 제약 때문에 일반적인 분류 문제와 다르게 접근해야 한다. 라벨이 충분하다면 SVM이나 로지스틱 회귀 같은 지도학습 분류기로 바로 접근할 수 있지만, 학습 데이터에 없던 이상까지 잡아내야 하는 실무 조건에서는 한계가 뚜렷하다. 다음 편에서는 이 한계를 넘어서기 위해 정상 데이터의 확률분포만으로 이상을 판정하는 비지도학습 접근을, 1변량 데이터에서 시작해 다변량 데이터까지 단계적으로 다룬다.


Mimul

Written byMimul
Mimul is a programmer, technologist, exercise enthusiast and more.
Connect

Related ArticlesView All