AnomalyDetection_SpikeAndDip (Azure Stream Analytics)

時系列イベントの一時的な異常を検出します。

基になる機械学習モデルでは、アダプティブ カーネル密度推定アルゴリズムが使用されます。

構文

AnomalyDetection_SpikeAndDip(
    <scalar_expression>,
    <confidence>,
    <historySize>,
    <mode>)
OVER ([PARTITION BY <partition key>]
    LIMIT DURATION(<unit>, <length>)
    [WHEN boolean_expression])

引数

scalar_expression

モデルが異常検出を実行するイベント列または計算フィールド。 このパラメーターに使用できる値には、単一 (スカラー) 値を返す FLOAT データ型または BIGINT データ型が含まれます。

ワイルドカード式 * は使用できません。 また、 scalar_expression には他の分析関数や外部関数を含めることはできません。

自信

機械学習モデルの感度を設定する 1.00 から 100 (含む) までのパーセンテージ値。 信頼度が低いほど、検出された異常の数が多くなり、その逆も同様です。 70 から 90 までの任意の数から開始し、開発またはテストで観察された結果に基づいてこれを調整します。

historySize

モデルが継続的に学習し、異常のために次のイベントのスコア付けに使用するスライディング ウィンドウ内のイベントの数。 通常、これは、モデルが後続の異常にフラグを設定できるように、通常の動作の期間を表す必要があります。 履歴ログを使用して教育的な推測から始め、開発またはテストで観察された結果に基づいて調整します。

mode

スパイク、ディップのみ、またはスパイクとディップの両方をそれぞれ検出する値が "spikes"、"dips"、または "spikesanddips" である文字列パラメーター。

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause

イベントの特定の列に基づいてモデルのトレーニングをパーティション分割するために使用されます。 モデルは、すべてのパーティションに同じ関数パラメーター設定を適用します。

limit_duration_clause DURATION(unit, length)

Stream Analytics 内のスライディング ウィンドウの時間のサイズ。 この時間枠の推奨サイズは、 historySize イベントの数を安定した状態で生成するのにかかる時間と同じです。

when_clause

異常検出を実行するためにモデルによって受け入れられるイベントのブール条件を指定します。 when_clauseは省略可能です。

戻り値の型

関数は、次の列で構成される入れ子になったレコードを返します。

IsAnomaly

イベントが異常かどうかを示す BIGINT (0 または 1)。

スコア

イベントの異常を示す計算された p 値スコア (float)。 スコアが低いということは、イベントが同じ分布の一部である確率が低くなることを意味するため、異常度が高くなります。

次の例では、履歴サイズが 120 イベントの 2 分間のスライディング ウィンドウで、1 秒あたり 1 イベントの均一な入力速度を想定しています。 最後の SELECT ステートメントで、95% の信頼度レベルでスコアと異常状態を抽出して出力します。

WITH AnomalyDetectionStep AS
(
    SELECT
        EVENTENQUEUEDUTCTIME as time,
        CAST(temperature AS FLOAT) as temp,
        AnomalyDetection_SpikeAndDip(CAST(temperature AS FLOAT), 95, 120, 'spikesanddips')
        OVER(LIMIT DURATION(second, 120)) AS SpikeAndDipScores
    FROM input
)
SELECT
    time,
    temp,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'Score') as FLOAT) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'IsAnomaly') AS BIGINT) AS
    IsSpikeAndDipAnomaly
INTO output
FROM AnomalyDetectionStep

タンブリング ウィンドウ 1 秒を使用して統一された非均一入力ストリームの例:

WITH SmootheningStep AS
(
    SELECT
        System.Timestamp() as time,
        AVG(CAST(temperature as float)) as temp
    FROM input
    GROUP BY TUMBLINGWINDOW(second, 1)
),
AnomalyDetectionStep AS
(
    SELECT
    time,
    temp,
    AnomalyDetection_SpikeAndDip(temp, 95, 120, 'spikesanddips') 
        OVER(LIMIT DURATION(second, 120)) as SpikeAndDipScores
    FROM SmootheningStep
)
SELECT
    time,
    temp,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'Score') AS FLOAT) As
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'IsAnomaly') AS BIGINT) AS
    IsSpikeAndDipAnomaly
INTO output
FROM AnomalyDetectionStep

センサーごとに個別のモデルをトレーニングするためのパーティション分割クエリの例:

WITH AnomalyDetectionStep AS
(
    SELECT
        sensorid,
        System.Timestamp() AS time,
        CAST(temperature AS FLOAT) AS temp,
        AnomalyDetection_SpikeAndDip(CAST(temperature AS FLOAT), 95, 120, 'spikesanddips')
            OVER(PARTITION BY sensorid LIMIT DURATION(second, 120)) AS SpikeAndDipScores
    FROM input
)
SELECT
    CAST (sensorid AS NVARCHAR(max)) AS sensoridstring,
    time,
    temp,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'Score') as float) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(SpikeAndDipScores, 'IsAnomaly') AS BIGINT) AS
    IsSpikeAndDipAnomaly
INTO output
FROM AnomalyDetectionStep