Aracılığıyla paylaş


Öğretici: ML.NET ile ürün satışlarındaki anomalileri algılama

Ürün satış verileri için anomali algılama uygulaması oluşturmayı öğrenin. Bu öğretici, Visual Studio'da C# kullanarak bir .NET Core konsol uygulaması oluşturur.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Verileri yükleme
  • Ani anomali algılama için dönüşüm oluşturma
  • Dönüşümle ani anomalileri algılama
  • Değişiklik noktası anomali algılaması için dönüşüm oluşturma
  • Dönüştürme ile değişiklik noktası anomalilerini algılama

Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.

Önkoşullar

Not

içindeki product-sales.csv veri biçimi, başlangıçta DataMarket'ten alınan ve Rob Hyndman tarafından oluşturulan Time Series Data Library (TSDL) tarafından sağlanan "Üç Yıllık Dönemde Şampuan Satışları" veri kümesini temel alır. DataMarket Varsayılan Açık Lisansı Kapsamında Lisanslandırılmış "Üç Yıllık Şampuan Satışları" Veri Kümesi.

Konsol uygulaması oluşturma

  1. "ProductSalesAnomalyDetection" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.

  3. Veri kümesi dosyalarınızı kaydetmek için projenizde Data adlı bir dizin oluşturun.

  4. Microsoft.ML NuGet Paketini yükleyin:

    Not

    Bu örnek, aksi belirtilmedikçe belirtilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paket kaynağı olarak "nuget.org" öğesini seçin, Gözat sekmesini seçin, Microsoft.ML arayın ve Yükle düğmesini seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusundaki Tamam düğmesini ve ardından Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin. Microsoft.ML.TimeSeries için bu adımları yineleyin.

  5. Program.cs dosyanızın en üstüne aşağıdaki using deyimleri ekleyin:

    using Microsoft.ML;
    using ProductSalesAnomalyDetection;
    

Verilerinizi indirin

  1. Veri kümesini indirin ve daha önce oluşturduğunuz Veri klasörüne kaydedin:

    • product-sales.csv sağ tıklayın ve "Bağlantıyı (veya Hedefi) Farklı Kaydet..." seçeneğini belirleyin

      *.csv dosyasını Veri klasörüne kaydettiğinizden veya başka bir yere kaydettikten sonra *.csv dosyasını Veri klasörüne taşıdığınızdan emin olun.

  2. Çözüm Gezgini'da *.csv dosyasına sağ tıklayın ve Özellikler'i seçin. Gelişmiş'in altında, Çıkış Dizinine Kopyala değerini Daha yeniyse Kopyala olarak değiştirin.

Aşağıdaki tabloda *.csv dosyanızdan bir veri önizlemesi yer alır:

Ay ProductSales
1-Oca 271
2-Oca 150.9
..... .....
1 Şubat 199.3
..... .....

Sınıf oluşturma ve yolları tanımlama

Ardından giriş ve tahmin sınıfı veri yapılarınızı tanımlayın.

Projenize yeni bir sınıf ekleyin:

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardından Yeni Öğe Ekle'yi >seçin.

  2. Yeni Öğe Ekle iletişim kutusundaSınıf'ı seçin ve Ad alanını ProductSalesData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

    ProductSalesData.cs dosyası kod düzenleyicisinde açılır.

  3. Aşağıdaki using deyimi ProductSalesData.cs dosyasının en üstüne ekleyin:

    using Microsoft.ML.Data;
    
  4. Mevcut sınıf tanımını kaldırın ve ve olmak üzere iki sınıfı ProductSalesDataProductSalesPredictionolan aşağıdaki kodu ProductSalesData.cs dosyasına ekleyin:

    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 giriş veri sınıfını belirtir. LoadColumn özniteliği, veri kümesindeki hangi sütunların (sütun dizinine göre) yüklenmesi gerektiğini belirtir.

    ProductSalesPrediction tahmin veri sınıfını belirtir. Anomali algılama için tahmin, anomali, ham puan ve p değeri olup olmadığını belirten bir uyarıdan oluşur. p değeri 0'a ne kadar yakınsa anomali oluşma olasılığı o kadar artar.

  5. Son indirilen veri kümesi dosya yolunu ve kaydedilen model dosya yolunu tutmak için iki genel alan oluşturun:

    • _dataPath modeli eğitmek için kullanılan veri kümesinin yolunu içerir.
    • _docsize , veri kümesi dosyasındaki kayıt sayısına sahiptir. değerini hesaplamak pvalueHistoryLengthiçin kullanacaksınız_docSize.
  6. Bu yolları belirtmek için aşağıdaki kodu using deyimlerinin hemen altındaki satıra ekleyin:

    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;
    

Değişkenleri başlatma

  1. değişkeni bildirmek Console.WriteLine("Hello World!") ve başlatmak mlContext için satırını aşağıdaki kodla değiştirin:

    MLContext mlContext = new MLContext();
    

    MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve başlatma mlContext işlemi, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext kavramsal olarak benzerdir.

Verileri yükleme

ML.NET'daki veriler bir IDataView arabirimi olarak temsil edilir. IDataView tablosal verileri (sayısal ve metin) açıklamanın esnek ve verimli bir yoludur. Veriler bir metin dosyasından veya başka kaynaklardan (örneğin, SQL veritabanı veya günlük dosyaları) bir IDataView nesneye yüklenebilir.

  1. Değişkeni oluşturduktan mlContext sonra aşağıdaki kodu ekleyin:

    IDataView dataView = mlContext.Data.LoadFromTextFile<ProductSalesData>(path: _dataPath, hasHeader: true, separatorChar: ',');
    

    LoadFromTextFile() veri şemasını tanımlar ve dosyasında okur. Veri yolu değişkenlerini alır ve döndürür IDataView.

Zaman serisi anomali algılama

Anomali algılama beklenmeyen veya olağan dışı olayları veya davranışları işaret eder. Sorunları nerede arayabileceğinize dair ipuçları verir ve "Bu garip mi?" sorusunu yanıtlamanıza yardımcı olur.

Anomali algılama, zaman serisi veri aykırı değerleri algılama işlemidir; , davranışın beklendiği gibi olmadığı veya "garip" olduğu belirli bir giriş zaman serisine işaret eder.

Anomali algılama birçok yönden yararlı olabilir. Örneğin:

Arabanız varsa şunu bilmek isteyebilirsiniz: Bu yağ ölçer normal mi, yoksa sızıntı mı var? Güç tüketimini izliyorsanız şunu bilmek istersiniz: Kesinti var mı?

Algılanabilir iki tür zaman serisi anomalisi vardır:

  • Ani artışlar sistemde geçici anormal davranış artışlarını gösterir.

  • Değişiklik noktaları , sistemde zaman içinde kalıcı değişikliklerin başlangıcını gösterir.

ML.NET'de, IID Ani Artış Algılama veya IID Değişiklik Noktası Algılama algoritmaları bağımsız ve aynı şekilde dağıtılmış veri kümeleri için uygundur. Giriş verilerinizin tek bir sabit dağıtımdan bağımsız olarak örneklenen bir veri noktası dizisi olduğunu varsayarlar.

Diğer öğreticilerdeki modellerden farklı olarak, zaman serisi anomali algılayıcısı dönüşümleri doğrudan giriş verileri üzerinde çalışır. Yöntemin IEstimator.Fit() dönüşümü oluşturmak için eğitim verilerine ihtiyacı yoktur. Ancak, boş bir listesinden oluşturulan bir veri görünümü tarafından sağlanan veri şemasına ProductSalesDataihtiyaç duyar.

Ani artışları ve değişiklik noktalarını algılamak için aynı ürün satış verilerini analiz edersiniz. Bina ve eğitim modeli süreci, ani algılama ve değişiklik noktası algılama için aynıdır; temel fark, kullanılan belirli algılama algoritmasıdır.

Ani artış algılama

Ani algılamanın amacı, zaman serisi veri değerlerinin çoğundan önemli ölçüde farklı olan ani ancak geçici ani artışları belirlemektir. Bu şüpheli nadir öğeleri, olayları veya gözlemleri en aza indirilecek şekilde zamanında algılamak önemlidir. Kesintiler, siber saldırılar veya viral web içeriği gibi çeşitli anomalileri algılamak için aşağıdaki yaklaşım kullanılabilir. Aşağıdaki görüntüde bir zaman serisi veri kümesindeki ani artışlara örnek verilmiştir:

İki ani artış algılaması gösteren ekran görüntüsü.

CreateEmptyDataView() yöntemini ekleme

aşağıdaki yöntemi içine Program.csekleyin:

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);
}

, CreateEmptyDataView() yöntemine giriş IEstimator.Fit() olarak kullanılacak doğru şemaya sahip boş bir veri görünümü nesnesi üretir.

DetectSpike() yöntemini oluşturma

DetectSpike() yöntemi:

  • Tahmin aracından dönüşümü oluşturur.
  • Geçmiş satış verilerine göre ani artışları algılar.
  • Sonuçları görüntüler.
  1. DetectSpike() Aşağıdaki kodu kullanarak Program.cs dosyasının en altında yöntemini oluşturun:

    DetectSpike(MLContext mlContext, int docSize, IDataView productSales)
    {
    
    }
    
  2. Modeli ani algılama için eğitmek için IidSpikeEstimator'ı kullanın. Aşağıdaki DetectSpike() kodla yöntemine ekleyin:

    var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95d, pvalueHistoryLength: docSize / 4);
    
  3. Yönteminin sonraki kod satırı olarak aşağıdakileri ekleyerek ani algılama dönüşümünü DetectSpike() oluşturun:

    İpucu

    confidence ve pvalueHistoryLength parametreleri ani artışların nasıl algılandığından etkilenir. confidence modelinizin ani artışlara karşı ne kadar hassas olduğunu belirler. Güvenilirlik ne kadar düşük olursa algoritmanın "daha küçük" ani artışları algılama olasılığı da o kadar yüksektir. pvalueHistoryLength parametresi, kayan penceredeki veri noktalarının sayısını tanımlar. Bu parametrenin değeri genellikle veri kümesinin tamamının yüzdesidir. ne kadar düşük olursa pvalueHistoryLengthmodel önceki büyük ani artışları o kadar hızlı unutur.

    ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));
    
  4. Verileri yönteminde sonraki satır olarak dönüştürmek productSales için aşağıdaki kod satırını DetectSpike() ekleyin:

    IDataView transformedData = iidSpikeTransform.Transform(productSales);
    

    Önceki kod, bir veri kümesinin birden çok giriş satırı için tahminlerde bulunmak için Transform() yöntemini kullanır.

  5. Aşağıdaki kodla CreateEnumerable() yöntemini kullanarak öğesini daha kolay görüntülemek için öğesini transformedData kesin olarak belirlenmiş IEnumerable bir türe dönüştürün:

    var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);
    
  6. Aşağıdaki Console.WriteLine() kodu kullanarak bir görüntüleme üst bilgisi satırı oluşturun:

    Console.WriteLine("Alert\tScore\tP-Value");
    

    Ani algılama sonuçlarınızda aşağıdaki bilgileri görüntüleyeceksiniz:

    • Alert belirli bir veri noktası için ani bir uyarıyı gösterir.
    • Score , veri kümesindeki ProductSales belirli bir veri noktasının değeridir.
    • P-Value "P" olasılık anlamına gelir. p değeri 0'a ne kadar yakınsa, veri noktasının anomali olma olasılığı o kadar yüksektir.
  7. öğesini yinelemek predictionsIEnumerable ve sonuçları görüntülemek için aşağıdaki kodu kullanın:

    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. yönteminin çağrısının DetectSpike() altına yöntemini ekleyin LoadFromTextFile() :

    DetectSpike(mlContext, _docsize, dataView);
    

Ani algılama sonuçları

Sonuçlarınız aşağıdakine benzer olmalıdır. İşleme sırasında iletiler görüntülenir. Uyarılar görebilir veya iletileri işleyebilirsiniz. Bazı iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.

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

Değişiklik noktası algılama

Change points düzey değişiklikleri ve eğilimler gibi değerlerin zaman serisi olay akışı dağılımındaki kalıcı değişikliklerdir. Bu kalıcı değişiklikler çok daha spikes uzun sürer ve yıkıcı olayları gösterebilir. Change points genellikle çıplak gözle görülemez, ancak aşağıdaki yöntemde olduğu gibi yaklaşımlar kullanılarak verilerinizde algılanabilir. Aşağıdaki görüntüde değişiklik noktası algılama örneği verilmiştir:

Değişiklik noktası algılamayı gösteren ekran görüntüsü.

DetectChangepoint() yöntemini oluşturma

DetectChangepoint() yöntemi aşağıdaki görevleri yürütür:

  • Tahmin aracından dönüşümü oluşturur.
  • Geçmiş satış verilerine göre değişiklik noktalarını algılar.
  • Sonuçları görüntüler.
  1. DetectChangepoint() Aşağıdaki kodu kullanarak yöntem bildiriminden DetectSpike() hemen sonra yöntemini oluşturun:

    void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales)
    {
    
    }
    
  2. yönteminde aşağıdaki kodla iidChangePointEstimator'ıDetectChangepoint() oluşturun:

    var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95d, changeHistoryLength: docSize / 4);
    
  3. Daha önce yaptığınız gibi yöntemine aşağıdaki kod DetectChangePoint() satırını ekleyerek tahmin aracından dönüşümü oluşturun:

    İpucu

    Modelin uyarı oluşturmadan önce yalnızca bazı rastgele ani artışlar değil, geçerli sapmanın kalıcı bir değişiklik olduğundan emin olması gerektiğinden, değişiklik noktalarının algılanması hafif bir gecikmeyle gerçekleşir. Bu gecikmenin miktarı parametresine changeHistoryLength eşittir. Bu parametrenin değerini artırarak, daha kalıcı değişikliklerle ilgili değişiklik algılama uyarıları, ancak denge daha uzun bir gecikme olacaktır.

    var iidChangePointTransform = iidChangePointEstimator.Fit(CreateEmptyDataView(mlContext));
    
  4. Transform() aşağıdaki kodu 'a ekleyerek verileri dönüştürmek için DetectChangePoint()yöntemini kullanın:

    IDataView transformedData = iidChangePointTransform.Transform(productSales);
    
  5. Daha önce yaptığınız gibi, aşağıdaki kodla yöntemini kullanarak daha kolay görüntülenmesi için öğesini transformedData kesin olarak belirlenmiş IEnumerable bir görüntüye CreateEnumerable()dönüştürün:

    var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);
    
  6. yönteminde sonraki satır DetectChangePoint() olarak aşağıdaki kodla bir görüntüleme üst bilgisi oluşturun:

    Console.WriteLine("Alert\tScore\tP-Value\tMartingale value");
    

    Değişiklik noktası algılama sonuçlarınızda aşağıdaki bilgileri görüntüleyeceksiniz:

    • Alert belirli bir veri noktası için bir değişiklik noktası uyarısı gösterir.
    • Score , veri kümesindeki ProductSales belirli bir veri noktasının değeridir.
    • P-Value "P" olasılık anlamına gelir. P değeri 0'a ne kadar yakınsa, veri noktasının anomali olma olasılığı o kadar yüksektir.
    • Martingale value , P değerleri dizisine göre bir veri noktasının ne kadar "garip" olduğunu tanımlamak için kullanılır.
  7. öğesini yineleyin predictionsIEnumerable ve sonuçları aşağıdaki kodla görüntüleyin:

    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. yöntemine DetectChangepoint()yapılan çağrıdan sonra yöntemine aşağıdaki çağrıyı DetectSpike() ekleyin:

    DetectChangepoint(mlContext, _docsize, dataView);
    

Değişiklik noktası algılama sonuçları

Sonuçlarınız aşağıdakine benzer olmalıdır. İşleme sırasında iletiler görüntülenir. Uyarılar görebilir veya iletileri işleyebilirsiniz. Bazı iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.

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

Tebrikler! Satış verilerindeki ani artışları ve değişiklik noktası anomalilerini algılamak için makine öğrenmesi modellerini başarıyla oluşturdunuz.

Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.

Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:

  • Verileri yükleme
  • Modeli ani anomali algılama için eğitin
  • Eğitilen modelle ani anomalileri algılama
  • Modeli değişiklik noktası anomali algılaması için eğitin
  • Eğitilmiş modla değişiklik noktası anomalilerini algılama

Sonraki adımlar

Mevsimsellik verileri anomali algılama örneğini keşfetmek için Machine Learning örnekleri GitHub deposuna göz atın.