Öğ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
- ".NET Masaüstü Geliştirme" iş yükü yüklü Visual Studio 2022.
- GitHub sorunları sekmeyle ayrılmış dosya (issues_train.tsv).
- GitHub, test sekmesiyle ayrılmış dosya (issues_test.tsv) oluşturur.
Konsol uygulaması oluşturma
Proje oluşturma
"GitHubIssueClassification" adlı bir C# Konsol Uygulaması oluşturun. İleri’yi seçin.
Kullanılacak çerçeve olarak .NET 7'yi seçin. Oluştur’u seçin.
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.
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.
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
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.
Çö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 ileDataView
PredictionEngine
için MLContext
genel 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._trainingDataView
IDataView eğitim veri kümesini işlemek için kullanılır._predEngine
PredictionEngine<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:
Çözüm Gezgini'da projeye sağ tıklayın ve ardındanYeni Öğe Ekle'yi> seçin.
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ı GitHubIssue
IssuePrediction
olan 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ığı)feature
Area
- dördüncü sütun
Description
,feature
Area
IssuePrediction
model eğitildikten sonra tahmin için kullanılan sınıftır. Tek string
bir (Area
) ve bir PredictedLabel
ColumnName
ö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 DBContext
Entity Framework
benzer.
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 IDataView
dö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 GitHubIssue
iç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 DescriptionFeaturized
adlı TitleFeaturized
her biri için sayısal bir vektöre dönüştüren öğesini çağırınmlContext.Transforms.Text.FeaturizeText
Description
. 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 BuildAndTrainModel
yapı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 Predict
GitHubIssue
test 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 BuildAndTrainModel
yö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 Predict
GitHubIssue
test 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 PredictionEnginePool
PredictionEngine
tamamında kullanmak üzere bir ObjectPool
nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePool
hakkı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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin