öğretici: ML .net ile birden çok lass sınıflandırması kullanarak destek sorunlarını kategorilere ayırma
bu örnek öğreticide, Visual Studio ' de C# kullanarak bir .net Core konsol uygulaması aracılığıyla bir GitHub sorunu için alan etiketini sınıflandıran ve tahmin eden bir modeli eğiten ML .net kullanarak GitHub bir sorun sınıflandırıcı oluşturma
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Verilerinizi hazırlama
- Verileri dönüştürme
- Modeli eğitme
- Modeli değerlendirme
- Eğitilen modelle birlikte tahmin edin
- Yüklü bir modelle dağıtım ve tahmin etme
Bu öğreticinin kaynak kodunu DotNet/Samples deposunda bulabilirsiniz.
Önkoşullar
- ".net masaüstü geliştirme" iş yükü yüklüyken 2022 Visual Studio .
- GitHub, sekmeyle ayrılmış dosya (issues_train. tsv) ile karşılaşır.
- GitHub, test sekmeyle ayrılmış dosyası (issues_test. tsv) yayınlar.
Konsol uygulaması oluşturma
Proje oluşturma
"Githubıssueclassıflıfor" adlı bir C# konsol uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 6 ' yı seçin. Oluştur düğmesine tıklayın.
Veri kümesi dosyalarınızı kaydetmek için projenizde veri adlı bir dizin oluşturun:
Çözüm Gezgini, projenize sağ tıklayın ve > Yeni klasör Ekle ' yi seçin. "Data" yazın ve ENTER tuşuna basın.
Modelinize kaydetmek için projenizde modeller adlı bir dizin oluşturun:
Çözüm Gezgini, projenize sağ tıklayın ve > Yeni klasör Ekle ' yi seçin. "Modeller" yazın ve ENTER tuşuna basın.
Microsoft. ml 'yi yükler NuGet paketi:
Not
Bu örnek, aksi belirtilmediği takdirde, belirtilen NuGet paketlerinin en son kararlı sürümünü kullanır.
Çözüm Gezgini, projenize sağ tıklayın ve NuGet paketlerini yönet' i seçin. paket kaynağı olarak "nuget.org" öğesini seçin, araştır sekmesini seçin, Microsoft. ML araması yapın ve Install düğmesini seçin. Değişiklikleri Önizle Iletişim kutusunda Tamam düğmesini seçin ve ardından listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans kabulü iletişim kutusunda kabul ediyorum düğmesini seçin.
Verilerinizi hazırlama
İssues_train. tsv ve issues_test. tsv veri kümelerini indirin ve daha önce oluşturulan veri klasörüne kaydedin. Makine öğrenimi modelini ve ikincisini gösteren ilk veri kümesi, modelinizin ne kadar doğru olduğunu değerlendirmek için kullanılabilir.
Çözüm Gezgini,. tsv dosyalarının her birine 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.
Sınıf oluşturma ve yollar tanımlama
Aşağıdaki ek using deyimlerini program. cs dosyasının en üstüne ekleyin:
using Microsoft.ML;
using GitHubIssueClassification;
Son indirilen dosyaları ve,, ve için genel değişkenleri tutmak üzere üç genel alan oluşturun MLContext DataView PredictionEngine :
_trainDataPath, modeli eğitmek için kullanılan veri kümesinin yolunu içerir._testDataPath, modeli değerlendirmek için kullanılan veri kümesinin yoluna sahiptir._modelPathEğitim modelinin kaydedildiği yolu içerir._mlContext, MLContext işleme bağlamı sağlar._trainingDataView, IDataView eğitim veri kümesini işlemek için kullanılır._predEngine, PredictionEngine<TSrc,TDst> tek tahminlerde kullanılır.
Aşağıdaki kodu, bu yolları ve diğer değişkenleri belirtmek için using deyimlerinin hemen altındaki satıra ekleyin:
string _appPath = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
string _trainDataPath = Path.Combine(_appPath, "..", "..", "..", "Data", "issues_train.tsv");
string _testDataPath = Path.Combine(_appPath, "..", "..", "..", "Data", "issues_test.tsv");
string _modelPath = Path.Combine(_appPath, "..", "..", "..", "Models", "model.zip");
MLContext _mlContext;
PredictionEngine<GitHubIssue, IssuePrediction> _predEngine;
ITransformer _trainedModel;
IDataView _trainingDataView;
Giriş verileriniz ve tahminlerinizi için bazı sınıflar oluşturun. Projenize yeni bir sınıf ekleyin:
Çözüm Gezgini, projeye sağ tıklayın ve ardından > Yeni öğe Ekle ' yi seçin.
Yeni öğe Ekle Iletişim kutusunda sınıf ' ı seçin ve ad alanını githubıssuedata. cs olarak değiştirin. Sonra Ekle düğmesini seçin.
Githubıssuedata. cs dosyası kod düzenleyicisinde açılır.
usingGithubıssuedata. cs' nin üst kısmına aşağıdaki ifadeyi ekleyin:
using Microsoft.ML.Data;
Mevcut sınıf tanımını kaldırın ve iki sınıfa sahip olan aşağıdaki kodu GitHubIssue ve IssuePrediction Githubıssuedata. cs dosyasına ekleyin:
public class GitHubIssue
{
[LoadColumn(0)]
public string ID { get; set; }
[LoadColumn(1)]
public string Area { get; set; }
[LoadColumn(2)]
public string Title { get; set; }
[LoadColumn(3)]
public string Description { get; set; }
}
public class IssuePrediction
{
[ColumnName("PredictedLabel")]
public string Area;
}
labelTahmin etmek istediğiniz sütundur. FeaturesEtiketi tahmin etmek için modele verdiğiniz girişler tanımlanmıştır.
Veri kümesindeki kaynak sütunlarının dizinlerini belirtmek için LoadColumnAttribute kullanın.
GitHubIssue , giriş veri kümesi sınıfıdır ve aşağıdaki alanlara sahiptir String :
- ilk sütun
ID(GitHub sorun kimliği) - ikinci sütun
Area(eğitim tahmini) - üçüncü sütun
Title(GitHub sorun başlığı)featuretahmin için ilk kullanılanArea - dördüncü sütun
Description, şunu tahmin etmekfeatureiçin kullanılan ikincininArea
IssuePrediction , model eğitilen bir tahmin için kullanılan sınıftır. Tek bir string ( Area ) ve PredictedLabel ColumnName özniteliği vardır. , PredictedLabel Tahmin ve değerlendirme sırasında kullanılır. Değerlendirme için eğitim verileri olan bir giriş, tahmin edilen değerler ve model kullanılır.
tüm ML .net işlemleri mlcontext sınıfında başlar. başlatma mlContext , model oluşturma iş akışı nesneleri genelinde paylaşılabilen yeni bir ML .net ortamı oluşturur. Kavramsal olarak, ' de ' ye DBContext benzer Entity Framework .
Değişkenleri Başlat
_mlContext MLContext seed: 0 Birden çok harekette tekrarlanabilir/belirleyici sonuçlar için rastgele bir çekirdek () ile birlikte, genel değişkeni yeni bir örneği ile başlatın. Console.WriteLine("Hello World!")Satırı aşağıdaki kodla değiştirin:
_mlContext = new MLContext(seed: 0);
Verileri yükleme
ML .net, sayısal veya metin tablolu verileri tanımlamaya yönelik esnek ve verimli bir yöntem olarak ıdataview arabirimini kullanır. IDataViewmetin dosyalarını veya gerçek zamanlı olarak yükleyebilir (örneğin, SQL veritabanı veya günlük dosyaları).
_trainingDataViewGenel değişkeni, işlem hattı için kullanmak üzere başlatmak ve yüklemek için, başlangıçtan sonra aşağıdaki kodu ekleyin mlContext :
_trainingDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_trainDataPath,hasHeader: true);
Loadfromtextfile () , veri şemasını ve dosyadaki okumaları tanımlar. Veri yolu değişkenlerini alır ve döndürür IDataView .
Yöntemini çağırdıktan sonra aşağıdakileri ekleyin LoadFromTextFile() :
var pipeline = ProcessData();
ProcessDataYöntemi aşağıdaki görevleri yürütür:
- Verileri ayıklar ve dönüştürür.
- İşlem ardışık düzenini döndürür.
ProcessDataAşağıdaki kodu kullanarak program. cs dosyasının en altında yöntemi oluşturun:
IEstimator<ITransformer> ProcessData()
{
}
Özellikleri Ayıkla ve verileri Dönüştür
alan GitHub etiketini tahmin etmek istediğinizde GitHubIssue , sütunu sayısal anahtar türü sütununa dönüştürmek için mapvaluetokey () yöntemini kullanın Area Label (sınıflandırma algoritmaları tarafından kabul edilen bir biçim) ve yeni bir veri kümesi sütunu olarak ekleyin:
var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Area", outputColumnName: "Label")
Sonra, mlContext.Transforms.Text.FeaturizeText metin ( Title ve Description ) sütunlarını, ve olarak çağrılan her bir sayısal vektöre dönüştüren çağırın TitleFeaturized DescriptionFeaturized . Aşağıdaki kodla, her iki sütun için de işlem hattına bir şekilde ekleyin:
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Title", outputColumnName: "TitleFeaturized"))
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Description", outputColumnName: "DescriptionFeaturized"))
Veri hazırlığında son adım, Birleştir () yöntemini kullanarak tüm özellik sütunlarını Özellikler sütunuyla birleştirir. Varsayılan olarak, bir öğrenme algoritması yalnızca Özellikler sütunundaki özellikleri işler. Aşağıdaki kodla bu dönüşümü işlem hattına ekleyin:
.Append(_mlContext.Transforms.Concatenate("Features", "TitleFeaturized", "DescriptionFeaturized"))
Daha sonra, AppendCacheCheckpoint verileri birden çok kez yinelemek Için DataView öğesini önbelleğe almak için bir ekleyin, aşağıdaki kodda olduğu gibi daha iyi bir performans alabilir:
.AppendCacheCheckpoint(_mlContext);
Uyarı
Eğitim süresini azaltmak için küçük/orta veri kümeleri için AppendCacheCheckpoint kullanın. Bunu kullanmayın (kaldırın. Çok büyük veri kümelerini işlerken AppendCacheCheckpoint ()).
Yöntemin sonundaki işlem hattını döndürün ProcessData .
return pipeline;
Bu adım ön işleme/korleştirme gerçekleştirir. ML .net ' te kullanılabilen ek bileşenleri kullanmak modelinizle daha iyi sonuçlar sağlayabilir.
Model oluşturma ve eğitme
Yöntemine yapılan BuildAndTrainModel çağrıdan sonraki satır olarak yöntemine aşağıdaki çağrıyı ekleyin ProcessData() :
var trainingPipeline = BuildAndTrainModel(_trainingDataView, pipeline);
BuildAndTrainModelYöntemi aşağıdaki görevleri yürütür:
- Eğitim algoritması sınıfını oluşturur.
- Modeli TRAIN.
- Eğitim verilerine göre alanı tahmin eder.
- Modeli döndürür.
Yöntemi, BuildAndTrainModel aşağıdaki kodu kullanarak, yönteminin bildiriminden hemen sonra oluşturun ProcessData() :
IEstimator<ITransformer> BuildAndTrainModel(IDataView trainingDataView, IEstimator<ITransformer> pipeline)
{
}
Sınıflandırma görevi hakkında
Sınıflandırma, bir öğe veya veri satırının kategorisini, türünü veya sınıfını tespit etmek için verileri kullanan bir makine öğrenimi görevi ve genellikle aşağıdaki türlerden biridir:
- İkili: A veya B.
- Birden çok sınıf: tek bir model kullanılarak tahmin edilebilir birden fazla kategori.
Bu tür bir sorun için, tek bir Lass sınıflandırma öğrenme algoritması kullanın, çünkü sorun kategorisi tahmininizde yalnızca iki (ikili) yerine birden çok kategori (birden çok Lass) olabilir.
' Deki ilk kod satırı olarak aşağıdakileri ekleyerek makine öğrenimi algoritmasını veri dönüştürme tanımlarına ekleyin BuildAndTrainModel() :
var trainingPipeline = pipeline.Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
.Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
Sdcamaximumentropi , birden çok Lass sınıflandırma eğitim algoritmadır. Bu öğesine eklenir pipeline ve Title Description Features Label Geçmiş verilerden öğrenme ve () ve giriş parametrelerini kabul eder.
Modeli eğitme
splitTrainSetYöntemine bir sonraki kod satırı olarak aşağıdakileri ekleyerek modeli verilere sığdırın ve eğitilen modeli döndürün BuildAndTrainModel() :
_trainedModel = trainingPipeline.Fit(trainingDataView);
Fit()Yöntemi, veri kümesini dönüştürerek ve eğitimi uygulayarak modelinizi trakla.
PredictionEngine , tek bir veri örneği üzerinde bir tahmin gerçekleştirmenizi ve daha sonra bir tahmin gerçekleştirmenizi sağlayan KULLANıŞLı bir API 'dir. Bunu, yönteminin bir sonraki satırı olarak ekleyin BuildAndTrainModel() :
_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(_trainedModel);
Eğitilen modelle birlikte tahmin edin
bir örneği oluşturarak eğitilen modelin bir tahminini test etmek için GitHub bir sorun ekleyin Predict GitHubIssue :
GitHubIssue issue = new GitHubIssue() {
Title = "WebSockets communication is slow in my machine",
Description = "The WebSockets communication used under the covers by SignalR looks like is going slow in my development machine.."
};
Tahmin () işlevini kullanın, tek bir veri satırında tahmin yapar:
var prediction = _predEngine.Predict(issue);
Modeli kullanma: tahmin sonuçları
GitHubIssue Area Sonuçları paylaşmak ve bunlara göre işlem yapmak için ilgili etiket tahminini görüntüleyin. Aşağıdaki kodu kullanarak sonuçlar için bir görüntü oluşturun Console.WriteLine() :
Console.WriteLine($"=============== Single Prediction just-trained-model - Result: {prediction.Area} ===============");
Değerlendirme için kullanılmak üzere eğitilen modeli döndürün
Metodun sonundaki modeli döndürün BuildAndTrainModel .
return trainingPipeline;
Modeli değerlendirme
Modeli oluşturup eğitildiniz, artık kalite güvencesi ve doğrulama için farklı bir veri kümesiyle değerlendirmeniz gerekir. EvaluateYönteminde, içinde oluşturulan model BuildAndTrainModel değerlendirilmek üzere geçirilir. EvaluateYöntemi BuildAndTrainModel aşağıdaki kodda olduğu gibi, hemen sonrasında oluşturun:
void Evaluate(DataViewSchema trainingDataViewSchema)
{
}
EvaluateYöntemi aşağıdaki görevleri yürütür:
- Test veri kümesini yükler.
- Birden çok Lass değerlendirici oluşturur.
- Modeli değerlendirir ve ölçüm oluşturur.
- Ölçümleri görüntüler.
Aşağıdaki kodu kullanarak, yöntem çağrısının altına doğru yeni yönteme bir çağrı ekleyin BuildAndTrainModel :
Evaluate(_trainingDataView.Schema);
Daha önce eğitim veri kümesiyle yaptığınız gibi, yöntemine aşağıdaki kodu ekleyerek test veri kümesini yükleyin Evaluate :
var testDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_testDataPath,hasHeader: true);
Değerlendir () yöntemi, belirtilen veri kümesini kullanarak model için kalite ölçümlerini hesaplar. MulticlassClassificationMetricsBirden çok Lass Classification değerlendiricileri tarafından hesaplanan genel ölçümleri içeren bir nesne döndürür.
Modelin kalitesini belirleme ölçümlerini göstermek için önce bunları almanız gerekir.
_trainedModel Özellikleri girmek ve tahmin getirmeleri için Machine Learning genel değişkeninin (bir ıranseski) Transform () yönteminin kullanımına dikkat edin. Aşağıdaki kodu Evaluate yöntemine sonraki satır olarak ekleyin:
var testMetrics = _mlContext.MulticlassClassification.Evaluate(_trainedModel.Transform(testDataView));
Aşağıdaki ölçümler birden çok Lass sınıflandırması için değerlendirilir:
Mikro doğruluk-her örnek sınıf çifti, doğruluk ölçüsüne eşit olarak katkıda bulunur. Mikro doğruluk ' ın mümkün olduğunca yakın olmasını istiyorsunuz.
Makro doğruluğu-her sınıf, doğruluk ölçüsüne eşit olarak katkıda bulunur. Minınlık sınıflarına daha büyük sınıflar olarak eşit ağırlık verilir. Makro doğruluğunu mümkün olduğunca yakın bir şekilde tercih edebilirsiniz.
Günlük-kayıp- günlük kaybınıgörüntüleyin. Günlük kaybını mümkün olduğunca sıfıra yakın olacak şekilde istiyorsunuz.
Günlük kaybı azaltma-[-inf, 1,00] aralığından, 1,00 ' nin kusursuz tahminlerden ve 0 ' ın, ortalama tahmine dayalı olduğunu gösterir. Günlük kaybını azaltmanın mümkün olduğunca yakın olmasını istiyorsunuz.
Model doğrulama ölçümlerini görüntüleme
Ölçümleri göstermek, sonuçları paylaşmak ve sonra bunlar üzerinde işlem yapmak için aşağıdaki kodu kullanın:
Console.WriteLine($"*************************************************************************************************************");
Console.WriteLine($"* Metrics for Multi-class Classification model - Test Data ");
Console.WriteLine($"*------------------------------------------------------------------------------------------------------------");
Console.WriteLine($"* MicroAccuracy: {testMetrics.MicroAccuracy:0.###}");
Console.WriteLine($"* MacroAccuracy: {testMetrics.MacroAccuracy:0.###}");
Console.WriteLine($"* LogLoss: {testMetrics.LogLoss:#.###}");
Console.WriteLine($"* LogLossReduction: {testMetrics.LogLossReduction:#.###}");
Console.WriteLine($"*************************************************************************************************************");
Modeli bir dosyaya kaydet
Modelinize her memnun olduktan sonra, daha sonra veya başka bir uygulamada tahmine dayalı hale getirmek için dosyayı bir dosyaya kaydedin. Evaluate yöntemine aşağıdaki kodu ekleyin.
SaveModelAsFile(_mlContext, trainingDataViewSchema, _trainedModel);
Yönteminizin SaveModelAsFile altında yöntemi oluşturun Evaluate .
void SaveModelAsFile(MLContext mlContext,DataViewSchema trainingDataViewSchema, ITransformer model)
{
}
Yöntemine aşağıdaki kodu ekleyin SaveModelAsFile . Bu kod, Save eğitilen modeli seri hale getirmek ve bir ZIP dosyası olarak depolamak için yöntemini kullanır.
mlContext.Model.Save(model, trainingDataViewSchema, _modelPath);
Bir modelle dağıtım ve tahmin etme
Aşağıdaki kodu kullanarak, yöntem çağrısının altına doğru yeni yönteme bir çağrı ekleyin Evaluate :
PredictIssue();
Yöntemi, PredictIssue Evaluate aşağıdaki kodu kullanarak yönteminden hemen sonra (ve yönteminden hemen önce SaveModelAsFile ) oluşturun:
void PredictIssue()
{
}
PredictIssueYöntemi aşağıdaki görevleri yürütür:
- Kaydedilen modeli yükler
- Test verileri için tek bir sorun oluşturur.
- Test verilerine göre alanı tahmin eder.
- Raporlama için test verilerini ve tahminleri birleştirir.
- Tahmin edilen sonuçları görüntüler.
Yöntemine aşağıdaki kodu ekleyerek kaydedilen modeli uygulamanıza yükleyin PredictIssue :
ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);
bir örneği oluşturarak eğitilen modelin bir tahminini test etmek için GitHub bir sorun ekleyin Predict GitHubIssue :
GitHubIssue singleIssue = new GitHubIssue() { Title = "Entity Framework crashes", Description = "When connecting to the database, EF is crashing" };
Daha önce yaptığınız gibi, PredictionEngine aşağıdaki kodla bir örnek oluşturun:
_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(loadedModel);
PredictionEngine , tek bir veri örneğinde tahmin gerçekleştirmenize olanak tanıyan, KULLANıŞLı bir API 'dir. PredictionEngine , iş parçacığı açısından güvenli değildir. Tek iş parçacıklı veya prototip ortamlarında kullanılması kabul edilebilir. Üretim ortamlarında geliştirilmiş performans ve iş parçacığı güvenliği için, PredictionEnginePool ObjectPool PredictionEngine uygulamanız genelinde kullanılacak nesneleri oluşturan hizmetini kullanın. PredictionEnginePool ASP.NET Core Web apı 'sinde kullanmahakkında bu kılavuza bakın.
Not
PredictionEnginePool Hizmet Uzantısı Şu anda önizleme aşamasındadır.
PredictionEngineaşağıdaki kodu tahmine yönelik yöntemine ekleyerek alanı GitHub etiketini tahmin etmek için kullanın PredictIssue :
var prediction = _predEngine.Predict(singleIssue);
Yüklü modeli tahmin için kullanma
AreaSorunu kategorilere ayırarak ve buna uygun şekilde hareket etmek için görüntüleyin. Aşağıdaki kodu kullanarak sonuçlar için bir görüntü oluşturun Console.WriteLine() :
Console.WriteLine($"=============== Single Prediction - Result: {prediction.Area} ===============");
Sonuçlar
Sonuçlarınız aşağıdakine benzer olmalıdır. İşlem hattı sırasında iletileri görüntüler. Uyarıları görebilir veya iletileri işleme alabilirsiniz. Bu iletiler, açıklık açısından aşağıdaki sonuçlardan kaldırılmıştır.
=============== Single Prediction just-trained-model - Result: area-System.Net ===============
*************************************************************************************************************
* Metrics for Multi-class Classification model - Test Data
*------------------------------------------------------------------------------------------------------------
* MicroAccuracy: 0.738
* MacroAccuracy: 0.668
* LogLoss: .919
* LogLossReduction: .643
*************************************************************************************************************
=============== Single Prediction - Result: area-System.Data ===============
Tebrikler! artık bir GitHub sorunu için bir alan etiketini sınıflandırmak ve tahmin etmek üzere bir makine öğrenimi modeli oluşturdunuz. Bu öğreticinin kaynak kodunu DotNet/Samples deposunda bulabilirsiniz.
Sonraki adımlar
Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:
- Verilerinizi hazırlama
- Verileri dönüştürme
- Modeli eğitme
- Modeli değerlendirme
- Eğitilen modelle birlikte tahmin edin
- Yüklü bir modelle dağıtım ve tahmin etme
Daha fazla bilgi edinmek için sonraki öğreticiye ilerleyin