AnomalyDetection_SpikeAndDip (Azure Stream Analytics)

Détecte les anomalies temporaires dans un événement de série chronologique.

Le modèle Machine Learning sous-jacent utilise l’algorithme d’estimation de la densité adaptative du noyau.

Syntaxe

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

Arguments

scalar_expression

Colonne d’événement ou champ calculé sur lequel le modèle effectue la détection d’anomalies. Les valeurs autorisées pour ce paramètre incluent les types de données FLOAT ou BIGINT qui retournent une valeur unique (scalaire).

L’expression générique * n’est pas autorisée. En outre, scalar_expression ne peut pas contenir d’autres fonctions analytiques ou fonctions externes.

Confiance

Nombre de pourcentages compris entre 1,00 et 100 (inclus) qui définit la sensibilité du modèle Machine Learning. Plus la confiance est faible, plus le nombre d’anomalies détectées est élevé, et inversement. Commencez à partir d’un nombre arbitraire compris entre 70 et 90 et ajustez-le en fonction des résultats observés dans le développement ou les tests.

historySize

Nombre d’événements dans une fenêtre glissante que le modèle apprend en continu et utilise pour noter l’événement suivant en cas d’anomalie. En règle générale, cela doit représenter la période de temps de comportement normal pour permettre au modèle de signaler une anomalie ultérieure. Commencez par une estimation instruite à l’aide des journaux d’activité historiques et ajustez en fonction des résultats observés dans le développement ou le test.

mode

Paramètre de chaîne dont la valeur est « spikes », « dips » ou « spikesanddips », pour détecter uniquement les pics, les creux ou les pics et les creux, respectivement.

OVER ( [ clause_partition_by ] clause_limit_duration [clause_when])

clause_partition_by

Permet de partitionner l’entraînement d’un modèle en fonction d’une colonne particulière dans les événements. Le modèle applique les mêmes paramètres de fonction sur toutes les partitions.

limit_duration_clause DURATION(unit, length)

Taille de la fenêtre glissante dans Stream Analytics en termes de temps. La taille recommandée de cette fenêtre de temps est l’équivalent du temps nécessaire pour générer le nombre d’événements historySize dans un état stable.

clause_when

Spécifie la condition booléenne pour que les événements soient acceptés par le modèle pour effectuer la détection d’anomalie. La when_clause est facultative.

Types de retour

La fonction retourne un enregistrement imbriqué composé des colonnes suivantes :

IsAnomaly

BIGINT (0 ou 1) indiquant si l’événement était anormal ou non.

Score

Score p-valeur calculé (float) indiquant à quel point un événement est anormal. Des scores inférieurs signifient une probabilité plus faible que l’événement fait partie de la même distribution, et donc plus il est anormal.

Exemples

L’exemple suivant suppose un taux d’entrée uniforme de 1 événement par seconde dans une fenêtre glissante de 2 minutes avec une taille d’historique de 120 événements. La dernière instruction SELECT extrait et génère le score et le statut d’anomalie avec un niveau de confiance de 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

Exemple avec un flux d’entrée non uniforme rendu uniforme à l’aide d’une fenêtre bascule de 1 seconde :

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

Exemple avec une requête partitionnée pour entraîner un modèle distinct par capteur :

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