このトピックでは、時系列異常を検出するために使用されるアルゴリズムと構文について説明します。
適用可能なエンジンとバージョン
時系列異常検出構文は、LindormTSDB にのみ適用できます。 時系列異常検出構文は、LindormTSDB のすべてのバージョンでサポートされています。
制限事項
時系列異常検出構文は、SAMPLE BY 句と一緒に使用する必要があります。
概要
時系列異常検出は、指定された時系列の異常点を検出するために、DAMO Academy によって開発されたオンライン異常検出アルゴリズムをサポートしています。 検出中に、これらのアルゴリズムは、データの傾向や期間などの時系列データの特性を継続的に学習し、新しく挿入された時系列ポイントの異常を検出します。 たとえば、新しく追加された時系列ポイントの値が他のポイントと大きく異なる場合、アルゴリズムはこのポイントが異常であると想定します。
SAMPLE BY 句を使用して、時系列異常検出を以下の方法で使用できます。
SAMPLE BY 0句を使用して、すべての時系列の各データポイントを検出します。 この句の使用方法の詳細については、例 1、例 2、および 例 3 をご参照ください。SAMPLE BY INTERVAL句を使用して、ダウンサンプリング間隔を指定し、MIN、MAX、AVG、COUNT、SUM などのネストされたダウンサンプリング演算子を使用します。重要INTERVAL の値を 0 にすることはできません。
この句の使用方法の詳細については、例 4 をご参照ください。
SAMPLE BY 0句と、LATEST、DELTA、RATE などのネストされたダウンサンプリング演算子を使用して、異なるデータをクエリします。 この句の使用方法の詳細については、例 5 をご参照ください。
構文
select_sample_by_statement ::= SELECT ( select_clause )
FROM table_identifier
WHERE where_clause
SAMPLE BY 0
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= tag_identifier, | time | anomaly_detect '(' field_identifier ',' algo_identifier | model_identifier [ ',' options] ')'
where_clause ::= relation ( AND relation )* (OR relation)*
relation ::= ( field_identifier| tag_identifier, ) operator term
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS KEY構文では、anomaly_detect は異常検出関数を示します。 次の表では、構成できるパラメーターについて説明します。
パラメーター | 説明 |
field_identifier | フィールド列の名前。 説明 指定されたフィールド列のデータは、VARCHAR 型または BOOLEAN 型にすることはできません。 |
algo_identifier | 異常の検出に使用されるアルゴリズムの名前。 DAMO Academy によって開発されたオンライン異常検出アルゴリズムがサポートされています。
説明 algo_identifier パラメーターは、データベース内機械学習が有効になっておらず、時系列データに関連する異常を検出する必要があるシナリオに適用できます。 |
model_identifier | 異常の検出に使用されるモデルの名前。 説明
|
options | 検出効果を調整するために使用されるオプション。 このパラメーターはオプションです。 |
カテゴリ
次の表では、LindormTSDB でサポートされている異常検出アルゴリズムと、アルゴリズムが適用できるシナリオについて説明します。
アルゴリズム | シナリオ |
esd |
|
nsigma |
説明 このアルゴリズムを使用して、値が他のポイントと大きく異なる少数の異常点を検出することはお勧めしません。 この場合、このアルゴリズムによって返される検出結果は不正確になる可能性があります。 |
ttest |
|
Incremental STL with ESD (istl-esd) | このアルゴリズムは、周期的なデータの異常を検出するために適用できます。 istl-esd アルゴリズムは、DAMO Academy によって開発された Incremental STL アルゴリズムです。 Incremental STL アルゴリズムは、周期的な増分データを周期項、傾向項、残余項に分解できます。 istl-esd アルゴリズムは、Incremental STL アルゴリズムと esd アルゴリズムを統合しています。 Incremental STL アルゴリズムは周期的な増分データを分解するために使用され、esd アルゴリズムは周期データから分解された残余項の異常を検出するために使用されます。 esd アルゴリズムは、分解された残余項に基づいて非周期的なスパイクを検出できます。 |
Incremental STL with Nsigma (istl-nsigma) | このアルゴリズムは、周期的なデータの異常を検出するために適用できます。 Incremental STL アルゴリズムは、周期的な増分データを周期項、傾向項、残余項に分解できます。 istl-nsigma アルゴリズムは、Incremental STL アルゴリズムと nsigma アルゴリズムを統合しています。 Incremental STL アルゴリズムは周期的な増分データを分解するために使用され、nsigma アルゴリズムは周期データから分解された残余項の異常を検出するために使用されます。 nsigma アルゴリズムは、分解された残余項に基づいて非周期的なスパイクを検出できます。 |
次の図は、さまざまなアルゴリズムの適用シナリオを示しています。
esd: このアルゴリズムは、時系列の各データポイントを検出するために使用でき、安定した値を持つ多数の正常なデータポイントの中に少数の異常なデータポイントが存在するシナリオに適用できます。

nsigma: このアルゴリズムは、時系列の各データポイントを検出するために使用でき、異常なデータポイントの値が履歴平均値と大きく異なるシナリオに適用できます。 このアルゴリズムの n パラメーターを構成して、データポイントの値と履歴平均値の間の許容差を調整できます。

ttest: このアルゴリズムは、時間ウィンドウ内の時系列データから異常を検出するために使用でき、指定されたメトリックの平均値が 2 つの連続する時間ウィンドウ内で大きく変化するシナリオに適用できます。


istl-esd: このアルゴリズムは、周期的な時系列データの異常を検出するために使用できます。 このアルゴリズムは、元のデータの周期項を削除してから、esd アルゴリズムを使用して異常を検出します。 istl-esd アルゴリズムは、安定した値を持つ多数の正常な周期データポイントの中に少数の異常なデータポイントが存在するシナリオに適用できます。

istl-nsigma: このアルゴリズムは、周期的な時系列データの異常を検出するために使用できます。 このアルゴリズムは、元のデータの周期項を削除してから、nsigma アルゴリズムを使用して異常を検出します。 istl-nsigma アルゴリズムは、異常なデータポイントの値が履歴平均値と大きく異なるシナリオに適用できます。

パラメーター
使用する異常検出アルゴリズムのパラメーターを構成できます。 これらのパラメーターは、共通パラメーター、トレーニングパラメーター、および推論パラメーターに分類できます。 オプションパラメーター options を指定して、異常検出アルゴリズムの検出パフォーマンスを調整できます。
共通パラメーター、トレーニングパラメーター、および推論パラメーターは、同じパラメーターリストで構成されます。 たとえば、ttest アルゴリズムのパラメーターは、
lenDetectWindow=100,adhoc_stat=trueの形式で構成できます。理想的な検出結果を得るためのパラメーターの構成方法の詳細については、統計アルゴリズムのパラメーター調整 および 分解アルゴリズムのパラメーター調整 をご参照ください。
共通パラメーター
共通パラメーターを構成して、異常検出中にアルゴリズムによって実行されるデバッグ、診断、およびその他の動作を制御できます。 共通パラメーターは、サポートされているすべての異常検出アルゴリズムに適用できます。 次の表では、構成できる共通パラメーターについて説明します。
パラメーター | タイプ | デフォルト値 | 説明 |
verbose | BOOLEAN | FALSE | 詳細情報を返し、指定された列の検出結果を識別するかどうかを指定します。 返される情報は、使用するアルゴリズムによって異なります。 有効な値:
このパラメーターを |
adhoc_state | BOOLEAN | FALSE | アルゴリズムの異常検出ステータスが現在のクエリでのみ使用可能かどうかを指定します。 異常検出ステータスの詳細については、例外検出ステータス をご参照ください。 |
direction | VARCHAR | UP | 検出する異常のタイプ。 有効な値:
|
トレーニングパラメーター
アルゴリズムを指定し、トレーニングパラメーターを構成して、異常の検出に使用するモデルを決定できます。 LindormTSDB を再起動すると、トレーニングパラメーターの値はクリアされます。 この場合、トレーニングパラメーターを再構成してモデルをトレーニングする必要があります。 モデルは、検出中にリアルタイムでトレーニングされ、時系列データの特性を学習および適応させます。
トレーニングパラメーターを構成する際には、次の点に注意してください。
パラメーター名の大文字と小文字は区別されません。
トレーニングパラメーターの値には、数字と文字列を使用できます。NULL は使用できません。
パラメーターの値は、特定の範囲内にある必要があります。
アルゴリズム | パラメーター | タイプ | 有効な値 | 説明 |
esd | compression | INTEGER | 正の整数。 有効な値: | アルゴリズムのデータ構造の空間計算量。 このパラメーターの値が大きいほど、アルゴリズムは検出中に多くのメモリを使用し、より正確な結果を返します。 |
lenHistoryWindow | INTEGER | 有効な値:20 以上の正の整数。 デフォルト値:null。 | 参照時間ウィンドウの長さ。 短い参照時間ウィンドウを指定すると、時間ウィンドウ内の最近のデータポイントのみが検出中に参照として使用されます。 このパラメーターを null に設定すると、最初の検出後に挿入されたすべてのデータポイントが参照として使用されます。 | |
nsigma | lenHistoryWindow | INTEGER | 有効な値:20 以上の正の整数。 デフォルト値:null。 | 参照時間ウィンドウの長さ。 短い参照時間ウィンドウを指定すると、時間ウィンドウ内の最近のデータポイントのみが検出中に参照として使用されます。 このパラメーターを null に設定すると、最初の検出後に挿入されたすべてのデータポイントが参照として使用されます。 |
ttest | lenDetectWindow | INTEGER | 正の整数。 デフォルト値:10。 | 異常を検出する最新の時間ウィンドウの長さ。 |
lenHistoryWindow | INTEGER | 有効な値:20 以上の正の整数。 デフォルト値:100。 | 参照時間ウィンドウの長さ。 短い参照時間ウィンドウを指定すると、時間ウィンドウ内の最近のデータポイントのみが検出中に参照として使用されます。 このパラメーターを 説明 このパラメーターの値は、lenDetectWindow の値よりも大きくする必要があります。 | |
istl-esd | frequency | VARCHAR | 数字と時間単位で構成される文字列。 例:5M、24H、1D。 有効な時間単位:
| 時系列データが収集される頻度。 たとえば、1 時間ごとに 1 つの時系列データポイントが収集される場合は、このパラメーターを 重要
|
periods | VARCHAR | 数字と時間単位で構成される文字列。 例:5M、24H、1D。 有効な時間単位:
| 周期データの合計周期の長さ。 インデクサーを使用して複数の周期の長さを指定できます。 例: 説明 このパラメーターを指定しない場合、アルゴリズムは周期を自動的に計算します。 | |
esd.* | 該当なし | esd アルゴリズムを定義するために必要なトレーニングパラメーター。 これらのパラメーターは、この表の esd セクションで説明されているトレーニングパラメーターと同じです。 esd アルゴリズムのトレーニングパラメーターに esd. 接頭辞を追加して、これらのパラメーターを構成できます。 例: | ||
istl-nsigma | frequency | VARCHAR | 数字と時間単位で構成される文字列。 例:5M、24H、1D。 有効な時間単位:
| 時系列データが収集される頻度。 たとえば、1 時間ごとに 1 つの時系列データポイントが収集される場合は、このパラメーターを 重要
|
periods | VARCHAR | 数字と時間単位で構成される文字列。 例:5M、24H、1D。 有効な時間単位:
| 周期データの合計周期の長さ。 インデクサーを使用して複数の周期の長さを指定できます。 例: 説明 このパラメーターを指定しない場合、アルゴリズムは周期を自動的に計算します。 | |
nsigma.* | 該当なし | nsigma アルゴリズムを定義するために必要なトレーニングパラメーター。 これらのパラメーターは、この表の nsigma セクションで説明されているトレーニングパラメーターと同じです。 nsigma アルゴリズムのトレーニングパラメーターに nsigma. 接頭辞を追加して、これらのパラメーターを構成できます。 例: | ||
推論パラメーター
推論パラメーターは、異常検出中にのみ有効になり、大文字と小文字は区別されません。
アルゴリズム | パラメーター | タイプ | 有効な値 | 説明 |
esd | alpha | DOUBLE | デフォルト値:0.1。 有効な値: | 異常検出の感度。 このパラメーターの値が大きいほど、アルゴリズムは異常に対してより敏感になり、より多くの異常を報告します。 |
direction | VARCHAR | デフォルト値:Up。 | 検出する異常のタイプ。
| |
maxAnomalyRatio | DOUBLE | デフォルト値:0.3。 有効な値: | 異常が検出される最大比率。 たとえば、maxAnomalyRatio を 0.3 に設定し、direction を Up に設定すると、値が 70 パーセンタイル未満のデータポイントは異常として検出されません。
| |
warmupCount | INTEGER | 正の整数。 デフォルト値:20。 | アルゴリズムが異常の報告を開始するために必要なデータポイントの最小数。 たとえば、このパラメーターを 20 に設定すると、検出する必要があるデータポイントの数が 20 未満の場合、アルゴリズムは異常を報告しません。 | |
nsigma | n | DOUBLE | ゼロ以外の浮動小数点数。 デフォルト値:3.0。 |
|
warmupCount | INTEGER | 正の整数。 デフォルト値:20。 | アルゴリズムが異常の報告を開始するために必要なデータポイントの最小数。 たとえば、このパラメーターを 20 に設定すると、検出する必要があるデータポイントの数が 20 未満の場合、アルゴリズムは異常を報告しません。 | |
ttest | alpha | DOUBLE | デフォルト値:0.05。 有効な値: | 異常検出の感度。 このパラメーターの値が大きいほど、アルゴリズムは異常に対してより敏感になり、より多くの異常を報告します。 |
direction | VARCHAR | デフォルト値:Up。 | 検出する異常のタイプ。
| |
istl-esd | esd.* | 該当なし | esd アルゴリズムを定義するために必要な推論パラメーター。 これらのパラメーターは、この表の esd セクションで説明されている推論パラメーターと同じです。 esd アルゴリズムの推論パラメーターに | |
istl-nsigma | nsigma.* | 該当なし | nsigma アルゴリズムに必要な推論パラメーターを定義します。 詳細については、nsigma アルゴリズムの推論パラメーターセクションをご参照ください。 nsigma アルゴリズムの推論パラメーターに | |
例
例 1: esd アルゴリズムを使用して、sensor という名前の時系列テーブルの特定の時間範囲内の温度データの異常を検出します。
SELECT device_id, region, time, anomaly_detect(temperature, 'esd') AS detect_result FROM sensor WHERE time >= '2022-01-01 00:00:00' and time < '2022-01-01 00:01:00' SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+---------------+ | device_id | region | time | detect_result | +-----------+----------+---------------------------+---------------+ | F07A1260 | north-cn | 2022-01-01T00:00:00+08:00 | true | | F07A1260 | north-cn | 2022-01-01T00:00:01+08:00 | false | | F07A1260 | north-cn | 2022-01-01T00:00:02+08:00 | true | | F07A1261 | south-cn | 2022-01-01T00:00:00+08:00 | false | | F07A1261 | south-cn | 2022-01-01T00:00:01+08:00 | false | | F07A1261 | south-cn | 2022-01-01T00:00:02+08:00 | false | | F07A1261 | south-cn | 2022-01-01T00:00:03+08:00 | false | +-----------+----------+---------------------------+---------------+例 2: esd アルゴリズムを使用して、sensor テーブルの特定の時間範囲内の F07A1260 デバイスの温度データの異常を検出します。
SELECT device_id, region, time, anomaly_detect(temperature, 'esd') AS detect_result FROM sensor WHERE device_id in ('F07A1260') and time >= '2022-01-01 00:00:00' and time < '2022-01-01 00:01:00' SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+---------------+ | device_id | region | time | detect_result | +-----------+----------+---------------------------+---------------+ | F07A1260 | north-cn | 2022-01-01T00:00:00+08:00 | true | | F07A1260 | north-cn | 2022-01-01T00:00:01+08:00 | false | | F07A1260 | north-cn | 2022-01-01T00:00:02+08:00 | true | +-----------+----------+---------------------------+---------------+例 3: esd アルゴリズムを使用し、パラメーターを構成して、sensor テーブルの特定の時間範囲内の F07A1260 デバイスの温度データの異常を検出します。
SELECT device_id, region, time, anomaly_detect(temperature, 'esd', 'lenHistoryWindow=30,maxAnomalyRatio=0.1') AS detect_result FROM sensor WHERE device_id in ('F07A1260') and time >= '2022-01-01 00:00:00' and time < '2022-01-01 00:01:00' SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+---------------+ | device_id | region | time | detect_result | +-----------+----------+---------------------------+---------------+ | F07A1260 | north-cn | 2022-01-01T00:00:00+08:00 | false | | F07A1260 | north-cn | 2022-01-01T00:00:01+08:00 | false | | F07A1260 | north-cn | 2022-01-01T00:00:02+08:00 | true | +-----------+----------+---------------------------+---------------+例 4: ステートメントでネストされたダウンサンプリング演算子 MAX を使用し、ダウンサンプリング間隔を 1 分として指定します。
SELECT time, anomaly_detect(max(temperature), 'esd') AS ad_result, max(temperature) AS rawVal FROM sensor SAMPLE BY 1m;次の結果が返されます。
+---------------------------+-----------+-------------+ | time | ad_result | rawVal | +---------------------------+-----------+-------------+ | 2022-04-12T06:00:00+08:00 | null | 923091.3175 | | 2022-04-11T08:00:00+08:00 | null | 8035700 | | 2022-04-11T09:00:00+08:00 | null | 8035690.25 | | 2022-04-11T10:00:00+08:00 | null | 3306277.545 | | 2022-04-11T11:00:00+08:00 | null | 5921167.787 | | 2022-04-11T12:00:00+08:00 | null | 833541.304 | +---------------------------+-----------+-------------+例 5: ステートメントでネストされた非ダウンサンプリング演算子 LATEST を使用し、ダウンサンプリング間隔を 0 として指定します。
SELECT time, anomaly_detect(latest(temperature), 'esd') AS ad_result, latest(temperature) AS latestVal FROM sensor SAMPLE BY 0;次の結果が返されます。
+---------------------------+-----------+-------------+ | time | ad_result | latestVal | +---------------------------+-----------+-------------+ | 2022-04-12T06:00:00+08:00 | false | 923091.3175 | | 2022-04-13T07:00:00+08:00 | false | 8037506.75 | | 2022-04-13T07:00:00+08:00 | false | 50490.2 | +---------------------------+-----------+-------------+