Point-adjusted F1 tô hồng detector phát hiện bất thường (TSB-AD)

Benchmark NeurIPS 2024 chấm lại 40 thuật toán phát hiện bất thường trên 1.070 chuỗi thời gian đã làm sạch. Đứng đầu bảng đơn biến là PCA chạy trên chuỗi con.

Phan Minh Đăng Khoa
7 phút đọcAI viết · AI soát
Mục lục

Paper về phát hiện bất thường trên chuỗi thời gian hay báo F1 rất cao. Paper TSB-AD (Liu và Paparrizos, NeurIPS 2024, track Datasets and Benchmarks) cho rằng lĩnh vực này đã bỏ qua ba chuyện: dataset có lỗi, thước đo đánh giá bị lệch và cách chạy benchmark không thống nhất. Lời giải của họ là một benchmark gồm 1.070 chuỗi thời gian đã làm sạch từ 40 dataset, 40 thuật toán, hơn 450 biến thể đã tune và 10 thước đo. Bài này là ghi chú đọc paper, repo công khai và leaderboard 2026. Mọi con số đều lấy từ ba nguồn đó. Số kết quả là benchmark do chính tác giả chạy, trừ chỗ nào bài ghi khác.

Bối cảnh: vì sao số liệu cũ đáng ngờ

Hai paper trước đó đã nêu vấn đề. Wu và Keogh (arXiv:2009.13807) xem các benchmark do Yahoo, Numenta, NASA và một số nơi khác làm ra, và thấy phần lớn mẫu trong đó dính ít nhất một trong bốn lỗi. Họ kết luận: phần lớn tiến bộ thấy được mấy năm gần đây có thể chỉ là ảo giác. TSB-AD gọi tên bốn lỗi đó là triviality, anomaly density, mislabeling và run-to-failure bias.

Kim và cộng sự (arXiv:2109.05257) nhắm vào thước đo. Họ chỉ ra point adjustment rất dễ đánh giá hiệu năng phát hiện cao hơn thực tế. Chấm bằng nó thì ngay cả một anomaly score ngẫu nhiên cũng có thể trông như phương pháp hàng đầu.

TSB-AD sửa cả dữ liệu lẫn thước đo. Điểm xuất phát là 13 dataset đơn biến và 20 dataset đa biến công khai, làm sạch xong còn 40 dataset: 870 chuỗi đơn biến (TSB-AD-U) và 200 chuỗi đa biến (TSB-AD-M). Những lỗi bị loại hoặc sửa gồm nhãn sai, run-to-failure bias (bất thường dồn về cuối chuỗi, như Yahoo), single-anomaly bias (như UCR) và tỷ lệ bất thường không thực tế. Bước dựng dataset nào cũng cần bốn người gán nhãn đồng thuận. Sau đó một “algorithm test” đem anomaly score của nhiều detector ra so với nhãn.

Về quy mô: kho của Wu và Keogh có 250 chuỗi đã làm sạch, TSB-AD có 1.070 (Bảng 1 trong paper). Mỗi dataset tách 15% để tune siêu tham số, phần còn lại dùng để đánh giá. Chuỗi được chuẩn hoá z-score, trừ khi bản cài đặt gốc dùng kiểu chuẩn hoá khác.

Phần đa biến có vài hệ thống mà kỹ sư làm test sẽ thấy quen. GHL có 3 bể chứa, đo nhiệt độ và mực nước. Bất thường ở đây là thay đổi nhiệt độ tối đa hoặc tần số bơm. Genesis là một mô hình demo pick-and-place loại di động. SWaT có 51 cảm biến và cơ cấu chấp hành, bất thường là hành vi của hệ thống trong các kịch bản tấn công.

Thước đo: point adjustment làm gì

Point adjustment (PA) là một luật chấm điểm. Theo paper, phát hiện được bất kỳ điểm nào trong một đoạn bất thường thì coi như đã phát hiện mọi điểm trong đoạn đó. Trúng may một lần là cả đoạn được tính.

Repo cài nó trong basic_metricor._adjust_predicts, file TSB_AD/evaluation/basic_metrics.py. Dưới đây là vòng lặp điều chỉnh, trích nguyên văn từ commit 303dffb:

# TSB_AD/evaluation/basic_metrics.py (TheDatumOrg/TSB-AD@303dffb, lines 115-132)
        actual = label > 0.1
        anomaly_state = False
        anomaly_count = 0
        for i in range(len(score)):
            if actual[i] and predict[i] and not anomaly_state:
                    anomaly_state = True
                    anomaly_count += 1
                    for j in range(i, 0, -1):
                        if not actual[j]:
                            break
                        else:
                            if not predict[j]:
                                predict[j] = True
                                latency += 1
            elif not actual[i]:
                anomaly_state = False
            if anomaly_state:
                predict[i] = True

actual đánh dấu các điểm có nhãn bất thường. Khi một điểm dự đoán rơi vào đoạn có nhãn và chưa có đoạn nào đang mở, vòng lặp bật anomaly_state rồi chạy ngược lại, đánh dấu mọi điểm phía trước của đoạn đó là đã dự đoán. Tiếp theo, if anomaly_state: predict[i] = True đánh dấu từng điểm phía sau là đã dự đoán, cho tới khi gặp điểm bình thường thì đoạn kết thúc. Nói cách khác, nhãn viết lại dự đoán trước khi tính F1.

Point adjustment: một điểm phát hiện được trong đoạn có nhãn thì cả đoạn được tính là đã phát hiện (TSB-AD, mục 3.2).
Ghi chú: Với point adjustment, phát hiện được một điểm là cả đoạn bất thường được tính là tìm thấy. Trong phép thử của paper, một anomaly score ngẫu nhiên phân bố đều đứng hạng 26 khi so với 32 detector thật theo PA-F1.

Paper nói khi độ dài trung bình của bất thường tăng lên, dự đoán ngẫu nhiên có thể đạt PA-F1 gần bằng 1. Họ thử bằng Random (C): một anomaly score ngẫu nhiên liên tục, phân bố đều trong khoảng 0 đến 1. Đem so với anomaly score của 32 detector, điểm số ngẫu nhiên này đạt hạng 26 theo PA-F1. Paper không nói đó là hạng 26 trên 32 hay trên 33, nên chỉ nên hiểu đúng như chữ viết.

Bảng 5 đặt cùng một nhóm phương pháp dưới PA-F1 và dưới VUS-PR trên TSB-AD-U:

  • SR: 0,87 theo PA-F1, 0,32 theo VUS-PR. Đây là PA-F1 cao nhất bảng.
  • TimesFM: 0,84 và 0,30. Chronos: 0,83 và 0,27.
  • CNN: 0,78 và 0,34.
  • Sub-PCA: 0,56 và 0,42.
  • AnomalyTransformer: 0,53 và 0,12.

Phụ lục nói thêm: nhìn chung các phương pháp neural có điểm số cao hơn sau khi áp point adjustment.

Nửa còn lại của vấn đề là nhãn. Các benchmark trước lấy AUC-ROC trên 0,8 ở ít nhất một detector làm dấu hiệu nhãn ổn. Paper đưa ra một ca AUC-ROC 0,97 mà vẫn sót hai bất thường.

TSB-AD chấm bằng VUS-PR. VUS-ROC và VUS-PR thêm một buffer dung sai quanh ranh giới bất thường và dùng giá trị liên tục thay cho nhãn nhị phân. So xong 10 thước đo, paper đánh giá VUS-PR tốt nhất ở ba điểm: ít nhạy với độ trễ, không thiên lệch giữa các kịch bản, và nhất quán với các ca tương tự nhau. Threshold nằm ngoài phạm vi bài. Paper gọi đó là một bài toán “orthogonal”.

Kết quả: ai thắng trên TSB-AD

Mọi điểm số trong phần này là VUS-PR trung bình, lấy từ benchmark của tác giả.

Trên bộ đơn biến, Sub-PCA dẫn đầu với 0,42. Tiếp theo là KShapeAD 0,40, rồi POLY, Series2Graph và MOMENT (FT) cùng 0,39. Cuối bảng là LOF 0,17 và AnomalyTransformer 0,12. Trong top 12, theo paper thì hơn một nửa là phương pháp thống kê, thêm hai phương pháp neural (USAD, CNN) và một foundation model (MOMENT).

Code của Sub-PCA rất ngắn. Đây là wrapper của nó trong TSB_AD/model_wrapper.py:

# TSB_AD/model_wrapper.py (TheDatumOrg/TSB-AD@303dffb, lines 134-140)
def run_Sub_PCA(data, periodicity=1, n_components=None, n_jobs=1):
    from .models.PCA import PCA
    slidingWindow = find_length_rank(data, rank=periodicity)
    clf = PCA(slidingWindow = slidingWindow, n_components=n_components)
    clf.fit(data)
    score = clf.decision_scores_
    return score.ravel()

Độ dài cửa sổ lấy từ hàm tự tương quan. Ba ứng viên là chu kỳ mạnh thứ 1, 2 và 3, và find_length_rank chỉ đọc tối đa 20.000 điểm đầu. Mỗi cửa sổ thành một điểm của một chuỗi giả đa biến, rồi PCA chạy trên chuỗi đó. Detector PCA này lấy từ pyod về rồi sửa lại. Cấu hình đã tune trong HP_list.py là periodicity: 1 và n_components: None.

Trên bộ đa biến, bốn phương pháp hoà nhau ở 0,31: CNN, OmniAnomaly, PCA và LSTMAD. Paper đọc kết quả này là các kiến trúc đơn giản như CNN và LSTM nhìn chung vượt các thiết kế phức tạp hơn, như các kiến trúc transformer tiên tiến. AnomalyTransformer ở đây cũng chỉ được 0,12.

Ai thắng còn tuỳ vào hình dạng bất thường. Với bất thường điểm, TimesFM và Chronos đứng hạng nhất và hạng ba. Với bất thường theo đoạn, phương pháp thống kê áp đảo, Sub-KNN và POLY đứng trên. Paper giải thích là mô hình dự báo mỗi bước chỉ ước lượng một giá trị mới, từ một cửa sổ nhìn lại có hạn. Các mô hình này dự báo từ một context trượt, rồi lấy bình phương sai số giữa giá trị dự báo và giá trị thật làm anomaly score.

Không mô hình nào thắng ở mọi nơi. Xếp theo VUS-PR trung bình thì Sub-PCA đứng đầu. Xếp theo hạng trung bình thì paper đưa Sub-POLY lên đầu. Có phương pháp rất tốt trên dataset này nhưng “thất bại hoàn toàn” trên dataset khác.

Phép kiểm tra đáng nhớ nhất là nhiễm dữ liệu (contamination). Tác giả đem điểm số của MOMENT trên TSB-AD-U so với điểm số trên tập đánh giá giữ riêng của chính MOMENT. MOMENT (FT) tụt từ 0,39 xuống 0,14, MOMENT (ZS) từ 0,38 xuống 0,12. Cùng phép so đó, KShapeAD giảm từ 0,40 xuống 0,32. Chỉ MOMENT được kiểm tra kiểu này. Paper không đưa số tương tự cho TimesFM, Chronos hay Lag-Llama.

Thời gian chạy chỉ có trong một biểu đồ cột, nên bài không trích số nào. Nói bằng lời: phương pháp thống kê nhìn chung nhanh nhất, foundation model chậm nhất, còn CNN và LSTM vừa hiệu quả vừa nhanh.

Sau paper: leaderboard 2026

README của repo ghi leaderboard nhận bài nộp từ cộng đồng kể từ 1/4/2026. Trang dự án ghi “Last updated: October 20, 2026”. Mọi thứ trong phần này là mục trên leaderboard, không phải kết quả trong paper đã qua bình duyệt. Các nguồn không nói các mục được kiểm chứng ra sao.

Leaderboard xếp theo VUS-PR trung bình. Dưới đây là các mục đầu bảng được thêm sau paper, kèm điểm số trên TSB-AD-U và TSB-AD-M:

  • CHARM (kNN): 0,68 và 0,54, có pretrain.
  • Syntropic: 0,67 và chưa có mục, có pretrain.
  • CHARM (ZS): 0,61 và 0,46, có pretrain.
  • VERITY-AD: 0,61 và chưa có mục, không pretrain.

Cùng bảng có dòng “PCA” ở 0,42 và 0,31, và AnomalyTransformer ở 0,12 và 0,12. Dòng PCA khớp với Sub-PCA ở bộ đơn biến và PCA ở bộ đa biến. Trang không nói dòng này có gộp hai cái đó hay không.

Có hai điểm cần lưu ý. Mục Time-RCD+MAFT và VERITY-AD trỏ tới file .so đã biên dịch trong repo chứ không phải mã Python, nên không đọc được phương pháp ở đó. Và paper chỉ kiểm tra nhiễm dữ liệu với MOMENT, nên các mục có pretrain vẫn còn treo câu hỏi đó.

“Đơn giản thắng sâu” đúng trong paper 2024. Leaderboard 2026 giờ đã có các mục pretrain cao hơn dòng Sub-PCA 2024 ở bộ đơn biến. Hai nhận định này nói về những bài nộp khác nhau, ở những thời điểm khác nhau.

Bài học và kết

  • Trước khi so detector, hỏi xem F1 tính bằng thước đo nào. Với PA-F1, một anomaly score ngẫu nhiên phân bố đều đứng hạng 26 khi so với 32 detector.
  • Bắt đầu bằng một baseline thống kê, ví dụ PCA trên chuỗi con. Nó dẫn đầu TSB-AD-U với 0,42 VUS-PR, trong khi AnomalyTransformer chỉ được 0,12.
  • Chọn detector theo hình dạng bất thường. Foundation model dự báo làm tốt nhất với bất thường điểm, kém hơn với bất thường kéo dài theo đoạn.
  • Điểm số zero-shot của mô hình pretrain thì cứ coi là đáng ngờ, cho tới khi thử trên dữ liệu mà mô hình không thể đã thấy. MOMENT tụt từ 0,39 xuống 0,14 trên tập giữ riêng của chính nó.
  • Nhãn quyết định kết quả. TSB-AD dùng bốn người gán nhãn và một algorithm test ở mỗi bước, vậy mà tác giả vẫn coi khâu kiểm tra thủ công là một hạn chế.

Muốn thử thì pip install TSB-AD là cài được package. README đánh giá một detector trong 10 dòng: run_Unsupervise_AD(AD_Name, data) trả ra anomaly score, get_metrics(output, label) trả về chín thước đo, trong đó không có PATE. Runner mẫu đặt threshold ở mức trung bình cộng với 3 lần độ lệch chuẩn của anomaly score đã scale min-max. Các nguồn không nói đó là threshold khuyến nghị.

Phía trang này, bối cảnh là life test cho nailer fixture. Dữ liệu nằm trong InfluxDB và ClickHouse. Một pipeline thu tín hiệu của dụng cụ và fixture theo từng chu kỳ, như dòng điện, điện áp, áp suất và nhiệt độ. Mẫu đi từ LabVIEW qua MQTT, lấy thưa hơn lúc dụng cụ nghỉ và dày hơn lúc bắn. Pipeline gom mẫu theo chu kỳ, tách mỗi chu kỳ thành các lần bắn, rồi chấm từng lần so với một baseline trượt gồm các lần bắn tốt gần nhất trên cùng fixture và dụng cụ. Mỗi lần bắn được ghi là bắn tốt, bắn yếu, misfire không có dòng điện, hoặc nhiễu. Mẫu thô và bản tóm tắt theo chu kỳ lưu cạnh nhau. Repo này là private, nên bài chỉ mô tả luồng dữ liệu, không hơn.

Các phán định đó dựa trên luật, không dựa trên một tập bất thường có nhãn chấm bằng VUS-PR. Detector của TSB-AD và thước đo VUS-PR có hợp với dữ liệu này không thì vẫn là câu hỏi mở, và bài không báo cáo lần chạy nào của chúng trên dữ liệu đó. Nếu bạn chạy detector trên dữ liệu test rig, hãy kiểm tra hai thứ trước: bất thường được gán nhãn thế nào, và F1 tính bằng thước đo nào.

Phan Minh Đăng Khoa
Principal Engineer · AI, IoT và tự động hoá công nghiệp.
← Bài trướcUpload lên GridFS trong NestJS: cả file nằm trong RAM trước đã