Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megtudhatja, hogyan hozhat létre anomáliadetektálási alkalmazást a termékértékesítési adatokhoz. Ez az oktatóanyag létrehoz egy .NET-konzolalkalmazást a C# használatával a Visual Studióban.
Ebben az oktatóanyagban a következőket sajátíthatja el:
- Töltse be az adatokat
- Átalakítás létrehozása kiugró anomáliadetektáláshoz
- Kiugró értékek észlelése a transzformációval
- Változáspont-anomáliadetektáláshoz szükséges átalakítás létrehozása
- Változáspont-anomáliák észlelése az átalakítással
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Előfeltételek
A Visual Studio 2022 vagy újabb verziója telepítve van a .NET Desktop Development számítási feladattal.
Megjegyzés:
Az adatformátum alapja product-sales.csv a "Sampon értékesítés három év alatt" adatkészlet, amely eredetileg a DataMarketből származik, és amelyet a Rob Hyndman által létrehozott Time Series Data Library (TSDL) biztosít.
"Sampon értékesítés három év alatt" Adatkészlet licencelve a DataMarket alapértelmezett nyílt licence alatt.
Konzolalkalmazás létrehozása
Hozzon létre egy "ProductSalesAnomalyDetection" nevű C# -konzolalkalmazást . Kattintson a Tovább gombra.
Válassza a .NET 8-at a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.
Hozzon létre egy Data nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.
Telepítse a Microsoft.ML NuGet-csomagot:
Megjegyzés:
Ez a minta az említett NuGet-csomagok legújabb stabil verzióját használja, hacsak másként nem rendelkezik.
A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezelése lehetőséget. Válassza a "nuget.org" lehetőséget csomagforrásként, válassza a Tallózás lapot, keresse meg a Microsoft.ML , és válassza a Telepítés lehetőséget. Kattintson az OK gombra a Változások előnézete párbeszédpanelen, majd válassza az Elfogadom gombot a Licenc elfogadása párbeszédpanelen, ha elfogadja a felsorolt csomagok licencfeltételét. Ismételje meg ezeket a lépéseket a Microsoft.ML.TimeSeries esetében.
Adja hozzá a következő
usingirányelveket a Program.cs fájl tetején:using Microsoft.ML; using ProductSalesAnomalyDetection;
Töltsd le adataidat
Töltse le az adathalmazt, és mentse a korábban létrehozott Adat mappába:
Kattintson a jobb gombbal a product-sales.csv , és válassza a "Hivatkozás (vagy cél) mentése..." lehetőséget.
Győződjön meg arról, hogy a *.csv fájlt az Adatok mappába menti, vagy ha máshová menti, helyezze át a *.csv fájlt az Adat mappába.
A Megoldáskezelőben kattintson a jobb gombbal a *.csv fájlra, és válassza a Tulajdonságok lehetőséget. A Speciális területen módosítsa a Kimeneti könyvtárba másolás értékét Másolás, ha újabb.
Az alábbi táblázat egy adatelőnézet a *.csv fájlból:
| Hónap | Termékértékesítések |
|---|---|
| Január 1. | 271 |
| Január 2. | 150.9 |
| ..... | ..... |
| Február 1. | 199.3 |
| ..... | ..... |
Osztályok létrehozása és útvonalak definiálása
Ezután definiálja a bemeneti és előrejelzési osztály adatstruktúráját.
Adjon hozzá egy új osztályt a projekthez:
A Megoldáskezelőben kattintson a jobb gombbal a projektre, majd válassza az Új elem hozzáadása lehetőséget>.
Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt ProductSalesData.cs. Ezután válassza a Hozzáadás lehetőséget.
A ProductSalesData.cs fájl megnyílik a kódszerkesztőben.
Adja hozzá a következő
usingirányelvet a ProductSalesData.cs elejéhez:using Microsoft.ML.Data;Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot, amely két osztályt
ProductSalesDataésProductSalesPredictiona ProductSalesData.cs fájlt tartalmazza:public class ProductSalesData { [LoadColumn(0)] public string? Month; [LoadColumn(1)] public float numSales; } public class ProductSalesPrediction { //vector to hold alert,score,p-value values [VectorType(3)] public double[]? Prediction { get; set; } }ProductSalesDataegy bemeneti adatosztályt határoz meg. A LoadColumn attribútum azt határozza meg, hogy az adathalmaz mely oszlopait (oszlopindex alapján) kell betölteni.ProductSalesPredictionaz előrejelzési adatosztályt adja meg. Az anomáliadetektáláshoz az előrejelzés egy riasztásból áll, amely jelzi, hogy van-e anomália, nyers pontszám és p-érték. Minél közelebb van a p-érték 0-hoz, annál valószínűbb, hogy anomália történt.Hozzon létre két globális mezőt a nemrég letöltött adathalmazfájl elérési útjának és a mentett modellfájl elérési útjának tárolásához:
-
_dataPathrendelkezik a modell betanítása során használt adatkészlet elérési útjára. -
_docsizeaz adathalmazfájl rekordjainak száma. A számításhoz_docSizea következőt fogja használnipvalueHistoryLength:
-
Adja hozzá a következő kódot az irányelvek alatti sorhoz az
usingelérési utak megadásához:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "product-sales.csv"); //assign the Number of records in dataset file to constant variable const int _docsize = 36;
Változók inicializálása
Cserélje le a
Console.WriteLine("Hello World!")sort a következő kódra a változó deklarálásához és inicializálásáhozmlContext:MLContext mlContext = new MLContext();Az MLContext osztály minden ML.NET művelet kiindulópontja, és az inicializálás
mlContextúj ML.NET környezetet hoz létre, amely megosztható a modelllétrehozási munkafolyamat-objektumok között. Ez fogalmilag hasonló az Entity FrameworkhezDBContext.
Töltse be az adatokat
A ML.NET adatai IDataView-felületként jelenik meg.
IDataView a táblázatos adatok (numerikus és szöveges) leírásának rugalmas, hatékony módja. Az adatok betölthetők szövegfájlból vagy más forrásokból (például SQL-adatbázisból vagy naplófájlokból) egy IDataView objektumba.
Adja hozzá a következő kódot a
mlContextváltozó létrehozása után:IDataView dataView = mlContext.Data.LoadFromTextFile<ProductSalesData>(path: _dataPath, hasHeader: true, separatorChar: ',');A LoadFromTextFile() meghatározza az adatsémát, és beolvassa a fájlban. Felveszi az adatelérési út változóit, és visszaad egy
IDataView.
Idősor anomáliadetektálása
Az anomáliadetektálás váratlan vagy szokatlan eseményeket vagy viselkedéseket jelöl. Ad nyomokat, hol kell keresni a problémákat, és segít megválaszolni a kérdést: "Ez furcsa?".
Az anomáliadetektálás az idősoros adat kiugró értékek észlelésének folyamata; egy adott bemeneti idősorra mutat, ahol a viselkedés nem az elvárt, vagy "furcsa".
Az anomáliadetektálás sok szempontból hasznos lehet. Ilyenek például a következők:
Ha van autód, érdemes tudni: Ez az olajmérő mutatása normális, vagy van szivárgásom? Ha az energiafogyasztást figyeli, tudni szeretné: Van-e kimaradás?
Az idősor-anomáliáknak két típusa észlelhető:
A kiugró értékek a rendszer rendellenes viselkedésének átmeneti kitörését jelzik.
A változáspontok az állandó változások kezdetét jelzik a rendszerben.
Az ML.NET az IID csúcsfelismerési vagy IID változáspont-észlelési algoritmusai független és azonos elosztott adathalmazokhoz használhatók. Feltételezik, hogy a bemeneti adatok olyan adatpontok sorozatai, amelyek egymástól függetlenül mintavételezettek egy helyhez kötött eloszlásból.
A többi oktatóanyagban szereplő modellekkel ellentétben az idősor anomáliadetektor-átalakítások közvetlenül a bemeneti adatokon működnek. A IEstimator.Fit() metódusnak nincs szüksége betanítási adatokra az átalakítás létrehozásához. Szükség van azonban az adatsémára, amelyet egy üres lista ProductSalesDataalapján létrehozott adatnézet biztosít.
A termékértékesítési adatokat fogja elemezni, hogy észlelje a kiugrásokat és a változási pontokat. Az építési és betanítási modell folyamata megegyezik a csúcsfelismerés és a változáspont-észlelés esetében; a fő különbség a használt specifikus észlelési algoritmus.
Csúcs észlelése
A kiugró értékek észlelésének célja a hirtelen, de átmeneti kitörések azonosítása, amelyek jelentősen eltérnek az idősor adatértékeinek többségétől. Fontos, hogy ezeket a gyanús ritka elemeket, eseményeket vagy megfigyeléseket időben észlelje a minimalizálás érdekében. A következő megközelítéssel különböző rendellenességeket észlelhet, például kimaradásokat, kibertámadásokat vagy vírusos webes tartalmakat. Az alábbi képen egy idősor adatkészletének kiugró csúcsai láthatóak:
A CreateEmptyDataView() metódus hozzáadása
Adja hozzá a következő metódust a következőhöz Program.cs:
IDataView CreateEmptyDataView(MLContext mlContext) {
// Create empty DataView. We just need the schema to call Fit() for the time series transforms
IEnumerable<ProductSalesData> enumerableData = new List<ProductSalesData>();
return mlContext.Data.LoadFromEnumerable(enumerableData);
}
A CreateEmptyDataView() rendszer egy üres adatnézet-objektumot hoz létre a metódus bemeneteként IEstimator.Fit() használni kívánt megfelelő sémával.
A DetectSpike() metódus létrehozása
A DetectSpike() módszer:
- Létrehozza az átalakítást a becslőből.
- A korábbi értékesítési adatok alapján észleli a kiugró értékeket.
- Megjeleníti az eredményeket.
Hozza létre a metódust
DetectSpike()a Program.cs fájl alján a következő kóddal:DetectSpike(MLContext mlContext, int docSize, IDataView productSales) { }Az IidSpikeEstimator használatával betaníthatja a modellt a csúcsészlelésre. Adja hozzá a
DetectSpike()metódushoz a következő kóddal:var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95d, pvalueHistoryLength: docSize / 4);Hozza létre a csúcsfelismerési átalakítást úgy, hogy a következő kódsort adja hozzá a
DetectSpike()metódushoz:Jótanács
A
confidenceparaméterek éspvalueHistoryLengtha paraméterek hatással vannak a csúcsok észlelésére.confidencemeghatározza, hogy mennyire érzékeny a modell a csúcsokra. Minél alacsonyabb a megbízhatóság, annál valószínűbb, hogy az algoritmus észleli a "kisebb" kiugró értékeket. ApvalueHistoryLengthparaméter a tolóablakban lévő adatpontok számát határozza meg. Ennek a paraméternek az értéke általában a teljes adathalmaz százalékos értéke. Minél alacsonyabb,pvalueHistoryLengthannál gyorsabban felejti el a modell a korábbi nagy kiugró értékeket.ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));Adja hozzá a következő kódsort az
productSalesadatok a metódus következő sorakéntDetectSpike()való átalakításához:IDataView transformedData = iidSpikeTransform.Transform(productSales);Az előző kód a Transform() metódussal készít előrejelzéseket egy adathalmaz több bemeneti sorához.
transformedDataAIEnumerablemetódussal az alábbi kóddal alakítsa át erősen gépeltre a könnyebb megjelenítés érdekében:var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);Hozzon létre egy megjelenítendő fejlécsort a következő Console.WriteLine() kóddal:
Console.WriteLine("Alert\tScore\tP-Value");A csúcsfelismerési eredményekben a következő információk jelennek meg:
-
Alertegy adott adatpont kiugró riasztását jelzi. -
ScoreegyProductSalesadott adatpont értéke az adathalmazban. -
P-ValueA "P" a valószínűség. Minél közelebb van a p-érték 0-hoz, annál valószínűbb, hogy az adatpont anomália.
-
Az alábbi kóddal végignézheti a
predictionsIEnumerableelemeket, és megjelenítheti az eredményeket:foreach (var p in predictions) { if (p.Prediction is not null) { var results = $"{p.Prediction[0]}\t{p.Prediction[1]:f2}\t{p.Prediction[2]:F2}"; if (p.Prediction[0] == 1) { results += " <-- Spike detected"; } Console.WriteLine(results); } } Console.WriteLine("");Adja hozzá a hívást a
DetectSpike()metódushoz a hívás alatti metódushozLoadFromTextFile():DetectSpike(mlContext, _docsize, dataView);
Csúcsfelismerési eredmények
Az eredményeknek az alábbihoz hasonlónak kell lenniük. A feldolgozás során üzenetek jelennek meg. Megjelenhetnek figyelmeztetések vagy üzenetek feldolgozása. Néhány üzenet el lett távolítva az alábbi eredményekből az egyértelműség kedvéért.
Detect temporary changes in pattern
=============== Training the model ===============
=============== End of training process ===============
Alert Score P-Value
0 271.00 0.50
0 150.90 0.00
0 188.10 0.41
0 124.30 0.13
0 185.30 0.47
0 173.50 0.47
0 236.80 0.19
0 229.50 0.27
0 197.80 0.48
0 127.90 0.13
1 341.50 0.00 <-- Spike detected
0 190.90 0.48
0 199.30 0.48
0 154.50 0.24
0 215.10 0.42
0 278.30 0.19
0 196.40 0.43
0 292.00 0.17
0 231.00 0.45
0 308.60 0.18
0 294.90 0.19
1 426.60 0.00 <-- Spike detected
0 269.50 0.47
0 347.30 0.21
0 344.70 0.27
0 445.40 0.06
0 320.90 0.49
0 444.30 0.12
0 406.30 0.29
0 442.40 0.21
1 580.50 0.00 <-- Spike detected
0 412.60 0.45
1 687.00 0.01 <-- Spike detected
0 480.30 0.40
0 586.30 0.20
0 651.90 0.14
Változáspont-észlelés
Change points állandó változások egy idősor eseményfolyamában az értékek eloszlásában, például a szintváltozásokban és a trendekben. Ezek az állandó változások sokkal tovább tartanak, mint spikes a katasztrofális esemény(ek) jelzése.
Change points általában szabad szemmel nem láthatók, de az adatokban az alábbi módszerhez hasonló módszerekkel észlelhetők. Az alábbi kép egy példa a változáspont-észlelésre:
A DetectChangepoint() metódus létrehozása
A DetectChangepoint() metódus a következő feladatokat hajtja végre:
- Létrehozza az átalakítást a becslőből.
- Az előzmény értékesítési adatok alapján észleli a változási pontokat.
- Megjeleníti az eredményeket.
Hozza létre a metódust
DetectChangepoint()a metódus deklarációjaDetectSpike()után a következő kóddal:void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales) { }Hozza létre az iidChangePointEstimatort a
DetectChangepoint()metódusban a következő kóddal:var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95d, changeHistoryLength: docSize / 4);Ahogyan korábban is tette, hozza létre az átalakítást a becslőből a következő kódsor hozzáadásával a
DetectChangePoint()metódusban:Jótanács
A változáspontok észlelése kis késéssel történik, mivel a modellnek meg kell győződnie arról, hogy az aktuális eltérés állandó változás, és nem csak véletlenszerű kiugró értékek a riasztás létrehozása előtt. A késés mértéke megegyezik a
changeHistoryLengthparaméterével. A paraméter értékének növelésével a változásészlelési riasztások tartósabb változásokra figyelmeztetnek, de a kompromisszumok hosszabb késést jelentenek.var iidChangePointTransform = iidChangePointEstimator.Fit(CreateEmptyDataView(mlContext));Transform()A metódussal átalakíthatja az adatokat a következő kódDetectChangePoint()hozzáadásával:IDataView transformedData = iidChangePointTransform.Transform(productSales);Ahogyan korábban is tette, alakítsa át erősen
transformedDatagépeltreIEnumerablea könnyebb megjelenítés érdekében aCreateEnumerable()következő kóddal rendelkező metódussal:var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);Hozzon létre egy megjelenítési fejlécet a következő kóddal a
DetectChangePoint()metódus következő soraként:Console.WriteLine("Alert\tScore\tP-Value\tMartingale value");A változáspont-észlelési eredmények között a következő információk jelennek meg:
-
Alertegy adott adatpont változáspontra vonatkozó riasztását jelzi. -
ScoreegyProductSalesadott adatpont értéke az adathalmazban. -
P-ValueA "P" a valószínűség. Minél közelebb van a P-érték 0-hoz, annál valószínűbb, hogy az adatpont anomália. -
Martingale valueA P-értékek sorozatán alapuló adatpont "furcsa" azonosítására szolgál.
-
Iterálja végig az
predictionsIEnumerableeredményt, és jelenítse meg az eredményeket a következő kóddal:foreach (var p in predictions) { if (p.Prediction is not null) { var results = $"{p.Prediction[0]}\t{p.Prediction[1]:f2}\t{p.Prediction[2]:F2}\t{p.Prediction[3]:F2}"; if (p.Prediction[0] == 1) { results += " <-- alert is on, predicted changepoint"; } Console.WriteLine(results); } } Console.WriteLine("");Adja hozzá a következő hívást a metódushoz a
DetectChangepoint()metódus hívásaDetectSpike()után:DetectChangepoint(mlContext, _docsize, dataView);
A pontészlelés eredményeinek módosítása
Az eredményeknek az alábbihoz hasonlónak kell lenniük. A feldolgozás során üzenetek jelennek meg. Megjelenhetnek figyelmeztetések vagy üzenetek feldolgozása. Néhány üzenet el lett távolítva az alábbi eredményekből az egyértelműség kedvéért.
Detect Persistent changes in pattern
=============== Training the model Using Change Point Detection Algorithm===============
=============== End of training process ===============
Alert Score P-Value Martingale value
0 271.00 0.50 0.00
0 150.90 0.00 2.33
0 188.10 0.41 2.80
0 124.30 0.13 9.16
0 185.30 0.47 9.77
0 173.50 0.47 10.41
0 236.80 0.19 24.46
0 229.50 0.27 42.38
1 197.80 0.48 44.23 <-- alert is on, predicted changepoint
0 127.90 0.13 145.25
0 341.50 0.00 0.01
0 190.90 0.48 0.01
0 199.30 0.48 0.00
0 154.50 0.24 0.00
0 215.10 0.42 0.00
0 278.30 0.19 0.00
0 196.40 0.43 0.00
0 292.00 0.17 0.01
0 231.00 0.45 0.00
0 308.60 0.18 0.00
0 294.90 0.19 0.00
0 426.60 0.00 0.00
0 269.50 0.47 0.00
0 347.30 0.21 0.00
0 344.70 0.27 0.00
0 445.40 0.06 0.02
0 320.90 0.49 0.01
0 444.30 0.12 0.02
0 406.30 0.29 0.01
0 442.40 0.21 0.01
0 580.50 0.00 0.01
0 412.60 0.45 0.01
0 687.00 0.01 0.12
0 480.30 0.40 0.08
0 586.30 0.20 0.03
0 651.90 0.14 0.09
Gratulálok! Sikeresen létrehozott gépi tanulási modelleket az értékesítési adatok kiugró értékeinek és változási pont rendellenességeinek észleléséhez.
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Töltse be az adatokat
- A modell betanítása csúcsos anomáliadetektáláshoz
- Kiugró anomáliák észlelése a betanított modellel
- A modell betanítása változáspont-anomáliadetektáláshoz
- Változáspont-anomáliák észlelése a betanított móddal
Következő lépések
Tekintse meg a Machine Learning-mintákat a GitHub-adattárban, és fedezze fel a szezonalitással kapcsolatos adatanomáliadetektálási mintát.