Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ürün satış verileri için anomali algılama uygulaması oluşturmayı öğrenin. Bu öğretici, Visual Studio'da C# kullanarak bir .NET konsol uygulaması oluşturur.
Bu eğitimde şunları öğreniyorsunuz:
- Verileri yükleme
- Ani anomali algılama için dönüşüm oluşturma
- Dönüşümle ani anomalileri algılama
- Değişim noktası anomali algılama için dönüştürücü oluşturma
- Dönüşüm yöntemiyle değişim noktası anomalilerini tespit etme
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Önkoşullar
Visual Studio 2022 veya daha yenisi ile .NET Masaüstü Geliştirme iş yükü yüklü.
Uyarı
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 lisanslı "Üç Yıllık Şampuan Satışları" veri kümesi.
Konsol uygulaması oluşturma
"ProductSalesAnomalyDetection" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.
Veri kümesi dosyalarınızı kaydetmek için projenizde Data adlı bir dizin oluşturun.
Microsoft.ML NuGet Paketini yükleyin:
Uyarı
Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.
Çözüm Gezgini'nde 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'yi seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusunda 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.
usingdosyanızın en üstüne aşağıdaki yönergeleri ekleyin:using Microsoft.ML; using ProductSalesAnomalyDetection;
Verilerinizi indirin
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 emin olun veya başka bir yere kaydettikten sonra *.csv dosyasını Veri klasörüne taşıyın.
Çözüm Gezgini'nde *.csv dosyasına sağ tıklayın ve Özellikler'i seçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeniyse kopyala olarak değiştirin.
Aşağıdaki tabloda *.csv dosyanızdaki 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:
Çözüm Gezgini'nde projeye sağ tıklayın ve ardından Yeni Öğe Ekle'yi >seçin.
Yeni Öğe Ekle iletişim kutusundaSınıf'ı seçin ve Ad alanını ProductSalesData.cs olarak değiştirin. Ardından Ekle'yi seçin.
ProductSalesData.cs dosyası kod düzenleyicisinde açılır.
aşağıdaki
usingyönergeyi ProductSalesData.cs en üstüne ekleyin:using Microsoft.ML.Data;Mevcut sınıf tanımını kaldırın ve
ProductSalesDataveProductSalesPredictionolmak üzere iki sınıfa sahip olan 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; } }ProductSalesDatabir giriş veri sınıfı belirtir. LoadColumn özniteliği, veri kümesindeki hangi sütunların (sütun dizinine göre) yüklenmesi gerektiğini belirtir.ProductSalesPredictiontahmin 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.Son indirilen veri kümesi dosya yolunu ve kaydedilen model dosya yolunu tutmak için iki genel alan oluşturun:
-
_dataPathmodeli eğitmek için kullanılan veri kümesinin yolunu içerir. -
_docsizeveri kümesi dosyasındaki kayıt sayısını içerir. öğesini hesaplamak_docSizeiçin kullanacaksınızpvalueHistoryLength.
-
Bu yolları belirtmek için yönergelerin hemen altındaki
usingsatıra aşağıdaki kodu 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
Console.WriteLine("Hello World!")değişkeni bildirmek ve başlatmakmlContextiçin satırı 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
mlContextişlemi, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekineDBContextbenzer, kavramsal olarak.
Verileri yükleme
ML.NET'deki veriler 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.
Değişkeni oluşturduktan
mlContextsonra aşağıdaki kodu ekleyin:IDataView dataView = mlContext.Data.LoadFromTextFile<ProductSalesData>(path: _dataPath, hasHeader: true, separatorChar: ',');LoadFromTextFile() veri şemasını tanımlar ve dosyada okur. Veri yolu değişkenlerini alır ve
IDataViewdöndürür.
Zaman serisi anomali algılama
Anomali algılama beklenmeyen veya olağan dışı olayları veya davranışları işaret eder. Sorunların nerede aranacağı konusunda ipuçları verir ve "Bu garip mi?" sorusunu yanıtlamanıza yardımcı olur.
Anomali algılama, zaman serisi verilerindeki aykırı değerleri algılama işlemidir; bu, belirli bir giriş zaman serisindeki beklenmeyen ya da "garip" olan noktaları ifade eder.
Anomali algılama birçok şekilde 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 noktaları 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, ProductSalesData boş listesinden oluşturulan bir veri görünümü tarafından sağlanan veri şemasına yine de ihtiyaç 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 artış 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 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 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ü, zaman serisi veri kümesindeki ani artışlara bir örnektir:
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);
}
yöntemine CreateEmptyDataView() giriş IEstimator.Fit() olarak kullanılacak doğru şemaya sahip boş bir veri görünümü nesnesi oluşturur.
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.
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) { }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);Aşağıdaki kodu
DetectSpike()yönteminde sonraki satır olarak ekleyerek ani artış algılama dönüşümünü oluşturun.Tavsiye
confidencevepvalueHistoryLengthparametreleri ani artışların algılanan şeklini etkiler.confidencemodelinizin ani artışlara ne kadar duyarlı olduğunu belirler. Güvenilirlik ne kadar düşükse, algoritmanın "küçük" ani artışları algılama olasılığı o kadar yüksektir. parametresi kayanpvalueHistoryLengthpenceredeki 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 olursapvalueHistoryLengthmodel önceki büyük ani artışları o kadar hızlı unutur.ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));Aşağıdaki kod satırını ekleyerek verileri yönteminde bir sonraki satır olarak dönüştürün
productSalesDetectSpike():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.
Aşağıdaki kodla
transformedDatayöntemini kullanarak daha kolay görüntülenmesi için öğesiniIEnumerablekesin olarak belirlenmiş bir türe dönüştürün:var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);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 artış algılama sonuçlarınızda aşağıdaki bilgileri görüntüleyeceksiniz:
-
Alertbelirli bir veri noktası için ani uyarıyı gösterir. -
Scoreveri kümesindekiProductSalesbelirli 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ığı da o kadar artar.
-
Aşağıdaki kodu kullanarak
predictionsIEnumerableöğesini yineleyin ve sonuçları 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}"; if (p.Prediction[0] == 1) { results += " <-- Spike detected"; } Console.WriteLine(results); } } Console.WriteLine("");yönteminin çağrısının
DetectSpike()altına yöntemini ekleyinLoadFromTextFile():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ı olaylara işaret edebilir.
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ü, bir değişiklik noktası algılama örneğidir:
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.
DetectChangepoint()Aşağıdaki kodu kullanarak yöntem bildirimindenDetectSpike()hemen sonra yöntemini oluşturun:void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales) { }iidChangePointEstimator oluşturmak için yöntemde
DetectChangepoint()aşağıdaki kodu kullanın:var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95d, changeHistoryLength: docSize / 4);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:Tavsiye
Modelin uyarı oluşturmadan önce yalnızca 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
changeHistoryLengtheş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));Transform()aşağıdaki kodu 'a ekleyerek verileri dönüştürmek içinDetectChangePoint()yöntemini kullanın:IDataView transformedData = iidChangePointTransform.Transform(productSales);Daha önce yaptığınız gibi, aşağıdaki kodla yöntemini kullanarak
transformedDatadaha kolay görüntülenmesi için öğesiniIEnumerablekesin olarak yazılanCreateEnumerable()bir türe dönüştürün:var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);DetectChangePoint()yönteminde bir sonraki satır olarak, aşağıdaki kod ile bir ekran başlığı 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:
-
Alertbelirli bir veri noktası için bir değişiklik noktası uyarısı gösterir. -
Scoreveri kümesindekiProductSalesbelirli bir veri noktasının değeridir. -
P-Value"P" olasılık anlamına gelir. P değeri 0'a ne kadar yakın olursa, veri noktasının anomali olma olasılığı da o kadar artar. -
Martingale value, P değerleri dizisine göre bir veri noktasının ne kadar "garip" olduğunu belirlemek için kullanılır.
-
aracılığıyla yineleme yapın
predictionsIEnumerableve 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("");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ılacağı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.