Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Meer informatie over het bouwen van een anomaliedetectietoepassing voor tijdreeksgegevens. In deze zelfstudie maakt u een .NET-consoletoepassing met C# in Visual Studio 2019.
In deze zelfstudie leert u het volgende:
- De gegevens laden
- Periode voor een tijdreeks detecteren
- Anomalie detecteren voor een periodieke tijdreeks
U vindt de broncode voor deze zelfstudie in de dotnet/samples opslagplaats.
Voorwaarden
Visual Studio 2022 of hoger waarop de workload .NET Desktop Development is geïnstalleerd.
Een consoletoepassing maken
Maak een C#-Consoletoepassing met de naam PhoneCallsAnomalyDetection. Kies Volgende.
Kies .NET 8 als doelframework. Klik op Creëren.
Maak een map met de naam Data in uw project om uw gegevensbestanden op te slaan.
Installeer het Microsoft.ML NuGet-pakket versie 1.5.2:
- Klik in Solution Explorer met de rechtermuisknop op uw project en selecteer NuGet-pakketten beheren.
- Kies 'nuget.org' als pakketbron.
- Selecteer het tabblad Bladeren.
- Zoek naar Microsoft.ML.
- Selecteer Microsoft.ML in de lijst met pakketten en kies versie 1.5.2 in de vervolgkeuzelijst Versie.
- Selecteer de knop Installeren.
- Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Ik ga akkoord in het dialoogvenster Licentie accepteren als u akkoord gaat met de licentievoorwaarden voor de vermelde pakketten.
Herhaal deze stappen voor Microsoft.ML.TimeSeries versie 1.5.2.
Voeg de volgende
usinginstructies toe boven aan uw Program.cs bestand:using Microsoft.ML; using Microsoft.ML.TimeSeries; using PhoneCallsAnomalyDetection;
Uw gegevens downloaden
Download de gegevensset en sla deze op in de map Data die u eerder hebt gemaakt:
Klik met de rechtermuisknop op phone-calls.csv en selecteer 'Koppeling opslaan (of doel) als...'
Zorg ervoor dat u het bestand *.csv opslaat in de map Gegevens of nadat u het ergens anders hebt opgeslagen, verplaatst u het bestand *.csv naar de map Gegevens.
Klik in Solution Explorer met de rechtermuisknop op het bestand *.csv en selecteer Eigenschappen. Wijzig onder Advancedde waarde van Kopiëren naar Output Directory in Kopiëren indien nieuwer.
De volgende tabel is een voorbeeld van gegevens uit uw *.csv-bestand:
| tijdstempel | waarde |
|---|---|
| 2018/9/3 | 36.69670857 |
| 2018/9/4 | 35.74160571 |
| ..... | ..... |
| 2018/10/3 | 34.49893429 |
| ... | .... |
Dit bestand vertegenwoordigt een tijdreeks. Elke rij in het bestand is een gegevenspunt. Elk gegevenspunt heeft twee kenmerken, namelijk timestamp en value, om het aantal telefoongesprekken per dag weer te geven. Het aantal telefoongesprekken wordt omgezet naar verminderde gevoeligheid.
Klassen maken en paden definiëren
Definieer vervolgens de gegevensstructuren van de invoer- en voorspellingsklasse.
Voeg een nieuwe klasse toe aan uw project:
Klik in Solution Explorer-met de rechtermuisknop op het project en selecteer > Nieuw item toevoegen.
Selecteer in het dialoogvenster Nieuw item toevoegenKlasse en wijzig het veld Naam in PhoneCallsData.cs. Selecteer vervolgens toevoegen.
Het bestand PhoneCallsData.cs wordt geopend in de code-editor.
Voeg de volgende
usingrichtlijn toe aan het begin van PhoneCallsData.cs:using Microsoft.ML.Data;Verwijder de bestaande klassedefinitie en voeg de volgende code, die twee klassen
PhoneCallsDataenPhoneCallsPredictionbevat, toe aan het PhoneCallsData.cs-bestand:public class PhoneCallsData { [LoadColumn(0)] public string? timestamp; [LoadColumn(1)] public double value; } public class PhoneCallsPrediction { // Vector to hold anomaly detection results, including isAnomaly, anomalyScore, // magnitude, expectedValue, boundaryUnits, upperBoundary and lowerBoundary. [VectorType(7)] public double[]? Prediction { get; set; } }PhoneCallsDatageeft een invoergegevensklasse op. Het kenmerk LoadColumn geeft aan welke kolommen (per kolomindex) in de gegevensset moeten worden geladen. Het heeft twee kenmerkentimestampenvaluedie overeenkomen met dezelfde kenmerken in het gegevensbestand.PhoneCallsPredictiongeeft de voorspellingsgegevensklasse op. Voor de SR-CNN-detector is de voorspelling afhankelijk van de opgegeven -detectiemodus. In dit voorbeeld selecteert u deAnomalyAndMargin-modus. De uitvoer bevat zeven kolommen. In de meeste gevallen zijnIsAnomaly,ExpectedValue,UpperBoundaryenLowerBoundaryinformatief genoeg. Ze vertellen u of een punt een anomalie is, de verwachte waarde van het punt en het onderste en bovenste grensgebied van het punt.Voeg de volgende code toe aan de regel rechts onder de
usinginstructies om het pad naar uw gegevensbestand op te geven:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "phone-calls.csv");
Variabelen initialiseren
Vervang de
Console.WriteLine("Hello World!")regel door de volgende code om demlContextvariabele te declareren en te initialiseren:MLContext mlContext = new MLContext();De MLContext-klasse is een startpunt voor alle ML.NET bewerkingen en het initialiseren van
mlContextmaakt een nieuwe ML.NET-omgeving die kan worden gedeeld met de werkstroomobjecten voor het maken van modellen. Het is vergelijkbaar metDBContextin Entity Framework.
De gegevens laden
Gegevens in ML.NET worden weergegeven als een IDataView-interface.
IDataView is een flexibele, efficiënte manier om tabelgegevens (numeriek en tekst) te beschrijven. Gegevens kunnen worden geladen vanuit een tekstbestand of uit andere bronnen (bijvoorbeeld SQL-database of logboekbestanden) naar een IDataView-object.
Voeg de volgende code toe onder het maken van de
mlContextvariabele:IDataView dataView = mlContext.Data.LoadFromTextFile<PhoneCallsData>(path: _dataPath, hasHeader: true, separatorChar: ',');De LoadFromTextFile() definieert het gegevensschema en leest in het bestand. Deze neemt de gegevenspadvariabelen in en retourneert een
IDataView.
Anomaliedetectie van tijdreeksen
Anomaliedetectie van tijdreeksen is het proces van het detecteren van uitbijters in tijdreeksgegevens; dit zijn punten in een gegeven invoertijdreeks waar het gedrag niet is wat werd verwacht, of 'ongebruikelijk'. Deze afwijkingen wijzen doorgaans op bepaalde gebeurtenissen die van belang zijn in het probleemdomein: een cyberaanval op gebruikersaccounts, stroomstoringen, bursting RPS op een server, geheugenlek, enzovoort.
Als u anomalie in tijdreeksen wilt vinden, moet u eerst de periode van de reeks bepalen. Vervolgens kan de tijdreeks worden opgesplitst in verschillende onderdelen als Y = T + S + R, waarbij Y de oorspronkelijke reeks is, T het trendonderdeel is, S het seizoensgebonden onderdeel is en R het restonderdeel van de reeks is. Deze stap wordt decompositie genoemd. Ten slotte wordt detectie uitgevoerd op het resterende onderdeel om de afwijkingen te vinden. In ML.NET is het SR-CNN algoritme een geavanceerd en nieuw algoritme dat is gebaseerd op Spectral Residual (SR) en Convolutional Neural Network (CNN) om anomalie op tijdreeksen te detecteren. Zie Time-Series Anomaly Detection Service bij Microsoftvoor meer informatie over dit algoritme.
In deze zelfstudie ziet u dat deze procedures kunnen worden voltooid met behulp van twee functies.
Periode detecteren
In de eerste stap roept u de functie DetectSeasonality aan om de periode van de reeks te bepalen.
De methode DetectPeriod maken
Maak de methode
DetectPeriodonderaan het Program.cs-bestand met behulp van de volgende code:int DetectPeriod(MLContext mlContext, IDataView phoneCalls) { }Gebruik de functie DetectSeasonality om periode te detecteren. Voeg deze toe aan de
DetectPeriodmethode met de volgende code:int period = mlContext.AnomalyDetection.DetectSeasonality(phoneCalls, nameof(PhoneCallsData.value));Geef de periodewaarde weer door het volgende als de volgende regel code toe te voegen in de methode
DetectPeriod:Console.WriteLine($"Period of the series is: {period}.");Retourneer de periodewaarde.
// <SnippetSetupSrCnnParameters>Voeg de volgende aanroep aan de
DetectPeriod-methode toe, onder de aanroep van deLoadFromTextFile()-methode.int period = DetectPeriod(mlContext, dataView);
Resultaten van periodedetectie
Voer de toepassing uit. Uw resultaten moeten er ongeveer als volgt uitzien.
Period of the series is: 7.
Anomalie detecteren
In deze stap gebruikt u de methode DetectEntireAnomalyBySrCnn om afwijkingen te vinden.
De methode DetectAnomaly maken
Maak de
DetectAnomalymethode, net onder deDetectPeriodmethode, met behulp van de volgende code:void DetectAnomaly(MLContext mlContext, IDataView phoneCalls, int period) { }Stel SrCnnEntireAnomalyDetectorOptions in de
DetectAnomalymethode in met de volgende code:var options = new SrCnnEntireAnomalyDetectorOptions() { Threshold = 0.3, Sensitivity = 64.0, DetectMode = SrCnnDetectMode.AnomalyAndMargin, Period = period, };Detecteer anomalie door SR-CNN algoritme door de volgende coderegel toe te voegen in de methode
DetectAnomaly:var outputDataView = mlContext.AnomalyDetection.DetectEntireAnomalyBySrCnn(phoneCalls, nameof(PhoneCallsPrediction.Prediction), nameof(PhoneCallsData.value), options);Converteer de weergave van de uitvoergegevens naar een sterk getypte
IEnumerablevoor eenvoudigere weergave met behulp van deCreateEnumerablemethode met de volgende code:var predictions = mlContext.Data.CreateEnumerable<PhoneCallsPrediction>( outputDataView, reuseRowObject: false);Maak een weergavekop met de volgende code als de volgende regel in de methode
DetectAnomaly:Console.WriteLine("Index,Data,Anomaly,AnomalyScore,Mag,ExpectedValue,BoundaryUnit,UpperBoundary,LowerBoundary");U geeft de volgende informatie weer in de resultaten van de detectie van wijzigingenpunten:
-
Indexis de index van elk punt. -
Anomalyis de indicator of elk punt wordt gedetecteerd als anomalie. -
ExpectedValueis de geschatte waarde van elk punt. -
LowerBoundaryis de laagste waarde die elk punt kan zijn om geen anomalie te zijn. -
UpperBoundaryis de hoogste waarde die elk punt kan zijn om geen anomalie te zijn.
-
Doorloop de
predictionsIEnumerableen geef de resultaten weer met de volgende code:var index = 0; foreach (var p in predictions) { if (p.Prediction is not null) { string output; if (p.Prediction[0] == 1) output = "{0},{1},{2},{3},{4}, <-- alert is on! detected anomaly"; else output = "{0},{1},{2},{3},{4}"; Console.WriteLine(output, index, p.Prediction[0], p.Prediction[3], p.Prediction[5], p.Prediction[6]); } ++index; } Console.WriteLine("");Voeg de volgende aanroep toe aan de
DetectAnomalymethode onder de aanroep van deDetectPeriod()methode:DetectAnomaly(mlContext, dataView, period);
Anomaliedetectieresultaten
Voer de toepassing uit. Uw resultaten moeten er ongeveer als volgt uitzien. Tijdens de verwerking worden berichten weergegeven. U ziet mogelijk waarschuwingen of verwerkingsberichten. Sommige berichten zijn verwijderd uit de volgende resultaten voor duidelijkheid.
Detect period of the series
Period of the series is: 7.
Detect anomaly points in the series
Index Data Anomaly AnomalyScore Mag ExpectedValue BoundaryUnit UpperBoundary LowerBoundary
0,0,36.841787256739266,41.14206982401966,32.541504689458876
1,0,35.67303618137362,39.97331874865401,31.372753614093227
2,0,34.710132999891826,39.029491313022824,30.390774686760828
3,0,33.44765248883495,37.786086547816545,29.10921842985335
4,0,28.937110922276364,33.25646923540736,24.61775260914537
5,0,5.143895892785781,9.444178460066171,0.843613325505391
6,0,5.163325228419392,9.463607795699783,0.8630426611390014
7,0,36.76414836240396,41.06443092968435,32.46386579512357
8,0,35.77908590657007,40.07936847385046,31.478803339289676
9,0,34.547259536635245,38.847542103915636,30.246976969354854
10,0,33.55193524820608,37.871293561337076,29.23257693507508
11,0,29.091800129624648,33.392082696905035,24.79151756234426
12,0,5.154836630338823,9.455119197619213,0.8545540630584334
13,0,5.234332502492464,9.534615069772855,0.934049935212073
14,0,36.54992549471526,40.85020806199565,32.24964292743487
15,0,35.79526470980883,40.095547277089224,31.494982142528443
16,0,34.34099013096804,38.64127269824843,30.040707563687647
17,0,33.61201516582131,37.9122977331017,29.31173259854092
18,0,29.223563320561812,33.5238458878422,24.923280753281425
19,0,5.170512168851533,9.470794736131923,0.8702296015711433
20,0,5.2614938889462834,9.561776456226674,0.9612113216658926
21,0,36.37103858487317,40.67132115215356,32.07075601759278
22,0,35.813544599026855,40.113827166307246,31.513262031746464
23,0,34.05600492733225,38.356287494612644,29.755722360051863
24,0,33.65828319077884,37.95856575805923,29.358000623498448
25,0,29.381125690882463,33.681408258162854,25.080843123602072
26,0,5.261543539820418,9.561826107100808,0.9612609725400283
27,0,5.4873712582971805,9.787653825577571,1.1870886910167897
28,1,36.504694001629254,40.804976568909645,32.20441143434886 <-- alert is on, detected anomaly
...
Gefeliciteerd! U hebt nu machine learning-modellen gebouwd voor het detecteren van perioden en afwijkingen in een periodieke reeks.
U vindt de broncode voor deze zelfstudie in de dotnet/samples opslagplaats.
In deze zelfstudie hebt u het volgende geleerd:
- De gegevens laden
- Periode in de tijdreeksgegevens detecteren
- Anomalie detecteren op de tijdreeksgegevens
Volgende stappen
Bekijk de GitHub-opslagplaats met Machine Learning-voorbeelden om een voorbeeld van anomaliedetectie voor energieverbruik te verkennen.