PyOD를 활용한 시계열 데이터 이상 탐지 비교 분석
요약
본 글은 PyOD 라이브러리를 활용하여 시계열 데이터의 이상 탐지 기법들을 비교 분석한 내용입니다. Windowed Bridge, Frequency 등 다양한 탐지기를 테스트하며, 점 이상(point)과 부분 시퀀스 이상(subsequence) 유형에 따른 성능 차이를 확인했습니다. 이를 통해 목적과 데이터 특성에 맞춰 적절한 이상 탐지 기법을 선택하는 방법을 제시합니다.
핵심 포인트
- PyOD의 TimeSeriesOD를 활용하여 다양한 시계열 이상 탐지기를 비교 분석함.
- Windowed Bridge는 슬라이딩 윈도우로 일반 탐지기를 시계열에 적용하는 방법론임.
- 이상 유형(점/부분 시퀀스)에 따라 적합한 탐지 기법을 선택해야 함.
- 정밀도와 재현율은 이상 탐지 모델 평가의 핵심 지표가 됩니다.
이전에는 Raspberry Pi 4에 저장된 센서 데이터를 대상으로 PyOD의 Spectral Residual을 사용하여 이상을 감지하는 MCP 서버를 구축했습니다. 이 글에서는 '데이터나 목적에 맞춰 이상 탐지 기법을 전환하는 방법'에 대해 작성했습니다.
따라서 이번에는 PyOD에 포함된 시계열 데이터용 이상 탐지기들을 조사하고, 그 결과의 차이점을 확인해 보았습니다.
테스트한 것은 다음 7가지입니다.
| 카테고리 | 탐지기 | 개요 |
|---|---|---|
| Windowed Bridge | TimeSeriesOD | 슬라이딩 윈도우를 적용함으로써, PyOD 내의 임의 표 형식 데이터용 탐지기를 시계열 데이터에 적용할 수 있게 합니다 |
| ... | ||
| 탐지기에 따라 파라미터를 변경하면서 어느 지점에서 결과가 달라지는지도 확인했습니다. |
샘플 데이터
샘플 데이터는 PyOD에 포함된 generate_ts_data로 만들었습니다. 주기 50의 사인파에 노이즈를 추가한 시계열이며, 학습용으로 1000개 지점, 테스트용으로 200개 지점을 생성했고, 이상 비율은 10%(contamination=0.1)로, 난수는 random_state=42로 고정했습니다.
from pyod.utils.data import generate_ts_data
PERIOD = 50
X_train, X_test, y_train, y_test = generate_ts_data(
...
이상 유형(anomaly_type)은 2가지가 있어, 기법의 강점과 약점을 고려하여 사용했습니다.
| 종류 | 내용 | 사용한 기법 |
|---|---|---|
point (점 이상) | 한 지점만 크게 튀는 것(스파이크) | WindowedBridge, Frequency |
subsequence (부분 시퀀스 이상) | 일정 구간 동안 파형의 형태가 무너짐 | Subsequence, Streaming, Clustering, Deeplearning(LSTM, Anomaly Transformer) |
결과에 대하여
어떤 탐지기도 그림은 위아래(기법에 따라 4단)로 나뉘어 있습니다. 상단은 시계열이며, 빨간색이 정답 이상, 주황색 원이 탐지한 지점입니다. 2단째는 각 시점의 이상 점수와 탐지의 임계값(빨간색 점선)입니다.
임계값은 contamination=0.1을 기반으로, 점수 상위 약 10%가 이상이 되도록 자동으로 결정됩니다. 따라서 탐지 개수는 정답 수에 가까운 값이 되며, 정밀도(탐지 중 정답이었던 비율)와 재현율(정답 중 탐지된 비율)은 거의 같은 값이 됩니다.
이후 표에서는 정답과 일치하는 지점의 수(일치)와 정밀도・재현율・F1을 제시했습니다. 평가는 시점별 정답 레이블과 학습 데이터에 대한 탐지 결과를 한 점씩 비교한 것입니다.
1. WindowedBridge
PyOD의 TimeSeriesOD는 시계열을 창(Window)으로 잘라내어 PyOD의 범용 탐지기(여기서는 KNN)에 전달하는 래퍼입니다. 창마다 얻은 점수를 각 시점의 점수로 종합하는 방법(score_aggregation)을 선택할 수 있습니다.
WindowedBridge.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
샘플 데이터는 점 이상입니다. 다음 3가지 방식으로 시도했습니다.
| 시도 | window_size | score_aggregation | 탐지 개수 | 일치 | 정밀도 | 재현율 | F1 |
|---|---|---|---|---|---|---|---|
| 1 | 20 | max(기본값) | 90 | 19 | 0.21 | 0.19 | 0.20 |
| ... | |||||||
| 시도 1에서는 탐지된 것이 480 |

하단 점수를 보면 계단 모양으로 평평한 부분이 눈에 띕니다. 이는 각 시점의 점수를 '그 시점을 포함하는 창의 점수의 최댓값'으로 결정하기 때문입니다. 하나의 창이 높은 점수를 가지면, 창의 폭만큼 전후 시점까지 같은 높이의 점수가 퍼지게 됩니다.
창을 10으로 좁힌 시도 2에서는 150160 부근이나 820830 부근도 잡을 수 있게 되었습니다.

나아가 score_aggregation을 mean
변화된 시도 3에서는, 점수가 계단 모양이 아니라 부드러운 산처럼 나타나며, 스파이크마다 분리되어 보이는 산을 확인할 수 있었습니다.

창의 폭과 집계 방법을 변경하는 것만으로 탐지된 수가 19개에서 38개로 바뀌었습니다. 한편, 점 이상(point anomaly)임에도 창(window)을 사용하는 이 방법은 스파이크 1점의 위치를 정확히 지적해야 하는 용도에는 적합하지 않습니다. 주황색 원이 정답 스파이크 주변의 '정상적인 점'에도 붙어 있는 것이 그 증거입니다.
2. Subsequence
MatrixProfile
은 시계열 속 각 부분시퀀스(subsequence)에 대해 '가장 유사한 다른 부분시퀀스'까지의 거리를 구하는 방법입니다. 주기적인 데이터 속에서, 다른 어떤 부분과도 닮지 않은 형태가 이상으로 떠오릅니다.
Subsequence.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
이번 부분시퀀스 이상은 정답이 7군데(빨간색 영역) 있습니다. 창의 폭은 처음에는 주기에 맞춰 50, 다음으로 20으로 시도했습니다.
| 시도 | window_size | 탐지 수 | 일치 | 적합률 | 재현율 | F1 |
|---|---|---|---|---|---|---|
| 1 | 50 | 83 | 20 | 0.24 | 0.24 | 0.24 |
| 2 | 20 | 83 | 36 | 0.43 | 0.43 | 0.43 |
창 폭이 50일 때는, 230310 부근의 한 곳만 탐지되었습니다. 여기에는 정답 이상(265285 부근)이 포함되어 있지만, 탐지 범위는 이상 길이보다 훨씬 넓고, 나머지 6곳은 임계치를 밑돌았습니다.

창 폭을 20으로 줄이자, 160 부근, 265285 부근, 670690 부근의 3군데로 탐지가 좁혀졌고, 일치 수는 20개에서 36개로 늘어났습니다.

이번 이상 길이 자체가 10~20점 정도이므로, 창이 50이면 이상이 아닌 부분을 많이 포함하게 되어 점수가 앞뒤로 흐릿해집니다. 창 폭은 '주기'가 아니라 '찾고 싶은 이상 길이'에 맞추는 것이 좋다는 것을 알 수 있었습니다.
3. Streaming
SAND(Streaming Subsequence Anomaly Detection)
은 데이터를 일정한 개수(배치)마다 순차적으로 처리하는 스트리밍 방식의 기법입니다. 첫 번째 배치에서 k-Shape를 이용해 '대표 파형(중심)'을 만들고, 이후는 배치마다 지수 이동 평균(alpha)으로 대표 파형을 업데이트합니다. 각 부분시퀀스와 가장 가까운 대표 파형과의 거리(SBD(Shape-Based Distance): 형태의 차이를 측정하는 거리)가 이상 점수가 됩니다.
Streaming.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
실제 스크립트에서는, 대표 파형의 움직임(드리프트)을 그림으로 보여주기 위해, SAND를 상속받아 중심을 기록하는 작은 클래스(RecordingSAND)를 만들어서 사용하고 있습니다. 탐지 메커니즘 자체는 SAND와 동일합니다.
| 시도 | batch_size | alpha | 탐지 수 | 일치 | 적합률 | 재현율 | F1 |
|---|---|---|---|---|---|---|---|
| 1 | 100 | 0.5 | 90 | 29 | 0.32 | 0.35 | 0.34 |
| ... |
이 기법은 그림이 4단으로 되어 있습니다. 1단目が 시계열과 탐지 결과(점선이 배치 구분), 2단目が 점수, 3단目が 배치별 대표 파형의 움직임, 4단目が 처음(파선)과 마지막(실선)의 대표 파형입니다.

3단목에 주목하면, alpha=0.5일 때는 대표 파형이 한 번 업데이트될 때 최대 0.35 정도 움직이고 있습니다. alpha=0.2로 하면, 움직임은 0.03 정도로 약 1/10이 되었습니다.

다만, 움직임이 완만해져도 탐지 결과는 좋아지지 않았습니다(일치는 29개에서 24개로 줄었습니다). batch_size를 200으로 늘린 시도 3에서는, 배치의 수가 줄어들어 업데이트가 2번만 이루어졌고, 일치는 32개로 늘어났습니다.

세 가지 시도를 통해, 130145 부근과 730745 부근에서 오탐지(false positive)가 발생했습니다 (시도 3에서는 730~745 부근만). 정상 데이터의 형태가 첫 번째 배치로 만든 대표 파형에 충분히 포함되지 않았던 것이 원인이라고 생각합니다. 스트리밍 방식은 처음에 얼마나 많은 정상 형태를 담고 있느냐에 따라 영향을 받기 쉬운 것 같습니다.
4. Frequency (주파수)
시계열 데이터를 FFT(Fast Fourier Transform)로 주파수 영역으로 변환한 후, 로그 진폭 스펙트럼에서 '평활화된 성분'을 뺀 나머지(스펙트럼 잔차)를 역변환합니다. 규칙적인 변화(주기 성분)가 제거되고, 거기서 벗어난 급격한 변화(스파이크)가 두드러지게 나타납니다.
Frequency.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
샘플 데이터는 점 이상치입니다. 파라미터는 score_window=3의 한 가지 경우만 시도했습니다.
| 시도 | score_window | 탐지 수 | 일치 | 정밀도 (Precision) | 재현율 (Recall) | F1 | :---: |
|---|---|---|---|---|---|---|---|
| 1 | 3 | 100 | 100 | 1.00 | 1.00 | 1.00 |

정답인 100점을 모두 탐지했고, 오탐지는 0건이었습니다. 점수(2단)를 보아도 스파이크 위치만 임계값을 크게 초과하고, 스파이크 외에는 낮게 유지되고 있습니다.
3단 진폭 스펙트럼은 주기 50에 해당하는 주파수(1/50 = 0.02)에 큰 피크가 있습니다. 사인파 성분은 주파수 영역에서 하나의 피크가 되기 때문에, 이를 평활화된 성분에 포함하여 빼주면 사인파 부분이 상쇄되는 것을 알 수 있습니다.
지금까지의 방법과 비교했을 때 결과가 깔끔하게 나오지만, 이는 점 이상치 데이터(스파이크)가 이 방법에 적합했기 때문입니다. 지난번 실제 데이터에서 '이상 여부를 판단하기 어렵다'는 점이 나온 것도, 실제 데이터에는 스파이크뿐만 아니라 완만한 변화나 형태의 붕괴가 섞여 있었기 때문일 수 있습니다.
5. Clustering (클러스터링)
KShape은 부분 시계열을 형태가 비슷한 것끼리 클러스터링하여, 각 클러스터의 대표 파형(중심점)을 만듭니다. 어떤 대표 파형에서도 멀리 떨어진 부분 시계열을 이상으로 판정합니다.
Clustering.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
샘플 데이터는 부분 시계열 이상치입니다. 클러스터 수(n_clusters)와 윈도우 폭(window_size)을 바꿔서 세 가지 경우를 시도했습니다.
| 시도 | n_clusters | window_size | 탐지 수 | 일치 | 정밀도 (Precision) | 재현율 (Recall) | F1 | :---: |
|---|---|---|---|---|---|---|:---:|
| 1 | 3 | 50 | 78 | 20 | 0.26 | 0.24 | 0.25 |
| ... |
그림은 4단으로, 1단이 시계열과 탐지 결과, 2단이 점수, 3단이 각 윈도우의 클러스터 소속(색상 구분) 및 대표 파형까지의 거리, 4단이 대표 파형의 형태입니다.
윈도우 폭 50(주기와 동일)인 시도 1에서는, 4단에 있는 3개의 대표 파형은 주기 50의 사인파를 위상별로 잘라낸 부드러운 형태가 되었습니다. 이 때문에 어느 윈도우나 어떤 대표 파형 근처에 있어 탐지된 곳은 230~310 부근의 한 곳뿐이었습니다.

윈도우 폭을 20으로 줄인 시도 2에서는, 160 부근, 255295 부근, 470490 부근이 탐지되었습니다.

클러스터 수를 10으로 늘린 시도 3은 F1 점수는 시도 2와 거의 같지만, 탐지되는 장소는 바뀌었습니다 (150175 부근, 275295 부근, 425450 부근, 650670 부근 등).

시도 3의 4단계를 보면, 대표 파형 안에 도중에 크게 뛰어오르는 형태(n=28, n=44처럼 소속 수가 적은 것)가 포함되어 있습니다. 클러스터 수를 늘리면 정상적인 윈도우 속 예외적인 형태에 전용 클러스터가 만들어져 버리고, 그만큼
는 직전의 window_size
점을 예측하여 다음 1점을 LSTM으로 예측하고, '예측 오차의 정도(마할라노비스 거리)'를 이상 점수로 사용합니다. 지금까지의 방법과 달리 모델을 학습하는 과정이 있습니다.
Deeplearning.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
학습 데이터의 점수 외에도 테스트 데이터 역시 학습 데이터에서 결정한 임계값으로 판정하고 있습니다. 샘플 데이터는 부분 시계열 이상(partial series anomaly)이고, 학습은 30 에포크(CPU)입니다. 창 너비(window size)를 20과 50으로 비교했습니다.
| 시도 | window_size | 학습: 탐지 수 | 학습: 일치 | 학습: 정밀도 | 학습: 재현율 | 테스트: 탐지 수 | 테스트: 일치 |
|---|---|---|---|---|---|---|---|
| 1 | 20 | 98 | 36 | 0.37 | 0.43 | 28 | 14 |
| 2 | 50 | 95 | 37 | 0.39 | 0.45 | 18 | 7 |
(테스트 데이터의 정답은 20점입니다.)
그림은 4단으로 구성되어 있으며, 위에서부터 '학습 데이터 + LSTM 예측값 (보라색 점선)', '학습 데이터의 점수', '테스트 데이터 + 예측값', '테스트 데이터의 점수' 순서입니다. 점수는 폭이 넓기 때문에 세로축은 로그 스케일(log scale)을 사용했습니다. 회색 영역은 첫 window_size
점입니다. 예측에 사용할 과거 데이터가 없으므로 판정하지 않았습니다.

예측값 (보라색 점선)은 사인파의 부드러운 변화를 잘 추종하고 있습니다. 이상 구간(265285 근처, 420440 근처, 670~710 근처 등)에서는 점수가 확연히 높아지고 있습니다. 반면, 단 1점만 튀는 노이즈에도 반응하여 정상 구간에도 탐지가 산발적으로 나타나고 있습니다. 이는 LSTMAD가 1점씩 예측 오차를 보기 때문에, 구간 전체의 형태 변화보다는 급격한 튐에 반응하기 쉽다고 생각됩니다.
창 너비를 50으로 한 시도 2에서는 학습 데이터의 일치는 36에서 37로 거의 변하지 않았지만, 테스트 데이터에서는 일치가 14에서 7로 줄었습니다.

테스트 데이터는 200점밖에 없는데, 창 너비를 50으로 하면 맨 앞의 4분의 1(50점)이 판정 대상에서 제외됩니다. 게다가 테스트 데이터의 정답 이상 중 t=43~50 근처의 몇 점이 그 회색 영역 안에 들어가 버렸습니다. 창 너비를 길게 할수록 짧은 데이터에서는 판별할 수 있는 범위가 좁아진다는 점에도 주의가 필요합니다.
7. Deeplearning: Anomaly Transformer
LSTMAD는 '다음 1점을 예측하는' 모델이었지만, AnomalyTransformer
는 창(window_size점) 전체를 재구성하는 모델입니다. Transformer의 Self-Attention이 만드는 '시계열 전체와의 관련성(Series-association)'과, '인접한 점과의 관련만 고려한 분포(Prior-association)'의 괴리(AssDis)를 학습하여, 이상한 점일수록 주변과의 관련성이 인접한 점에만 치우친다는 성질을 이용합니다. PyOD에서는 이상 점수가
softmax(-AssDis) × 재구성 오차
가 됩니다.
AnomalyTransformer.py
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
...
PyOD의 초기값은 d_model=512, lr=1e-4였지만, 이번 데이터량에는 너무 크므로, d_model=64, lr=1e-3으로 작게 조정했습니다. 학습은 30 에포크입니다. LSTMAD와 마찬가지로 샘플 데이터는 부분 시계열 이상이고, 테스트 데이터는 학습 데이터에서 결정한 임계값으로 판정하고 있습니다. 창 너비를 50과 100으로 비교했습니다.
| 시도 | window_size | 학습: 탐지 수 | 학습: 일치 | 학습: 정밀도 | 학습: 재현율 | 테스트: 탐지 수 | 테스트: 일치 |
|---|---|---|---|---|---|---|---|
| 1 | 50 | 100 | 16 | 0.16 | 0.19 | 30 | 8 |
| 2 | 100 | 100 | 17 | 0.17 | 0.20 | 14 | 5 |
(학습 데이터의 정답은 83점, 테스트 데이터의 정답은 20점입니다.)
그림의 구성은 LSTMAD와 동일하게 4단계로 되어 있으며, 예측값 대신 재구성값(보라색 점선)을 겹쳐 보여주고 있습니다. LSTMAD와 달리 모든 시점에 재구성값이 존재하므로, 시작 부분을 회색으로 처리할 필요가 없습니다.

창 너비(window width)를 50으로 설정한 학습 데이터를 보면, 재구성값은 원래 파형과 거의 일치하며, 이상 부분까지 포함하여 잘 재현되고 있습니다. 따라서 재구성 오차만으로는 이상과 정상의 점수 차이를 얻기 어렵습니다. 2단계의 점수는 정상 구간에서도 날카로운 피크가 많이 나타나 이상이 아닌 곳까지 임계값을 초과하고 있습니다. 일치도는 100점 만점에 16점으로, 이번 7가지 방법 중 가장 낮은 결과입니다.
테스트 데이터에서는 t=4353 근처와 95103 근처의 이상 구간에서 점수가 임계값을 크게 초과했습니다. 반면, t=1214 근처, 3138 근처, 183~194 근처처럼 정상 구간에서도 탐지 결과가 나타났습니다.
창 너비를 100으로 설정한 시도 2에서는 테스트 데이터의 오탐(false positive)이 줄었습니다(탐지 수가 30개에서 14개로 감소).

테스트 데이터에서는 t=46 근처, 5051 근처, 100104 근처가 탐지되었고, 정밀도(Precision)는 0.27에서 0.36으로 상승했습니다. 반면 재현율(Recall)은 0.40에서 0.25로 하락했습니다. 학습 데이터의 일치도는 16점에서 17점으로 거의 변화가 없습니다. 또한, 학습 데이터의 점수(2단계)는 t=440~500 근처에서 전체 점수가 몇 자릿수 떨어지는 것을 볼 수 있으며, 이상이 밀집된 구간에서 오히려 점수가 낮아지는 부분이 있음을 알 수 있습니다.
별도로 EPOCHS(10/30/60)와 재구성 측 가중치(lambda_)(0/1/3/10)를 조합하여 난수 시드(random seed)를 변경하며 실험했습니다. 가장 좋았던 결과는 EPOCHS=60, lambda_=10 설정에서 테스트 데이터의 AUC 0.81 (F1 0.41)이었으나, 같은 설정이라도 시드를 변경하는 것만으로 AUC가 ±0.1 정도 변동했으므로, 개선은 시드에 의한 변동 범위 내라고 생각합니다.
이 방법은 이번 데이터 양(학습 1000점)에서는 LSTMAD보다 성적이 낮았습니다. Transformer 계열의 방법들은 원래 대량의 데이터를 학습하는 것을 전제로 하므로, 데이터가 적을 경우 파라미터나 창 너비만으로 개선하기는 어려운 것 같습니다.
결과
각 방법별로 F1 점수가 가장 높았던 시도를 정리했습니다.
| 방법(PyOD 클래스) | 데이터 | 설정 | 탐지 수 | 일치도 | 정밀도 | 재현율 | F1 |
|---|---|---|---|---|---|---|---|
WindowedBridge(TimeSeriesOD +KNN) | 점 | window=10, mean | 100 | 38 | 0.38 | 0.38 | 0.38 |
Frequency(SpectralResidual) | 점 | score_window=3 | 100 | 100 | 1.00 | 1.00 | 1.00 |
Subsequence(MatrixProfile) | 부분시계열 | window=20 | 83 | 36 | 0.43 | 0.43 | 0.43 |
Streaming(SAND) | 부분시계열 | batch=200, alpha=0.2 | 99 | 32 | 0.32 | 0.39 | 0.35 |
Clustering(KShape) | 부분시계열 | k=3, window=20 | 89 | 33 | 0.37 | 0.40 | 0.38 |
Deeplearning(LSTMAD) | 부분시계열 | window=50 | 95 | 37 | 0.39 | 0.45 | 0.42 |
Deeplearning(AnomalyTransformer) | 부분시계열 | window=100 | 100 | 17 | 0.17 | 0.20 | 0.18 |
(점 이상은 정답 100점, 부분시계열 이상은 정답 83점입니다.)
이 결과로부터 다음을 알 수 있었습니다.
점 이상 탐지에서는 Spectral Residual가 압도적으로 뛰어났습니다. 주기적인 성분을 제거하고 급격한 이상치만 남기는 메커니즘이 스파이크(spike) 탐지에 매우 적합합니다. 창(window)을 사용하는 범용적인 방법(WindowedBridge)은 창의 너비와 집계 방식을 조정했음에도 F1 점수가 0.38에 머물렀습니다.
부분 시계열 이상은 어떤 방법도 어려움을 겪었습니다. Anomaly Transformer를 제외한 4가지 방법은 F1 점수가 0.35~0.43 범위에 몰려 있어, 방법 간의 차이가 크지 않았습니다. Anomaly Transformer는 F1이 0.18로 가장 낮았으며, 학습 데이터가 1000개라는 작은 규모에서는 Transformer 계열 방법의 장점을 끌어내지 못했습니다. 적어도 이번 데이터에서는 방법을 바꾸는 것보다 다음 두 가지 요소의 영향이 더 크게 나타났습니다.
윈도우 크기(Window Size): Matrix Profile은 윈도우 크기가 50에서 20으로 줄자 일치도가 20에서 36으로 증가했습니다. k-Shape 역시 마찬가지로 20에서 33으로 증가했습니다. 이상 패턴의 길이(10~20개)에 맞추면 개선됩니다. -
점수 집계 방식: 각 시점의 점수에 윈도우의 최댓값을 사용하는 방법들(WindowedBridge, Matrix Profile, k-Shape, SAND)은 점수가 윈도우 너비만큼 평평한 지대가 됩니다. 이 지대 중 일부만 이상이어도 전체 지대가 임계값을 초과하여 오탐지(False Positive)가 증가합니다. WindowedBridge에서 mean으로 변경했을 때 F1이 0.26에서 0.38로 상승한 것처럼, 점수 집계 방식 또한 효과적임을 알 수 있었습니다.
주의사항
이번 결과에는 다음과 같은 한계가 있습니다.
- 샘플 데이터는
random_state=42로 만든 인공 데이터 1종류에 불과합니다. 실제 데이터나 다른 난수에서는 순위가 달라질 수 있습니다. - 평가는 학습 데이터 자체를 대상으로 수행했으며, 시점별 1개 단위로 정답과 비교했습니다. 부분 시계열 이상처럼 구간으로 찾아내면 좋은 경우에는, 1개 단위의 평가가 다소 엄격하게 나옵니다. contamination=0.1
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn ML의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기