Aracılığıyla paylaş


Öğretici: ML.NET ile çok sınıflı sınıflandırma kullanarak destek sorunlarını kategorilere ayırma

Bu örnek öğreticide, Visual Studio'da C# kullanarak bir .NET Core konsol uygulaması aracılığıyla GitHub sorununun Alan etiketini sınıflandıran ve tahmin eden bir modeli eğitmek üzere GitHub sorunu sınıflandırıcısı oluşturmak için ML.NET kullanımı gösterilmektedir.

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 tahmin etme
  • Yüklü bir modelle dağıtma ve tahmin etme

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

Önkoşullar

Konsol uygulaması oluşturma

Proje oluşturma

  1. "GitHubIssueClassification" adlı bir C# Konsol Uygulaması oluşturun. İleri’yi seçin.

  2. Kullanılacak çerçeve olarak .NET 7'yi seçin. Oluştur’u seçin.

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

    Çözüm Gezgini'da projenize sağ tıklayın veYeni Klasör Ekle'yi> seçin. "Veri" yazın ve Enter tuşuna basın.

  4. Modelinizi kaydetmek için projenizde Models adlı bir dizin oluşturun:

    Çözüm Gezgini'da projenize sağ tıklayın veYeni Klasör Ekle'yi> seçin. "Modeller" yazın ve Enter tuşuna basın.

  5. Microsoft.ML NuGet Paketini yükleyin:

    Not

    Bu örnek, aksi belirtilmedikçe bahsedilen 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 kutusunda Tamam düğmesini ve ardından Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin.

Verilerinizi hazırlama

  1. issues_train.tsv ve issues_test.tsv veri kümelerini indirin ve daha önce oluşturduğunuz Veri klasörüne kaydedin. İlk veri kümesi makine öğrenmesi modelini eğiter ve ikincisi modelinizin ne kadar doğru olduğunu değerlendirmek için kullanılabilir.

  2. Çözüm Gezgini'da *.tsv dosyalarının her birine sağ tıklayın ve Özellikler'i seçin. Gelişmiş'in altında, Çıktı 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 deyimleri Program.cs dosyasının en üstüne ekleyin:

using Microsoft.ML;
using GitHubIssueClassification;

Son indirilen dosyaların yollarını tutmak için üç genel alan ve ileDataViewPredictionEngine için MLContextgenel değişkenler oluşturun:

  • _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 yolunu içerir.
  • _modelPath eğitilen modelin kaydedildiği yola sahiptir.
  • _mlContext işleme bağlamı MLContext sağlayandır.
  • _trainingDataViewIDataView eğitim veri kümesini işlemek için kullanılır.
  • _predEnginePredictionEngine<TSrc,TDst> tek tahminler için kullanılır.

Bu yolları ve diğer değişkenleri belirtmek için aşağıdaki kodu using deyimlerinin hemen altına 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 tahminleriniz için bazı sınıflar oluşturun. Projenize yeni bir sınıf ekleyin:

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

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

    GitHubIssueData.cs dosyası kod düzenleyicisinde açılır. Aşağıdaki using deyimi GitHubIssueData.cs dosyasının en üstüne ekleyin:

using Microsoft.ML.Data;

Mevcut sınıf tanımını kaldırın ve ve olmak üzere iki sınıfı GitHubIssueIssuePredictionolan aşağıdaki kodu GitHubIssueData.cs dosyasına ekleyin:

public class GitHubIssue
{
    [LoadColumn(0)]
    public string? ID { get; set; }
    [LoadColumn(1)]
    public string? Area { get; set; }
    [LoadColumn(2)]
    public required string Title { get; set; }
    [LoadColumn(3)]
    public required string Description { get; set; }
}

public class IssuePrediction
{
    [ColumnName("PredictedLabel")]
    public string? Area;
}

label, tahmin etmek istediğiniz sütundur. Tanımlanan Features , modele Etiketi tahmin etmek için verdiğiniz girişlerdir.

Veri kümesindeki kaynak sütunların dizinlerini belirtmek için LoadColumnAttribute kullanın.

GitHubIssue giriş veri kümesi sınıfıdır ve aşağıdaki String alanlara sahiptir:

  • ilk sütun ID (GitHub Sorun Kimliği)
  • ikinci sütun Area (eğitim tahmini)
  • üçüncü sütun Title (GitHub sorun başlığı)featureArea
  • dördüncü sütunDescription,featureArea

IssuePrediction model eğitildikten sonra tahmin için kullanılan sınıftır. Tek string bir (Area) ve bir PredictedLabelColumnName özniteliği vardır. PredictedLabel tahmin ve değerlendirme sırasında kullanılır. Değerlendirme için eğitim verileri, tahmin edilen değerler ve model içeren bir giriş kullanılır.

Tüm ML.NET işlemleri MLContext sınıfında başlar. Başlatma işlemi mlContext , model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. kavramsal olarak içindekine DBContextEntity Frameworkbenzer.

Değişkenleri başlatma

Birden çok eğitimde _mlContext yinelenebilir/belirlenimci sonuçlar için genel değişkeni rastgele bir çekirdek (seed: 0) ile yeni bir örneğiyle MLContext başlatın. Console.WriteLine("Hello World!") satırını aşağıdaki kodla değiştirin:

_mlContext = new MLContext(seed: 0);

Verileri yükleme

ML.NET, sayısal veya metin tablolu verilerini açıklamanın esnek ve verimli bir yolu olarak IDataView arabirimini kullanır. IDataView metin dosyalarını veya gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) yükleyebilir.

İşlem hattında kullanmak üzere genel değişkeni başlatmak ve yüklemek _trainingDataView için başlatma işleminden mlContext sonra aşağıdaki kodu ekleyin:

_trainingDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_trainDataPath,hasHeader: true);

LoadFromTextFile() veri şemasını tanımlar ve dosyada okur. Veri yolu değişkenlerini alır ve bir IDataViewdöndürür.

yöntemini çağırdıktan LoadFromTextFile() sonra aşağıdakileri ekleyin:

var pipeline = ProcessData();

ProcessData yöntemi aşağıdaki görevleri yürütür:

  • Verileri ayıklar ve dönüştürür.
  • İşlem hattını döndürür.

ProcessData Aşağıdaki kodu kullanarak Program.cs dosyasının en altında yöntemini oluşturun:

IEstimator<ITransformer> ProcessData()
{

}

Özellikleri ayıklama ve verileri dönüştürme

bir GitHubIssueiçin Area GitHub etiketini tahmin etmek istediğinizde MapValueToKey() yöntemini kullanarak sütunu sayısal anahtar türü Label sütununa (sınıflandırma algoritmaları tarafından kabul edilen bir biçim) dönüştürün Area ve yeni bir veri kümesi sütunu olarak ekleyin:

var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Area", outputColumnName: "Label")

Ardından, metin (Title ve ) sütunlarını ve DescriptionFeaturizedadlı TitleFeaturized her biri için sayısal bir vektöre dönüştüren öğesini çağırınmlContext.Transforms.Text.FeaturizeTextDescription. her iki sütun için özellik kazandırmayı işlem hattına aşağıdaki kodla ekleyin:

.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Title", outputColumnName: "TitleFeaturized"))
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Description", outputColumnName: "DescriptionFeaturized"))

Veri hazırlama işleminin son adımı, Concatenate() yöntemini kullanarak tüm özellik sütunlarını Özellikler sütununda birleştirir. Varsayılan olarak, öğrenme algoritması yalnızca Özellikler sütunundaki özellikleri işler. Bu dönüşümü aşağıdaki kodla işlem hattına ekleyin:

.Append(_mlContext.Transforms.Concatenate("Features", "TitleFeaturized", "DescriptionFeaturized"))

Ardından, aşağıdaki kodda olduğu gibi, önbelleği kullanarak verileri birden çok kez yinelediğinizde daha iyi performans elde edebilmesi için DataView'ı önbelleğe almak için bir AppendCacheCheckpoint ekleyin:

.AppendCacheCheckpoint(_mlContext);

Uyarı

Eğitim süresini düşürmek için küçük/orta boyutlu veri kümeleri için AppendCacheCheckpoint kullanın. Kullanmayın (kaldırın). AppendCacheCheckpoint()), çok büyük veri kümelerini işlerken.

yönteminin sonunda ProcessData işlem hattını döndürür.

return pipeline;

Bu adım, ön işlemeyi/özellik geliştirmeyi işler. ML.NET'de bulunan ek bileşenleri kullanmak modelinizle daha iyi sonuçlar elde etmenizi sağlayabilir.

Modeli oluşturma ve eğitma

Yöntemine BuildAndTrainModelyapılan çağrıdan sonraki satır olarak yöntemine aşağıdaki çağrıyı ProcessData() ekleyin:

var trainingPipeline = BuildAndTrainModel(_trainingDataView, pipeline);

BuildAndTrainModel yöntemi aşağıdaki görevleri yürütür:

  • Eğitim algoritması sınıfını oluşturur.
  • Modeli eğiter.
  • Eğitim verilerine göre alanı tahmin eder.
  • Modeli döndürür.

Yönteminin BuildAndTrainModel bildiriminden ProcessData() hemen sonra aşağıdaki kodu kullanarak yöntemini oluşturun:

IEstimator<ITransformer> BuildAndTrainModel(IDataView trainingDataView, IEstimator<ITransformer> pipeline)
{

}

Sınıflandırma görevi hakkında

Sınıflandırma, bir öğenin veya veri satırının kategorisini, türünü veya sınıfını belirlemek için verileri kullanan bir makine öğrenmesi görevidir ve genellikle aşağıdaki türlerden biridir:

  • İkili: A veya B.
  • Çok sınıflı: Tek bir model kullanılarak tahmin edilebilen birden çok kategori.

Sorun kategorisi tahmininiz yalnızca iki (ikili) yerine birden çok kategoriden (çok sınıflı) biri olabileceğinden, bu tür bir sorun için Çok Sınıflı sınıflandırma öğrenme algoritmasını kullanın.

içinde ilk kod satırı olarak aşağıdakileri ekleyerek makine öğrenmesi 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"));

SdcaMaximumEntropy, çok sınıflı sınıflandırma eğitim algoritmanızdır. Bu, öğesine eklenir pipeline ve geçmiş verilerden öğrenmek için özelliklendirilmiş Title ve Description (Features) ile Label giriş parametrelerini kabul eder.

Modeli eğitme

Modeli verilere sığdırın splitTrainSet ve yönteminin sonraki kod satırı olarak aşağıdakileri ekleyerek eğitilen modeli döndürin BuildAndTrainModel() :

_trainedModel = trainingPipeline.Fit(trainingDataView);

yöntemi, Fit()veri kümesini dönüştürüp eğitimi uygulayarak modelinizi eğiter.

PredictionEngine, tek bir veri örneğinde geçiş yapmanızı ve ardından tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir. Bunu yönteminde BuildAndTrainModel() sonraki satır olarak ekleyin:

_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(_trainedModel);

Eğitilen modelle tahmin etme

örneğini oluşturarak yönteminde eğitilen modelin tahminini PredictGitHubIssuetest etmek için bir GitHub sorunu ekleyin:

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.."
};

Predict() işlevini kullanarak tek bir veri satırı üzerinde tahminde bulunur:

var prediction = _predEngine.Predict(issue);

Modeli kullanma: tahmin sonuçları

Sonuçları paylaşmak ve Area bunlara göre işlem yapmak için ilgili etiket tahminini görüntüleyinGitHubIssue. Aşağıdaki Console.WriteLine() kodu kullanarak sonuçlar için bir görüntü oluşturun:

Console.WriteLine($"=============== Single Prediction just-trained-model - Result: {prediction.Area} ===============");

Değerlendirme için kullanılacak şekilde eğitilen modeli döndürme

Yöntemin sonundaki BuildAndTrainModel modeli döndürür.

return trainingPipeline;

Modeli değerlendirme

Modeli oluşturup eğittiyseniz kalite güvencesi ve doğrulama için farklı bir veri kümesiyle değerlendirmeniz gerekir. yönteminde Evaluate , içinde BuildAndTrainModel oluşturulan model değerlendirilecek şekilde geçirilir. Aşağıdaki kodda Evaluate olduğu gibi hemen sonrasında BuildAndTrainModelyöntemini oluşturun:

void Evaluate(DataViewSchema trainingDataViewSchema)
{

}

Evaluate yöntemi aşağıdaki görevleri yürütür:

  • Test veri kümesini yükler.
  • Çok sınıflı değerlendiriciyi oluşturur.
  • Modeli değerlendirir ve ölçümler oluşturur.
  • Ölçümleri görüntüler.

Aşağıdaki kodu kullanarak yeni yönteme, doğrudan yöntem çağrısının BuildAndTrainModel altına bir çağrı ekleyin:

Evaluate(_trainingDataView.Schema);

Daha önce eğitim veri kümesinde yaptığınız gibi yöntemine aşağıdaki kodu Evaluate ekleyerek test veri kümesini yükleyin:

var testDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_testDataPath,hasHeader: true);

Evaluate() yöntemi, belirtilen veri kümesini kullanarak modelin kalite ölçümlerini hesaplar. Çok sınıflı sınıflandırma değerlendiricileri tarafından hesaplanan genel ölçümleri içeren bir MulticlassClassificationMetrics nesnesi döndürür. Modelin kalitesini belirlemek üzere ölçümleri görüntülemek için önce bunları almanız gerekir. Özellikleri giriş yapmak ve tahminleri döndürmek için makine öğrenmesi _trainedModel genel değişkeninin (ITransformer) Transform() yönteminin kullanıldığına dikkat edin. Aşağıdaki kodu yöntemine Evaluate sonraki satır olarak ekleyin:

var testMetrics = _mlContext.MulticlassClassification.Evaluate(_trainedModel.Transform(testDataView));

Aşağıdaki ölçümler çok sınıflı sınıflandırma için değerlendirilir:

  • Mikro Doğruluk - Her örnek sınıf çifti doğruluk ölçümüne eşit katkıda bulunur. Mikro Doğruluğun mümkün olduğunca yakın olmasını istiyorsunuz.

  • Makro Doğruluğu - Her sınıf doğruluk ölçümüne eşit katkıda bulunur. Azınlık sınıflara daha büyük sınıflar kadar eşit ağırlık verilir. Makro Doğruluğu'na mümkün olduğunca yakın olmasını istiyorsunuz.

  • Günlük kaybı - bkz . Günlük Kaybı. Günlük kaybının mümkün olduğunca sıfıra yakın olmasını istiyorsunuz.

  • Günlük kaybı azaltma - [-inf, 1.00] aralıkları; burada 1.00 mükemmel tahminler ve 0 ortalama tahminleri gösterir. Günlük kaybı azaltmanın mümkün olduğunca bire yakın olmasını istiyorsunuz.

Model doğrulama ölçümlerini görüntüleme

Ölçümleri görüntülemek, sonuçları paylaşmak ve 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 kaydetme

Modelinizden memnun olduktan sonra, daha sonra veya başka bir uygulamada tahminde bulunmak için modeli bir dosyaya kaydedin. Evaluate yöntemine aşağıdaki kodu ekleyin.

SaveModelAsFile(_mlContext, trainingDataViewSchema, _trainedModel);

SaveModelAsFile Yönteminizin Evaluate altında yöntemini oluşturun.

void SaveModelAsFile(MLContext mlContext,DataViewSchema trainingDataViewSchema, ITransformer model)
{

}

Aşağıdaki kodu yönteminize SaveModelAsFile ekleyin. Bu kod, eğitilen modeli zip dosyası olarak seri hale getirmek ve depolamak için yöntemini kullanır Save .

mlContext.Model.Save(model, trainingDataViewSchema, _modelPath);

Modelle dağıtma ve tahmin etme

Aşağıdaki kodu kullanarak yeni yönteme, doğrudan yöntem çağrısının Evaluate altına bir çağrı ekleyin:

PredictIssue();

PredictIssue Aşağıdaki kodu kullanarak yönteminden Evaluate hemen sonra (ve yöntemin SaveModelAsFile hemen öncesinde) yöntemini oluşturun:

void PredictIssue()
{

}

PredictIssue yöntemi aşağıdaki görevleri yürütür:

  • Kaydedilen modeli yükler
  • Test verileriyle ilgili tek bir sorun oluşturur.
  • Test verilerine göre alanı tahmin eder.
  • Raporlama için test verilerini ve tahminlerini birleştirir.
  • Tahmin edilen sonuçları görüntüler.

Aşağıdaki kodu PredictIssue yöntemine ekleyerek kaydedilen modeli uygulamanıza yükleyin:

ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);

örneğini oluşturarak yönteminde eğitilen modelin tahminini PredictGitHubIssuetest etmek için bir GitHub sorunu ekleyin:

GitHubIssue singleIssue = new GitHubIssue() { Title = "Entity Framework crashes", Description = "When connecting to the database, EF is crashing" };

Daha önce yaptığınız gibi aşağıdaki kodla bir PredictionEngine örnek oluşturun:

_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(loadedModel);

PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir. PredictionEngine iş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarında kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için, uygulamanızın PredictionEnginePoolPredictionEngine tamamında kullanmak üzere bir ObjectPool nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

Not

PredictionEnginePool hizmet uzantısı şu anda önizleme aşamasındadır.

PredictionEngine Tahmin yöntemine aşağıdaki kodu ekleyerek Area GitHub etiketini tahmin etmek PredictIssue için kullanın:

var prediction = _predEngine.Predict(singleIssue);

Tahmin için yüklenen modeli kullanma

Sorunu kategorilere ayırmak ve buna göre hareket etmek için görüntüleyin Area . Aşağıdaki Console.WriteLine() kodu kullanarak sonuçlar için bir görüntü oluşturun:

Console.WriteLine($"=============== Single Prediction - Result: {prediction.Area} ===============");

Sonuçlar

Sonuçlarınız aşağıdakine benzer olmalıdır. İşlem hattı işlenirken iletileri görüntüler. Uyarılar görebilir veya iletileri işleyebilirsiniz. Bu iletiler netlik için 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! GitHub sorununun Area etiketini sınıflandırmak ve tahmin etmek için bir makine öğrenmesi modelini başarıyla 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 tahmin etme
  • Yüklü bir modelle dağıtma ve tahmin etme

Daha fazla bilgi edinmek için sonraki öğreticiye ilerleyin