Öğ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
Visual Studio ".NET Masaüstü Geliştirme" iş yükünün yüklü olduğu 2022'ye tıklayın.
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
"ProductSalesAnomalyDetection" adlı bir C# Konsol Uygulaması oluşturun. Sonraki düğmesine tıklayın.
Çerçeve olarak .NET 6'yi seçin. Oluştur düğmesine tıklayın.
Veri kümesi dosyalarınızı kaydetmek için projenize Data adlı bir dizin oluşturun.
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.
usingAşağıdaki deyimlerini Program.cs dosyanın en üstüne ekleyin:using Microsoft.ML; using ProductSalesAnomalyDetection;
Verilerinizi indirin
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.
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:
Yeni Çözüm Gezgini'da projeye sağ tıklayın ve Yeni Öğe'ye >'yi seçin.
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.
usingProductSalesData.cs öğesinin en üstüne aşağıdaki deyimi ekleyin:using Microsoft.ML.Data;Var olan sınıf tanımını kaldırın ve iki sınıfı olan aşağıdaki kodu
ProductSalesDataProductSalesPredictionProductSalesData.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; } }ProductSalesDatabir 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.ProductSalesPredictiontahmin 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.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_docSizekullan.pvalueHistoryLength
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
değişkenini
Console.WriteLine("Hello World!")bildirebilmek ve başlatmak için satırı aşağıdaki kodlamlContextdeğ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
mlContextML.NET ortamı oluşturur. Kavramsal olarak bu,DBContextEntity 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.
Değişken oluşturduk sonra aşağıdaki kodu
mlContextekleyin: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
IDataViewdö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.

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:

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.
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) { }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);Yöntemine sonraki kod satırı olarak aşağıdakini ekleyerek depo algılama dönüşümü oluşturun
DetectSpike():İpucu
confidenceVepvalueHistoryLengthparametreleri, ani artışları nasıl algılandığını etkiler.confidencemodelinizin 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üşüksepvalueHistoryLength, model önceki büyük ani artışları unutur.ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));Aşağıdaki kod satırını,
productSalesyönteminin bir sonraki satırı olarak dönüştürmek için ekleyinDetectSpike():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.
transformedDataIEnumerableAş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);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:
Alertbelirli bir veri noktası için ani bir uyarı gösterir.Score,ProductSalesveri 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.
Üzerinde yinelemek
predictionsIEnumerableve 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("");DetectSpike()Yöntemine yapılan çağrının altındaki yöntemine çağrıyı ekleyinLoadFromTextFile():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:

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.
Yöntemi,
DetectChangepoint()DetectSpike()aşağıdaki kodu kullanarak yöntem bildiriminden hemen sonra oluşturun:void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales) { }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);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ı
changeHistoryLengthparametreye 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));Transform()Aşağıdaki kodu öğesine ekleyerek verileri dönüştürmek için yöntemini kullanınDetectChangePoint():IDataView transformedData = iidChangePointTransform.Transform(productSales);Daha önce yaptığınız gibi,
transformedDataIEnumerableyöntemi aşağıdaki kodla kullanarak daha kolay bir şekilde görüntülenmek üzere kesin bir tür haline dönüştürmeniz gerekirCreateEnumerable():var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);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:
Alertbelirli bir veri noktası için bir değişiklik noktası uyarısı olduğunu gösterir.Score,ProductSalesveri 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.
Üzerinde yineleme
predictionsIEnumerableyapı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("");DetectChangepoint()Yöntemine yapılan çağrıdan sonra yöntemine aşağıdaki çağrıyı ekleyinDetectSpike():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.