Zelfstudie: Multivariate Anomaly Detection in één uur leren

Anomaly Detector multivariate Anomaly Detection (MVAD) is een geavanceerd AI-hulpprogramma voor het detecteren van afwijkingen uit een groep metrische gegevens op een manier zonder supermoed.

Over het algemeen kunt u de volgende stappen nemen om MVAD te gebruiken:

  1. Maak een Anomaly Detector die ondersteuning biedt voor MVAD in Azure.
  2. Bereid uw gegevens voor.
  3. Een MVAD-model trainen.
  4. De status van uw model opvragen.
  5. Detecteer afwijkingen met het getrainde MVAD-model.
  6. Haal de deferentieresultaten op en interpreteer deze.

In deze zelfstudie gaat u:

  • Meer informatie over het voorbereiden van uw gegevens in de juiste indeling.
  • Meer inzicht in het trainen en afleiden met MVAD.
  • Inzicht in de invoerparameters en hoe u de resultaten van de uitvoerdeferentie interpreteert.

1. Maak een Anomaly Detector die ondersteuning biedt voor MVAD

  • Een Azure-abonnement maken als u er nog geen hebt - Maak er gratis een
  • Zodra u uw Azure-abonnement hebt, maakt u Anomaly Detector resource in de Azure Portal om uw API-sleutel en API-eindpunt op te halen.

Notitie

Tijdens de preview-fase is MVAD alleen beschikbaar in beperkte regio's. Maak een bladwijzer voor wat er nieuw is in Anomaly Detector up-to-date te houden met de implementaties van MVAD-regio's. U kunt ook een probleem met GitHub of contact met ons opnemen op AnomalyDetector@microsoft.com om een aanvraag voor specifieke regio's uit te brengen.

2. Gegevensvoorbereiding

Vervolgens moet u uw trainingsgegevens (en de deferencegegevens) voorbereiden.

Schema voor invoergegevens

MVAD detecteert afwijkingen in een groep metrische gegevens en we noemen elke metrische gegevens een variabele of een tijdreeks.

  • U kunt het voorbeeldgegevensbestand downloaden van Microsoft om het geaccepteerde schema te controleren van: https://aka.ms/AnomalyDetector/MVADSampleData

  • Elke variabele moet twee en slechts twee velden hebben, en , en moeten worden opgeslagen in een timestamp value CSV-bestand (door komma's gescheiden waarden).

  • De kolomnamen van het CSV-bestand moeten nauwkeurig timestamp en value , casegevoelig zijn.

  • De timestamp waarden moeten voldoen aan ISO 8601; de kan gehele getallen of decimalen met een aantal decimalen value zijn. Een goed voorbeeld van de inhoud van een CSV-bestand:

    tijdstempel waarde
    2019-04-01T00:00:00Z 5
    2019-04-01T00:01:00Z 3,6
    2019-04-01T00:02:00Z 4
    ... ...

    Notitie

    Als uw tijdstempels uren, minuten en/of seconden hebben, moet u ervoor zorgen dat ze goed worden afgerond voordat u de API's aanroept.

    Als uw gegevensfrequentie bijvoorbeeld elke 30 seconden één gegevenspunt moet zijn, maar u wel tijdstempels ziet zoals '12:00:01' en '12:00:28', is het een sterk signaal dat u de tijdstempels vooraf moet verwerken naar nieuwe waarden zoals 12:00:00 en 12:00:30.

    Raadpleeg de sectie 'Tijdstempel round-up' in het document best practices voor meer informatie.

  • De naam van het CSV-bestand wordt gebruikt als de naam van de variabele en moet uniek zijn. Bijvoorbeeld 'temperature.csv' en 'humidity.csv'.

  • Variabelen voor training en variabelen voor de deferentie moeten consistent zijn. Als u bijvoorbeeld , , , , en gebruikt voor de training, moet u exact dezelfde variabelen series_1 series_2 voor de series_3 series_4 series_5 deferie verstrekken.

  • CSV-bestanden moeten worden gecomprimeerd in een ZIP-bestand en worden geüpload naar een Azure Blob-container. Het zip-bestand kan elke want-naam hebben.

Mapstructuur

Een veelvoorkomende fout bij het voorbereiden van gegevens zijn extra mappen in het zip-bestand. Stel bijvoorbeeld dat de naam van het zip-bestand series.zip is. Nadat de bestanden naar een nieuwe map zijn gedecomprimeert, is het juiste pad naar CSV-bestanden en kan een ./series verkeerd pad ./series/series_1.csv ./series/foo/bar/series_1.csv zijn.

Het juiste voorbeeld van de mapstructuur na het decomprimeren van het zip-bestand in Windows

.
└── series
    ├── series_1.csv
    ├── series_2.csv
    ├── series_3.csv
    ├── series_4.csv
    └── series_5.csv

Een onjuist voorbeeld van de mapstructuur na het decomprimeren van het zip-bestand in Windows

.
└── series
    └── series
        ├── series_1.csv
        ├── series_2.csv
        ├── series_3.csv
        ├── series_4.csv
        └── series_5.csv

Hulpprogramma's voor het in- en uploaden van gegevens

In deze sectie delen we enkele voorbeeldcode en hulpprogramma's die u kunt kopiëren en bewerken om toe te voegen aan uw eigen toepassingslogica die betrekking heeft op MVAD-invoergegevens.

CSV-bestanden comprimeren in * nix

zip -j series.zip series/*.csv

CSV-bestanden comprimeren in Windows

  • Navigeer naar de map met alle CSV-bestanden.
  • Selecteer alle CSV-bestanden die u nodig hebt.
  • Klik met de rechtermuisknop op een van de CSV-bestanden en selecteer Send to .
  • Selecteer Compressed (zipped) folder in de vervolgkeuzekeuzekeuze.
  • Wijzig de naam van het ZIP-bestand naar behoefte.

Met Python-code & gegevens geüpload naar Azure Blob Storage

Raadpleeg dit document voor meer informatie over het uploaden van een bestand naar Azure Blob.

U kunt ook de onderstaande voorbeeldcode gebruiken om het bestand te uploaden en te uploaden. U kunt de Python-code in deze sectie kopiëren en opslaan als een .py-bestand (bijvoorbeeld ) en uitvoeren met opdrachtregels zipAndUpload.py zoals deze:

  • python zipAndUpload.py -s "foo\bar" -z test123.zip -c {azure blob connection string} -n container_xxx

    Met deze opdracht worden alle CSV-bestanden in gecomprimeerd tot foo\bar één ZIP-bestand met de naam test123.zip . Deze wordt test123.zip geüpload naar de container container_xxx in uw blob.

  • python zipAndUpload.py -s "foo\bar" -z test123.zip -c {azure blob connection string} -n container_xxx -r

    Met deze opdracht doet u hetzelfde als hierboven, maar het ZIP-bestand wordt verwijderd nadat test123.zip het is geüpload.

Argumenten:

  • --source-folder, -s , , pad naar de bronmap met CSV-bestanden
  • --zipfile-name, -z , de naam van het zip-bestand
  • --connection-string, -c , connection string aan uw blob
  • --container-name, -n , de naam van de container
  • --remove-zipfile, -r indien aan, verwijdert u het zip-bestand
import os
import argparse
import shutil
import sys

from azure.storage.blob import BlobClient
import zipfile


class ZipError(Exception):
    pass


class UploadError(Exception):
    pass


def zip_file(root, name):
    try:
        z = zipfile.ZipFile(name, "w", zipfile.ZIP_DEFLATED)
        for f in os.listdir(root):
            if f.endswith("csv"):
                z.write(os.path.join(root, f), f)
        z.close()
        print("Compress files success!")
    except Exception as ex:
        raise ZipError(repr(ex))


def upload_to_blob(file, conn_str, cont_name, blob_name):
    try:
        blob_client = BlobClient.from_connection_string(conn_str, container_name=cont_name, blob_name=blob_name)
        with open(file, "rb") as f:
            blob_client.upload_blob(f, overwrite=True)
        print("Upload Success!")
    except Exception as ex:
        raise UploadError(repr(ex))


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--source-folder", "-s", type=str, required=True, help="path to source folder")
    parser.add_argument("--zipfile-name", "-z", type=str, required=True, help="name of the zip file")
    parser.add_argument("--connection-string", "-c", type=str, help="connection string")
    parser.add_argument("--container-name", "-n", type=str, help="container name")
    parser.add_argument("--remove-zipfile", "-r", action="store_true", help="whether delete the zip file after uploading")
    args = parser.parse_args()

    try:
        zip_file(args.source_folder, args.zipfile_name)
        upload_to_blob(args.zipfile_name, args.connection_string, args.container_name, args.zipfile_name)
    except ZipError as ex:
        print(f"Failed to compress files. {repr(ex)}")
        sys.exit(-1)
    except UploadError as ex:
        print(f"Failed to upload files. {repr(ex)}")
        sys.exit(-1)
    except Exception as ex:
        print(f"Exception encountered. {repr(ex)}")

    try:
        if args.remove_zipfile:
            os.remove(args.zipfile_name)
    except Exception as ex:
        print(f"Failed to delete the zip file. {repr(ex)}")

3. Een MVAD-model trainen

Hier ziet u een voorbeeld van de aanvraag body en de voorbeeldcode in Python om een MVAD-model te trainen.

// Sample Request Body
{
    "slidingWindow": 200,
    "alignPolicy": {
        "alignMode": "Outer",
        "fillNAMethod": "Linear", 
        "paddingValue": 0
    },
    // This could be your own ZIP file of training data stored on Azure Blob and a SAS url could be used here
    "source": "https://aka.ms/AnomalyDetector/MVADSampleData", 
    "startTime": "2021-01-01T00:00:00Z", 
    "endTime": "2021-01-02T12:00:00Z", 
    "displayName": "Contoso model"
}
# Sample Code in Python
########### Python 3.x #############
import http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': '{API key}',
}

params = urllib.parse.urlencode({})

try:
    conn = http.client.HTTPSConnection('{endpoint}')
    conn.request("POST", "/anomalydetector/v1.1-preview/multivariate/models?%s" % params, "{request body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################

Responscode 201 geeft aan dat de aanvraag is geslaagd.

Invoerparameters

Vereiste parameters

Deze drie parameters zijn vereist voor api-aanvragen voor training en de deference:

  • source- De koppeling naar uw ZIP-bestand in de Azure Blob Storage shared access signatures (SAS).
  • startTime - De begintijd van gegevens die worden gebruikt voor training of de deferie. Als deze eerder is dan de werkelijke vroegste tijdstempel in de gegevens, wordt de daadwerkelijke vroegste tijdstempel gebruikt als beginpunt.
  • endTime - De eindtijd van gegevens die worden gebruikt voor training of de deferie, die later moet zijn dan of gelijk moet zijn aan startTime . Als later is dan de werkelijke meest recente tijdstempel in de gegevens, wordt de werkelijke laatste tijdstempel gebruikt endTime als het eindpunt. Als endTime gelijk is aan , betekent dit de startTime deferentie van één gegevenspunt dat vaak wordt gebruikt in streamingscenario's.

Optionele parameters voor trainings-API

Andere parameters voor de trainings-API zijn optioneel:

  • slidingWindow - Hoeveel gegevenspunten worden gebruikt om afwijkingen te bepalen. Een geheel getal tussen 28 en 2880. De standaardwaarde is 300. Als is voor modeltraining, moeten ten minste punten toegankelijk zijn vanuit het bronbestand tijdens slidingWindow k de k deference om geldige resultaten te krijgen.

    MVAD neemt een segment van gegevenspunten om te bepalen of het volgende gegevenspunt een anomalie is. De lengte van het segment is slidingWindow . Houd twee dingen in gedachten bij het kiezen van een slidingWindow waarde:

    1. De eigenschappen van uw gegevens: of deze periodiek zijn en wat de steekproeffrequentie is. Wanneer uw gegevens periodiek zijn, kunt u de lengte van 1 tot 3 cycli instellen als de slidingWindow . Wanneer uw gegevens een hoge frequentie (kleine granulariteit) hebben, zoals op minuutniveau of tweede niveau, kunt u een relatief hogere waarde van slidingWindow instellen.
    2. De balans tussen de training/de deferietijd en de mogelijke invloed op de prestaties. Een grotere slidingWindow kan leiden tot langere training/de deference time. Er is geen garantie dat grotere s leiden tot slidingWindow nauwkeurigheidsverbeteringen. Een kleine slidingWindow kan ertoe leiden dat het model moeilijk kan worden geconvergeert naar een optimale oplossing. Het is bijvoorbeeld moeilijk om afwijkingen te detecteren wanneer slidingWindow slechts twee punten heeft.
  • alignMode - Meerdere variabelen (tijdreeksen) uitlijnen op tijdstempels. Er zijn twee opties voor deze parameter, Inner en , en de Outer standaardwaarde is Outer .

    Deze parameter is essentieel wanneer er een onjuiste uitlijning is tussen tijdstempelreeksen van de variabelen. Het model moet de variabelen uitlijnen op dezelfde tijdstempelreeks voordat verdere verwerking wordt uitgevoerd.

    Innerbetekent dat het model detectieresultaten alleen rapporteert op tijdstempels waarop elke variabele een waarde heeft, dat wil zeggen het snijpunt van alle variabelen. Outerbetekent dat het model detectieresultaten rapporteert over tijdstempels waarop een variabele een waarde heeft, dat wil zeggen de union van alle variabelen.

    Hier is een voorbeeld om verschillende waarden uit alignModel te leggen.

    Variabele-1

    tijdstempel waarde
    2020-11-01 1
    2020-11-02 2
    2020-11-04 4
    2020-11-05 5

    Variabele-2

    tijdstempel waarde
    2020-11-01 1
    2020-11-02 2
    2020-11-03 3
    2020-11-04 4

    Inner twee variabelen lid maken

    tijdstempel Variabele-1 Variabele-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-04 4 4

    Outer twee variabelen lid maken

    tijdstempel Variabele-1 Variabele-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-03 nan 3
    2020-11-04 4 4
    2020-11-05 5 nan
  • fillNAMethod - De nan samengevoegde tabel invullen. Mogelijk ontbreken er waarden in de samengevoegde tabel en moeten deze correct worden verwerkt. We bieden verschillende methoden om ze te vullen. De opties zijn Linear , , , en de Previous Subsequent Zero Fixed standaardwaarde is Linear .

    Optie Methode
    Linear Waarden nan opvullen met lineaire interpolatie
    Previous De laatste geldige waarde doorgeven om hiaten op te vullen. Voorbeeld: [1, 2, nan, 3, nan, 4] -> [1, 2, 2, 3, 3, 4]
    Subsequent Gebruik de volgende geldige waarde om hiaten op te vullen. Voorbeeld: [1, 2, nan, 3, nan, 4] -> [1, 2, 3, 3, 4, 4]
    Zero Vul nan waarden in met 0.
    Fixed Vul nan waarden in met een opgegeven geldige waarde die moet worden opgegeven in paddingValue .
  • paddingValue - De opvullingswaarde wordt gebruikt om nan op te vullen wanneer is en moet in dat geval worden fillNAMethod Fixed opgegeven. In andere gevallen is dit optioneel.

  • displayName - Dit is een optionele parameter die wordt gebruikt om modellen te identificeren. U kunt deze bijvoorbeeld gebruiken om parameters, gegevensbronnen en andere metagegevens over het model en de invoergegevens te markeren. De standaardwaarde is een lege tekenreeks.

4. Modelstatus op halen

Omdat de trainings-API asynchroon is, krijgt u het model niet onmiddellijk nadat u de trainings-API hebt aangeroepen. U kunt echter de status van modellen opvragen op API-sleutel, waarmee alle modellen worden weergegeven, of op model-id, waarmee informatie over het specifieke model wordt weergegeven.

Een lijst met alle modellen maken

U kunt naar deze pagina verwijzen voor informatie over de aanvraag-URL en aanvraagheaders. U ziet dat we slechts 10 modellen retourneren, geordend op updatetijd, maar u kunt andere modellen bezoeken door de parameters en in te stellen $skip $top in de aanvraag-URL. Als uw aanvraag-URL bijvoorbeeld is, slaan we de 10 meest recente modellen over en retourneren https://{endpoint}/anomalydetector/v1.1-preview/multivariate/models?$skip=10&$top=20 we de volgende 20 modellen.

Een voorbeeld van een antwoord is

{
    "models": [
         {
             "createdTime":"2020-12-01T09:43:45Z",
             "displayName":"DevOps-Test",
             "lastUpdatedTime":"2020-12-01T09:46:13Z",
             "modelId":"b4c1616c-33b9-11eb-824e-0242ac110002",
             "status":"READY",
             "variablesCount":18
         },
         {
             "createdTime":"2020-12-01T09:43:30Z",
             "displayName":"DevOps-Test",
             "lastUpdatedTime":"2020-12-01T09:45:10Z",
             "modelId":"ab9d3e30-33b9-11eb-a3f4-0242ac110002",
             "status":"READY",
             "variablesCount":18
         }
    ],
    "currentCount": 1,
    "maxCount": 50, 
    "nextLink": "<link to more models>"
}

Het antwoord bevat 4 velden, models currentCount , , en maxCount nextLink .

  • models bevat de aangemaakte tijd, de laatste bijgewerkte tijd, de model-id, de weergavenaam, het aantal variabelen en de status van elk model.
  • currentCount bevat het aantal getrainde multivariate modellen.
  • maxCount is het maximum aantal modellen dat wordt ondersteund door deze Anomaly Detector resource.
  • nextLink kan worden gebruikt om meer modellen op te halen.

Modellen op model-id op halen

Op deze pagina wordt de aanvraag-URL beschreven voor het opvragen van modelgegevens op model-id. Een voorbeeld van een antwoord ziet er als deze uit

{
        "modelId": "45aad126-aafd-11ea-b8fb-d89ef3400c5f",
        "createdTime": "2020-06-30T00:00:00Z",
        "lastUpdatedTime": "2020-06-30T00:00:00Z",
        "modelInfo": {
          "slidingWindow": 300,
          "alignPolicy": {
            "alignMode": "Outer",
            "fillNAMethod": "Linear",
            "paddingValue": 0
          },
          "source": "<TRAINING_ZIP_FILE_LOCATED_IN_AZURE_BLOB_STORAGE_WITH_SAS>",
          "startTime": "2019-04-01T00:00:00Z",
          "endTime": "2019-04-02T00:00:00Z",
          "displayName": "Devops-MultiAD",
          "status": "READY",
          "errors": [],
          "diagnosticsInfo": {
            "modelState": {
              "epochIds": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
              "trainLosses": [0.6291328072547913, 0.1671326905488968, 0.12354248017072678, 0.1025966405868533, 
                              0.0958492755889896, 0.09069952368736267,0.08686016499996185, 0.0860302299260931,
                              0.0828735455870684, 0.08235538005828857],
              "validationLosses": [1.9232804775238037, 1.0645641088485718, 0.6031560301780701, 0.5302737951278687, 
                                   0.4698025286197664, 0.4395163357257843, 0.4182931482799006, 0.4057914316654053, 
                                   0.4056498706340729, 0.3849248886108984],
              "latenciesInSeconds": [0.3398594856262207, 0.3659665584564209, 0.37360644340515137, 
                                     0.3513407707214355, 0.3370304107666056, 0.31876277923583984, 
                                     0.3283309936523475, 0.3503587245941162, 0.30800247192382812,
                                     0.3327946662902832]
            },
            "variableStates": [
              {
                "variable": "ad_input",
                "filledNARatio": 0,
                "effectiveCount": 1441,
                "startTime": "2019-04-01T00:00:00Z",
                "endTime": "2019-04-02T00:00:00Z",
                "errors": []
              },
              {
                "variable": "ad_ontimer_output",
                "filledNARatio": 0,
                "effectiveCount": 1441,
                "startTime": "2019-04-01T00:00:00Z",
                "endTime": "2019-04-02T00:00:00Z",
                "errors": []
              },
              // More variables
            ]
          }
        }
      }

U ontvangt gedetailleerdere informatie over het bevraagde model. Het antwoord bevat metagegevens over het model, de trainingsparameters en diagnostische gegevens. Diagnostische informatie is handig voor het opsporen van gegevens en het traceren van de voortgang van de training.

  • epochIds geeft aan hoeveel tijdvakken het model in totaal 100 tijdvakken heeft getraind. Als het model bijvoorbeeld nog steeds de trainingsstatus heeft, kan dit betekenen dat het de epochId 50e trainings epoche heeft voltooid en er nog een halve weg [10, 20, 30, 40, 50] te gaan is.
  • trainLosses en worden gebruikt om te controleren of de voortgang van de optimalisatie convergeert. In dat geval zouden de validationLosses twee verliezen geleidelijk moeten afnemen.
  • latenciesInSeconds bevat de tijdskosten voor elk tijdvak en wordt elke 10 tijdvakken geregistreerd. In dit voorbeeld duurt het 10e epoche ongeveer 0,34 seconden. Dit is handig om de voltooiingstijd van de training te schatten.
  • variableStates geeft een overzicht van de informatie over elke variabele. Het is een lijst gerangschikt op filledNARatio in aflopende volgorde. Het geeft aan hoeveel gegevenspunten er worden gebruikt voor elke variabele en filledNARatio hoeveel punten er ontbreken. Normaal gesproken moeten we filledNARatio zo veel mogelijk verminderen. Te veel ontbrekende gegevenspunten zullen de nauwkeurigheid van het model verslechteren.
  • Fouten tijdens de gegevensverwerking worden in het veld errors opgenomen.

5. Deferentie met MVAD

Als u de de deferentie wilt uitvoeren, geeft u de blobbron op in het ZIP-bestand met de deferentiegegevens, de begintijd en de eindtijd.

De deferentie is ook asynchroon, waardoor de resultaten niet onmiddellijk worden geretourneerd. U ziet dat u in een variabele de koppeling van de resultaten moet opslaan in de antwoordheader die de bevat, zodat u mogelijk weet waar u de resultId resultaten later kunt krijgen.

Fouten worden meestal veroorzaakt door modelproblemen of gegevensproblemen. U kunt geen deferentie uitvoeren als het model niet gereed is of als de gegevenskoppeling ongeldig is. Zorg ervoor dat de trainingsgegevens en de deferentiegegevens consistent zijn, wat betekent dat ze exact dezelfde variabelen moeten zijn, maar met verschillende tijdstempels. Meer variabelen, minder variabelen of de deferie met een andere set variabelen slagen niet voor de gegevensverificatiefase en er treden fouten op. Gegevensverificatie wordt uitgesteld, zodat er alleen een foutbericht wordt weergegeven wanneer u de resultaten opvraagt.

6. De deferenceresultaten op halen

U hebt de nodig resultId om resultaten te krijgen. resultId wordt verkregen via de antwoordheader wanneer u de deferentieaanvraag indient. Deze pagina bevat instructies voor het uitvoeren van query's op de deference-resultaten.

Een voorbeeld van een antwoord ziet er als deze uit

 {
        "resultId": "663884e6-b117-11ea-b3de-0242ac130004",
        "summary": {
          "status": "READY",
          "errors": [],
          "variableStates": [
            {
              "variable": "ad_input",
              "filledNARatio": 0,
              "effectiveCount": 26,
              "startTime": "2019-04-01T00:00:00Z",
              "endTime": "2019-04-01T00:25:00Z",
              "errors": []
            },
            {
              "variable": "ad_ontimer_output",
              "filledNARatio": 0,
              "effectiveCount": 26,
              "startTime": "2019-04-01T00:00:00Z",
              "endTime": "2019-04-01T00:25:00Z",
              "errors": []
            },
            // more variables
          ],
          "setupInfo": {
            "source": "https://aka.ms/AnomalyDetector/MVADSampleData",
            "startTime": "2019-04-01T00:15:00Z",
            "endTime": "2019-04-01T00:40:00Z"
          }
        },
        "results": [
          {
            "timestamp": "2019-04-01T00:15:00Z",
            "errors": [
              {
                "code": "InsufficientHistoricalData",
                "message": "historical data is not enough."
              }
            ]
          },
          // more results
          {
            "timestamp": "2019-04-01T00:20:00Z",
            "value": {
              "contributors": [],
              "isAnomaly": false,
              "severity": 0,
              "score": 0.17805261260751692
            }
          },
          // more results
          {
            "timestamp": "2019-04-01T00:27:00Z",
            "value": {
              "contributors": [
                {
                  "contributionScore": 0.0007775013367514271,
                  "variable": "ad_ontimer_output"
                },
                {
                  "contributionScore": 0.0007989604079048129,
                  "variable": "ad_series_init"
                },
                {
                  "contributionScore": 0.0008900927229851369,
                  "variable": "ingestion"
                },
                {
                  "contributionScore": 0.008068144477478554,
                  "variable": "cpu"
                },
                {
                  "contributionScore": 0.008222036467507165,
                  "variable": "data_in_speed"
                },
                {
                  "contributionScore": 0.008674941549594993,
                  "variable": "ad_input"
                },
                {
                  "contributionScore": 0.02232242629793674,
                  "variable": "ad_output"
                },
                {
                  "contributionScore": 0.1583773213660846,
                  "variable": "flink_last_ckpt_duration"
                },
                {
                  "contributionScore": 0.9816531517495176,
                  "variable": "data_out_speed"
                }
              ],
              "isAnomaly": true,
              "severity": 0.42135109874230336,
              "score": 1.213510987423033
            }
          },
          // more results
        ]
      }

Het antwoord bevat de resultaatstatus, variabele informatie, de deferenceparameters en de deferenceresultaten.

  • variableStates geeft de informatie weer van elke variabele in de deferentieaanvraag.
  • setupInfo is de aanvraag body die is verzonden voor deze deferentie.
  • results bevat de detectieresultaten. Er zijn drie typische typen detectieresultaten.
    1. Foutcode InsufficientHistoricalData . Dit gebeurt meestal alleen bij de eerste paar tijdstempels, omdat het model gegevens op een op venster gebaseerde manier de defereert en historische gegevens nodig heeft om een beslissing te nemen. Voor de eerste paar tijdstempels zijn er onvoldoende historische gegevens, zodat er geen deferentie op kan worden uitgevoerd. In dit geval kan het foutbericht worden genegeerd.
    2. "isAnomaly": false geeft aan dat de huidige tijdstempel geen anomalie is.
      • severity geeft de relatieve ernst van de anomalie aan en voor normale gegevens is dit altijd 0.
      • score is de onbewerkte uitvoer van het model waarop het model een beslissing neemt die zelfs voor normale gegevenspunten niet nul kan zijn.
    3. "isAnomaly": true geeft een afwijking aan in het huidige tijdstempel.
      • severity geeft de relatieve ernst van de anomalie aan en voor abnormale gegevens is deze altijd groter dan 0.
      • score is de onbewerkte uitvoer van het model waarop het model een beslissing neemt. severity is een afgeleide waarde van score . Elk gegevenspunt heeft een score .
      • contributors is een lijst met de bijdragescore van elke variabele. Hogere bijdragescores wijzen op een hogere kans op de hoofdoorzaak. Deze lijst wordt vaak gebruikt voor het interpreteren van afwijkingen en het diagnosticeren van de hoofdoorzaken.

Notitie

Een veelvoorkomende valkuil is het nemen van alle gegevenspunten isAnomaly = true met als afwijkingen. Dat kan uiteindelijk te veel fout-positieven hebben. U moet zowel als (of ) gebruiken om afwijkingen op te zoeken die niet ernstig zijn en isAnomaly severity (optioneel) groepering te gebruiken om de duur van de afwijkingen te controleren om willekeurige ruis score te onderdrukken. Raadpleeg de veelgestelde vragen in het document over best practices voor het verschil tussen severity en score .

Volgende stappen