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

Ürün satış verileri için anomali algılama uygulaması derlemeyi öğrenin. Bu öğreticide, Visual Studio'de C# kullanarak bir .NET Core konsol Visual Studio.

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

'daki veri biçimi, başlangıçta DataMarket'den alınan ve Rob Hyndman tarafından oluşturulan Time Series Data Library (TSDL) tarafından sağlanan "Üç Yıllık Dönemde SatışLar" veri product-sales.csv kümesine dayalıdır. DataMarket Varsayılan Açık Lisansı Altında Lisansa Sahip "Üç Yıllık DönemdeKi Satışlar" Veri Kümesi.

Konsol uygulaması oluşturma

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

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

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

  4. Microsoft.ML'i yükleme NuGet Paketi:

    Not

    Bu örnek, aksi belirtilmediği takdirde, belirtilen NuGet paketlerinin en son kararlı sürümünü kullanır.

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

  5. usingAşağıdaki deyimlerini Program.cs dosyanın en üstüne ekleyin:

    using Microsoft.ML;
    using ProductSalesAnomalyDetection;
    

Verilerinizi indirin

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

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

      .csv dosyasını Veri klasörüne kaydetmeyi veya başka bir yere kaydetmeyi.csv * * veri klasörüne taşıyabilirsiniz.

  2. Bu Çözüm Gezgini, Dosya adı dosyasına * sağ.csv özellikler'i seçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeni ise Kopyala olarak değiştirebilirsiniz.

Aşağıdaki tablo, dosyanız tarafından.csv * önizlemedir:

Ay ProductSales
1 Ocak 271
2 Ocak 150.9
..... .....
1-Şub 199.3
..... .....

Sınıflar 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. Yeni Çözüm Gezgini'da projeye sağ tıklayın ve Yeni Öğe'ye >'yi seçin.

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

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

  3. using ProductSalesData.cs öğesinin en üstüne aşağıdaki deyimi ekleyin:

    using Microsoft.ML.Data;
    
  4. Var olan sınıf tanımını kaldırın ve iki sınıfı olan aşağıdaki kodu ProductSalesData ProductSalesPrediction 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 bir giriş veri sınıfı belirtir. LoadColumn özniteliği, veri kümesinde hangi sütunların (sütun dizinine göre) yüklenmeleri gerektiğini belirtir.

    ProductSalesPrediction tahmin veri sınıfını belirtir. Anomali algılama için tahmin bir 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 anomalinin ortaya olma olasılığı o kadar yüksek olur.

  5. En 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ümesine giden yolu içerir.
    • _docsize , veri kümesi dosyasındaki kayıt sayısını içerir. değerini hesaplamak için _docSize kullan. pvalueHistoryLength
  6. Aşağıdaki kodu, bu yolları belirtmek için using deyimleri'nin hemen altına 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şkenini Console.WriteLine("Hello World!") bildirebilmek ve başlatmak için satırı aşağıdaki kodla mlContext 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 işlemi, model oluşturma iş akışı nesneleri arasında paylaşılacak yeni bir mlContext ML.NET ortamı oluşturur. Kavramsal olarak bu, DBContext Entity Framework.

Verileri yükleme

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

  1. Değişken oluşturduk sonra aşağıdaki kodu mlContext 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 bir IDataView döndürür.

Zaman serisi anomali algılama

Anomali algılama beklenmeyen veya olağan dışı olayları veya davranışları bayraklar. Sorunları nerede bu kadar merak ediyor ve "Bu garip mi?" sorusunu yanıtlamanıza yardımcı olur.

"Bu garip mi" anomali algılama örneği.

Anomali algılama, zaman serisi veri aykırılarını algılama işlemidir; , davranışın beklenen davranış veya "garip" olmadığını, verilen bir giriş zaman serisinde olduğunu ifade eder.

Anomali algılama birçok şekilde yararlı olabilir. Örneğin:

Araban varsa, bilmek istiyor olabilirsiniz: Bu petrol ölçer normal mi, yoksa sızıntı mı var? Güç tüketimini izliyorsanız, şunları bilmek istersiniz: Kesinti var mı?

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

  • Ani artışlar, sistemde anormal davranış artışlarını gösteriyor.

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

ML.NET'te 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 uygun. Giriş verilerinizin bir sabit dağıtımdan bağımsız olarak örnek alınan bir veri noktası dizisi olduğunu varsayarlar.

Diğer öğreticilerde yer alan modellerin aksine, zaman serisi anomali algılayıcısı dönüşümleri doğrudan giriş verileri üzerinde çalışır. Yöntemin IEstimator.Fit() dönüştürmeyi üretmek için eğitim verilerine ihtiyacı yok. Ancak boş listesinden oluşturulan bir veri görünümü tarafından sağlanan veri şemasına ihtiyacı ProductSalesData vardır.

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

Ani artış algılama

Ani artış 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 indirgemek için zamanında algılamak önemlidir. Kesintiler, siber saldırılar veya virüslü 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ü, zaman serisi veri kümesinde ani artışlara bir örnektir:

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

CreateEmptyDataView () yöntemi ekleme

Aşağıdaki yöntemi öğesine ekleyin 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);
}

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

Detectani () yöntemini oluşturma

DetectSpike()Yöntemi:

  • Estimator 'dan 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öntemi oluşturun:

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

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

    İpucu

    confidenceVe pvalueHistoryLength parametreleri, ani artışları nasıl algılandığını etkiler. confidence modelinizin ne kadar duyarlı olduğunu belirler. Güvenirlik ne kadar düşükse, algoritmanın "daha küçük" artışlarını algılamamasıdır. pvalueHistoryLengthParametresi, bir kayan penceredeki veri noktalarının sayısını tanımlar. Bu parametrenin değeri genellikle tüm veri kümesinin bir yüzdesidir. Ne kadar düşükse pvalueHistoryLength , model önceki büyük ani artışları unutur.

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

    IDataView transformedData = iidSpikeTransform.Transform(productSales);
    

    Önceki kod, bir veri kümesinin birden çok giriş satırına ilişkin tahminleri yapmak için Transform () yöntemini kullanır.

  5. transformedData IEnumerable Aşağıdaki kodla createsıralanabilir () yöntemini kullanarak daha kolay bir şekilde görüntülenmek üzere bir türü kesin belirlenmiş olarak dönüştürün:

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

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

    Aşağıdaki bilgileri, depo algılama sonuçlarında görüntüleriz:

    • Alert belirli bir veri noktası için ani bir uyarı gösterir.
    • Score , ProductSales veri kümesindeki belirli bir veri noktasının değeridir.
    • P-Value "P" olasılık anlamına gelir. P değerinin 0 olması, büyük olasılıkla veri noktasının bir anomali olması olabilir.
  7. Üzerinde yinelemek predictions IEnumerable ve sonuçları göstermek için aşağıdaki kodu kullanın:

    foreach (var p in predictions)
    {
        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. DetectSpike()Yöntemine yapılan çağrının altındaki yöntemine çağrıyı ekleyin LoadFromTextFile() :

    DetectSpike(mlContext, _docsize, dataView);
    

Depo algılama sonuçları

Sonuçlarınız aşağıdakine benzer olmalıdır. İşlem sırasında iletiler görüntülenir. Uyarıları görebilir veya iletileri işleme alabilirsiniz. Bazı iletiler, açıklık açısından 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 , değerlerin bir zaman serisi olay akışı dağıtımında, düzey değişiklikleri ve eğilimleri gibi kalıcı değişiklikler. Bu kalıcı değişiklikler en son çok daha uzundur spikes ve çok zararlı olay (ler) i gösterebilir. Change points genellikle çıplak göz için görünür değildir, ancak verilerinizde aşağıdaki yöntemde olduğu gibi yaklaşımlar kullanılarak algılanabilir. Aşağıdaki görüntü, değişiklik noktası algılamayı bir örneğidir:

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

DetectChangepoint () metodunu oluşturma

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

  • Estimator 'dan 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. Yöntemi, DetectChangepoint() DetectSpike() aşağıdaki kodu kullanarak yöntem bildiriminden hemen sonra oluşturun:

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

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

    İpucu

    Değişiklik noktalarının algılanması, bir uyarı oluşturmadan önce, modelin geçerli sapmanın kalıcı bir değişiklik olduğundan emin olmak için küçük bir gecikmeyle gerçekleşir. Bu gecikmenin miktarı changeHistoryLength parametreye eşittir. Bu parametrenin değerini artırarak, daha kalıcı değişiklikler üzerinde algılama uyarılarını değiştirin, ancak bir denge daha uzun bir gecikme olur.

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

    IDataView transformedData = iidChangePointTransform.Transform(productSales);
    
  5. Daha önce yaptığınız gibi, transformedData IEnumerable yöntemi aşağıdaki kodla kullanarak daha kolay bir şekilde görüntülenmek üzere kesin bir tür haline dönüştürmeniz gerekir CreateEnumerable() :

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

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

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

    • Alert belirli bir veri noktası için bir değişiklik noktası uyarısı olduğunu gösterir.
    • Score , ProductSales veri kümesindeki belirli bir veri noktasının değeridir.
    • P-Value "P" olasılık anlamına gelir. P değerinin 0 olması, büyük olasılıkla veri noktasının bir anomali olması olabilir.
    • Martingale value , P-değerleri dizisine göre "tuhaf" bir veri noktasının nasıl olduğunu belirlemek için kullanılır.
  7. Üzerinde yineleme predictions IEnumerable yapın ve sonuçları aşağıdaki kodla görüntüleyin:

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

    DetectChangepoint(mlContext, _docsize, dataView);
    

Nokta algılama sonuçlarını değiştirme

Sonuçlarınız aşağıdakine benzer olmalıdır. İşlem sırasında iletiler görüntülenir. Uyarıları görebilir veya iletileri işleme alabilirsiniz. Bazı iletiler, açıklık açısından 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! Artık, satış verilerinde ani artışları ve değişiklik noktası bozukluklarını algılamak için makine öğrenimi 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ğitme
  • Eğitilen modeliyle ani bozukluklar algılama
  • Modeli değişiklik noktası anomali algılama için eğitme
  • Eğitilen mod ile değişiklik noktası bozuklulıkları Algıla

Sonraki adımlar

bir mevsimsellik veri anomali algılama örneğini araştırmak için Machine Learning örneklerine GitHub depoya göz atın.