Megosztás a következőn keresztül:


Oktatóanyag: A termékértékesítések rendellenességeinek észlelése ML.NET

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

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

  1. Hozzon létre egy "ProductSalesAnomalyDetection" nevű C# -konzolalkalmazást . Kattintson a Tovább gombra.

  2. Válassza a .NET 8-at a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.

  3. Hozzon létre egy Data nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.

  4. 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.

  5. Adja hozzá a következő using irányelveket a Program.cs fájl tetején:

    using Microsoft.ML;
    using ProductSalesAnomalyDetection;
    

Töltsd le adataidat

  1. 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.

  2. 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:

  1. A Megoldáskezelőben kattintson a jobb gombbal a projektre, majd válassza az Új elem hozzáadása lehetőséget>.

  2. 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.

  3. Adja hozzá a következő using irányelvet a ProductSalesData.cs elejéhez:

    using Microsoft.ML.Data;
    
  4. 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 és ProductSalesPredictiona 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; }
    }
    

    ProductSalesData egy 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.

    ProductSalesPrediction az 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.

  5. 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:

    • _dataPath rendelkezik a modell betanítása során használt adatkészlet elérési útjára.
    • _docsize az adathalmazfájl rekordjainak száma. A számításhoz _docSizea következőt fogja használnipvalueHistoryLength:
  6. Adja hozzá a következő kódot az irányelvek alatti sorhoz az using elé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

  1. 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ához mlContext :

    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 Frameworkhez DBContext .

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.

  1. Adja hozzá a következő kódot a mlContext vá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?".

Példa a

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:

Képernyőkép két kiugró észlelésről.

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.
  1. 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)
    {
    
    }
    
  2. 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);
    
  3. 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 confidence paraméterek és pvalueHistoryLength a paraméterek hatással vannak a csúcsok észlelésére. confidence meghatá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. A pvalueHistoryLength paramé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));
    
  4. Adja hozzá a következő kódsort az productSales adatok a metódus következő soraként DetectSpike() 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.

  5. transformedData A IEnumerable metó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);
    
  6. 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:

    • Alert egy adott adatpont kiugró riasztását jelzi.
    • Score egy ProductSales adott adatpont értéke az adathalmazban.
    • P-Value A "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.
  7. Az alábbi kóddal végignézheti a predictionsIEnumerable elemeket, é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("");
    
  8. Adja hozzá a hívást a DetectSpike() metódushoz a hívás alatti metódushoz LoadFromTextFile() :

    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 változáspont-észlelést bemutató képernyőkép.

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.
  1. Hozza létre a metódust DetectChangepoint() a metódus deklarációja DetectSpike() után a következő kóddal:

    void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales)
    {
    
    }
    
  2. 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);
    
  3. 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 changeHistoryLength paramé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));
    
  4. Transform() A metódussal átalakíthatja az adatokat a következő kód DetectChangePoint()hozzáadásával:

    IDataView transformedData = iidChangePointTransform.Transform(productSales);
    
  5. Ahogyan korábban is tette, alakítsa át erősen transformedData gépeltre IEnumerable a könnyebb megjelenítés érdekében a CreateEnumerable()következő kóddal rendelkező metódussal:

    var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);
    
  6. 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:

    • Alert egy adott adatpont változáspontra vonatkozó riasztását jelzi.
    • Score egy ProductSales adott adatpont értéke az adathalmazban.
    • P-Value A "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 value A P-értékek sorozatán alapuló adatpont "furcsa" azonosítására szolgál.
  7. Iterálja végig az predictionsIEnumerable eredmé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("");
    
  8. Adja hozzá a következő hívást a metódushoz a DetectChangepoint()metódus hívása DetectSpike() 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.