Öğretici: ML.NET'de ikili sınıflandırma ile web sitesi açıklamalarının yaklaşımını analiz etme
Bu öğreticide, web sitesi açıklamalarından yaklaşımı sınıflandıran ve uygun eylemi gerçekleştiren bir .NET Core konsol uygulamasının nasıl oluşturulacağı gösterilmektedir. İkili yaklaşım sınıflandırıcısı Visual Studio 2022'de C# kullanır.
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Konsol uygulaması oluşturma
- Verileri hazırlama
- Verileri yükleme
- Modeli oluşturma ve eğitma
- Modeli değerlendirme
- Tahminde bulunmak için modeli kullanma
- Sonuçları görme
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Önkoşullar
UCI Yaklaşım Etiketli Cümleler veri kümesi (ZIP dosyası)
Konsol uygulaması oluşturma
"SentimentAnalysis" 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 Data adlı bir dizin oluşturun.
Microsoft.ML NuGet Paketini yükleyin:
Not
Bu örnek, aksi belirtilmedikçe belirtilen 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 ve ardından Gözat sekmesini seçin. Microsoft.ML arayın, istediğiniz paketi seçin ve ardından Yükle düğmesini seçin. Seçtiğiniz paketin lisans koşullarını kabul ederek yüklemeye devam edin.
Verilerinizi hazırlama
Not
Bu öğreticinin veri kümeleri 'Derin Özellikleri Kullanan Gruptan Tek Tek Etiketlere', Kotzias et' veri kümelerinden alınmaktadır. al,. KDD 2015 ve UCI Machine Learning Deposu - Dua, D. ve Karra Taniskidou, E. 'de (2017) barındırıldı. UCI Machine Learning Deposu [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
UCI Yaklaşım Etiketli Cümleler veri kümesi ZIP dosyasını indirin ve sıkıştırmayı açın.
yelp_labelled.txt
Dosyayı oluşturduğunuz Veri dizinine kopyalayın.Çözüm Gezgini'da dosyaya sağ tıklayın ve Özellikler'i
yelp_labeled.txt
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
deyimleri Program.cs dosyasının en üstüne ekleyin:using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;
Son indirilen veri kümesi dosya yolunu tutacak bir alan oluşturmak için deyimlerinin hemen altındaki
using
satıra aşağıdaki kodu ekleyin:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");
Ardından giriş verileriniz ve tahminleriniz için 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ı SentimentData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.
SentimentData.cs dosyası kod düzenleyicisinde açılır. SentimentData.cs dosyasının en üstüne aşağıdaki
using
deyimini ekleyin:using Microsoft.ML.Data;
Mevcut sınıf tanımını kaldırın ve sentimentData.cs dosyasına ve
SentimentPrediction
olmak üzere iki sınıfıSentimentData
olan aşağıdaki kodu ekleyin:public class SentimentData { [LoadColumn(0)] public string? SentimentText; [LoadColumn(1), ColumnName("Label")] public bool Sentiment; } public class SentimentPrediction : SentimentData { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Veriler nasıl hazırlandı?
giriş veri kümesi sınıfı, SentimentData
kullanıcı açıklamaları için bir string
(SentimentText
) ve bool
Sentiment
yaklaşım için 1 (pozitif) veya 0 (negatif) değerine sahiptir. Her iki alanda da her alanın veri dosyası sırasını açıklayan LoadColumn öznitelikleri eklenmiştir. Ayrıca özelliği, Sentiment
alanı olarak belirlemek için bir ColumnName özniteliğine Label
sahiptir. Aşağıdaki örnek dosyanın üst bilgi satırı yoktur ve şöyle görünür:
SentimentText | Yaklaşım (Etiket) |
---|---|
Garson hizmette biraz yavaştı. | 0 |
Kabuk iyi değil. | 0 |
Wow... Burayı sevdim. | 1 |
Hizmet çok soruldu. | 1 |
SentimentPrediction
model eğitiminden sonra kullanılan tahmin sınıfıdır. Girişin çıkış tahminiyle birlikte görüntülenebilmesi SentimentText
için öğesinden SentimentData
devralınır. Prediction
Boole değeri, modelin yeni giriş SentimentText
ile birlikte sağlandığında tahmin ettiği değerdir.
Çıkış sınıfı SentimentPrediction
, model tarafından hesaplanan diğer iki özelliği içerir: Score
model tarafından hesaplanan ham puan ve Probability
- metnin pozitif yaklaşıma sahip olma olasılığına göre ayarlanmış puan.
Bu öğretici için en önemli özellik şeklindedir Prediction
.
Verileri yükleme
ML.NET'daki veriler bir 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 gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) bir IDataView
nesneye yüklenebilir.
MLContext sınıfı, tüm ML.NET işlemleri için bir başlangıç noktasıdır. Başlatma işlemi mlContext
, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext
kavramsal olarak benzerdir.
Uygulamayı hazırlar ve ardından verileri yüklersiniz:
mlContext değişkenini
Console.WriteLine("Hello World!")
bildirmek ve başlatmak için satırını aşağıdaki kodla değiştirin:MLContext mlContext = new MLContext();
Sonraki kod satırı olarak aşağıdakileri ekleyin:
TrainTestData splitDataView = LoadData(mlContext);
Aşağıdaki kodu kullanarak dosyanın en altında
Program.cs
birLoadData()
yöntem oluşturun:TrainTestData LoadData(MLContext mlContext) { }
LoadData()
yöntemi aşağıdaki görevleri yürütür:- Verileri yükler.
- Yüklenen veri kümesini eğitim ve test veri kümelerine böler.
- Bölünmüş tren ve test veri kümelerini döndürür.
Yönteminin ilk satırı
LoadData()
olarak aşağıdaki kodu ekleyin:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
LoadFromTextFile() yöntemi, veri şemasını tanımlar ve dosyasında okur. Veri yolu değişkenlerini alır ve döndürür
IDataView
.
Model eğitimi ve testi için veri kümesini bölme
Modeli hazırlarken, modeli eğitmek için veri kümesinin bir kısmını ve modelin doğruluğunu test etmek için veri kümesinin bir bölümünü kullanırsınız.
Yüklenen verileri gerekli veri kümelerine bölmek için aşağıdaki kodu yönteminde
LoadData()
sonraki satır olarak ekleyin:TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
Önceki kod, yüklenen veri kümesini eğitme ve test veri kümelerine bölmek ve sınıfta döndürmek DataOperationsCatalog.TrainTestData için TrainTestSplit() yöntemini kullanır. parametresiyle verilerin test kümesi yüzdesini
testFraction
belirtin. Varsayılan değer %10'dur, bu durumda daha fazla veri değerlendirmek için %20 kullanırsınız.splitDataView
yönteminin sonunda değeriniLoadData()
döndürür:return splitDataView;
Modeli oluşturma ve eğitma
Yönteminin çağrısının
BuildAndTrainModel
altındaki yöntemine aşağıdaki çağrıyıLoadData
ekleyin:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
BuildAndTrainModel()
yöntemi aşağıdaki görevleri yürütür:- Verileri ayıklar ve dönüştürür.
- Modeli eğiter.
- Test verilerine göre yaklaşımı tahmin eder.
- Modeli döndürür.
BuildAndTrainModel()
Aşağıdaki kodu kullanarak yöntemininLoadData()
altında yöntemini oluşturun:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Verileri ayıklama ve dönüştürme
Sonraki kod satırı olarak çağırın
FeaturizeText
:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
FeaturizeText()
Önceki koddaki yöntem, metin sütununu (SentimentText
) makine öğrenmesi algoritması tarafından kullanılan sayısal bir anahtar türüFeatures
sütununa dönüştürür ve yeni bir veri kümesi sütunu olarak ekler:SentimentText Yaklaşım Özellikler Garson hizmette biraz yavaştı. 0 [0.76, 0.65, 0.44, ...] Kabuk iyi değil. 0 [0.98, 0.43, 0.54, ...] Wow... Burayı sevdim. 1 [0.35, 0.73, 0.46, ...] Hizmet çok soruldu. 1 [0.39, 0, 0.75, ...]
Öğrenme algoritması ekleme
Bu uygulama, öğeleri veya veri satırlarını kategorilere ayıran bir sınıflandırma algoritması kullanır. Uygulama, web sitesi açıklamalarını pozitif veya negatif olarak kategorilere ayırır, bu nedenle ikili sınıflandırma görevini kullanın.
içinde sonraki kod satırı olarak aşağıdakileri ekleyerek makine öğrenmesi görevini veri dönüştürme tanımlarına ekleyin BuildAndTrainModel()
:
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
SdcaLogisticRegressionBinaryTrainer, sınıflandırma eğitim algoritmanızdır. Bu, öğesine eklenir estimator
ve geçmiş verilerden öğrenmek için özelliklendirilmiş SentimentText
(Features
) ve 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()
:
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
Fit() yöntemi, veri kümesini dönüştürüp eğitimi uygulayarak modelinizi eğiter.
Değerlendirme için kullanılacak şekilde eğitilen modeli döndürme
Yöntemin sonundaki modeli döndür:BuildAndTrainModel()
return model;
Modeli değerlendirme
Modeliniz eğitildikten sonra test verilerinizi kullanarak modelin performansını doğrulayın.
Evaluate()
aşağıdaki kodla hemen sonrasındaBuildAndTrainModel()
yöntemini oluşturun:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }
Evaluate()
yöntemi aşağıdaki görevleri yürütür:- Test veri kümesini yükler.
- BinaryClassification değerlendiricisini oluşturur.
- Modeli değerlendirir ve ölçümler oluşturur.
- Ölçümleri görüntüler.
Aşağıdaki kodu kullanarak yöntem çağrısının
BuildAndTrainModel
altındaki yeni yönteme bir çağrı ekleyin:Evaluate(mlContext, model, splitDataView.TestSet);
aşağıdaki
splitTestSet
koduEvaluate()
ekleyerek verileri dönüştürün:Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);
Önceki kod, test veri kümesinin sağlanan birden çok giriş satırı için tahminde bulunmak için Transform() yöntemini kullanır.
yönteminin sonraki kod satırı olarak aşağıdakileri ekleyerek modeli değerlendirin
Evaluate()
:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Tahmin kümesine ()predictions
sahip olduktan sonra Evaluate() yöntemi, tahmin edilen değerleri test veri kümesindeki gerçek Labels
değerle karşılaştıran ve modelin nasıl performans sergilediğine ilişkin calibratedBinaryClassificationMetrics nesnesini döndüren modeli değerlendirir.
Model doğrulama ölçümlerini görüntüleme
Ölçümleri görüntülemek için aşağıdaki kodu kullanın:
Console.WriteLine();
Console.WriteLine("Model quality metrics evaluation");
Console.WriteLine("--------------------------------");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
Console.WriteLine($"F1Score: {metrics.F1Score:P2}");
Console.WriteLine("=============== End of model evaluation ===============");
Ölçüm,
Accuracy
test kümesindeki doğru tahminlerin oranı olan modelin doğruluğunu alır.Ölçüm,
AreaUnderRocCurve
modelin pozitif ve negatif sınıfları doğru bir şekilde sınıflandıracağından ne kadar emin olduğunu gösterir. ÖğesininAreaUnderRocCurve
mümkün olduğunca yakın olmasını istiyorsunuz.Ölçüm,
F1Score
duyarlık veyakalama arasındaki dengeyi ölçen modelin F1 puanını alır. ÖğesininF1Score
mümkün olduğunca yakın olmasını istiyorsunuz.
Test verilerinin sonucunu tahmin edin
UseModelWithSingleItem()
Aşağıdaki kodu kullanarak yöntemindenEvaluate()
hemen sonra yöntemini oluşturun:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }
UseModelWithSingleItem()
yöntemi aşağıdaki görevleri yürütür:- Test verilerinin tek bir açıklamasını oluşturur.
- Test verilerine göre yaklaşımı tahmin eder.
- Raporlama için test verilerini ve tahminlerini birleştirir.
- Tahmin edilen sonuçları görüntüler.
Aşağıdaki kodu kullanarak yeni yönteme doğrudan yöntem çağrısının
Evaluate()
altına bir çağrı ekleyin:UseModelWithSingleItem(mlContext, model);
Aşağıdaki kodu ekleyerek Metodunda
UseModelWithSingleItem()
ilk satır olarak oluşturun:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
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ınPredictionEnginePool
PredictionEngine
tamamında kullanmak üzere birObjectPool
nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanmaPredictionEnginePool
hakkında bu kılavuza bakın.Not
PredictionEnginePool
hizmet uzantısı şu anda önizleme aşamasındadır.bir örneği oluşturarak yönteminde eğitilen modelin tahminini
UseModelWithSingleItem()
SentimentData
test etmek için bir açıklama ekleyin:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };
Yönteminin sonraki kod satırları olarak aşağıdakileri ekleyerek test açıklaması verilerini
PredictionEngine
öğesineUseModelWithSingleItem()
geçirin:var resultPrediction = predictionFunction.Predict(sampleStatement);
Predict() işlevi tek bir veri satırı üzerinde tahminde bulunur.
Aşağıdaki kodu kullanarak ilgili yaklaşım tahminini görüntüleyin
SentimentText
:Console.WriteLine(); Console.WriteLine("=============== Prediction Test of model with a single sample and test dataset ==============="); Console.WriteLine(); Console.WriteLine($"Sentiment: {resultPrediction.SentimentText} | Prediction: {(Convert.ToBoolean(resultPrediction.Prediction) ? "Positive" : "Negative")} | Probability: {resultPrediction.Probability} "); Console.WriteLine("=============== End of Predictions ==============="); Console.WriteLine();
Tahmin için modeli kullanma
Toplu iş öğelerini dağıtma ve tahminde bulunur
UseModelWithBatchItems()
Aşağıdaki kodu kullanarak yöntemindenUseModelWithSingleItem()
hemen sonra yöntemini oluşturun:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }
UseModelWithBatchItems()
yöntemi aşağıdaki görevleri yürütür:- Toplu test verileri oluşturur.
- Test verilerine göre yaklaşımı tahmin eder.
- Raporlama için test verilerini ve tahminlerini birleştirir.
- Tahmin edilen sonuçları görüntüler.
Aşağıdaki kodu kullanarak yeni yönteme doğrudan yöntem çağrısının
UseModelWithSingleItem()
altına bir çağrı ekleyin:UseModelWithBatchItems(mlContext, model);
Yönteminde eğitilen modelin tahminlerini
UseModelWithBatchItems()
test etmek için bazı açıklamalar ekleyin:IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Yorum yaklaşımını tahmin etme
Transform() yöntemini kullanarak açıklama veri yaklaşımını tahmin etmek için modeli kullanın:
IDataView batchComments = mlContext.Data.LoadFromEnumerable(sentiments);
IDataView predictions = model.Transform(batchComments);
// Use model to predict whether comment data is Positive (1) or Negative (0).
IEnumerable<SentimentPrediction> predictedResults = mlContext.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false);
Tahminleri birleştirme ve görüntüleme
Aşağıdaki kodu kullanarak tahminler için bir üst bilgi oluşturun:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
yönteminden SentimentPrediction
SentimentData
Transform()
devralındığından, yöntemi tahmin edilen alanlarla doldurulur.SentimentText
ML.NET işlemi işlenirken her bileşen sütun ekler ve bu da sonuçların görüntülenmesini kolaylaştırır:
foreach (SentimentPrediction prediction in predictedResults)
{
Console.WriteLine($"Sentiment: {prediction.SentimentText} | Prediction: {(Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative")} | Probability: {prediction.Probability} ");
}
Console.WriteLine("=============== End of predictions ===============");
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. Bunlar netlik için aşağıdaki sonuçlardan kaldırılmıştır.
Model quality metrics evaluation
--------------------------------
Accuracy: 83.96%
Auc: 90.51%
F1Score: 84.04%
=============== End of model evaluation ===============
=============== Prediction Test of model with a single sample and test dataset ===============
Sentiment: This was a very bad steak | Prediction: Negative | Probability: 0.1027377
=============== End of Predictions ===============
=============== Prediction Test of loaded model with a multiple samples ===============
Sentiment: This was a horrible meal | Prediction: Negative | Probability: 0.1369192
Sentiment: I love this spaghetti. | Prediction: Positive | Probability: 0.9960636
=============== End of predictions ===============
=============== End of process ===============
Press any key to continue . . .
Tebrikler! İletilerin yaklaşımını sınıflandırmak ve tahmin etmek için başarıyla bir makine öğrenmesi modeli oluşturdunuz.
Başarılı modeller oluşturmak yinelemeli bir işlemdir. Öğretici hızlı model eğitimi sağlamak için küçük veri kümelerini kullandığından bu model ilk olarak daha düşük kaliteye sahiptir. Model kalitesinden memnun değilseniz, daha büyük eğitim veri kümeleri sağlayarak veya her algoritma için farklı hiper parametrelere sahip farklı eğitim algoritmaları seçerek modeli iyileştirmeyi deneyebilirsiniz.
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Sonraki adımlar
Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:
- Konsol uygulaması oluşturma
- Verileri hazırlama
- Verileri yükleme
- Modeli oluşturma ve eğitma
- Modeli değerlendirme
- Tahminde bulunmak için modeli kullanma
- Sonuçları görme
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