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.
Bu öğreticide, web sitesi açıklamalarından yaklaşımı sınıflandırır ve uygun eylemi gerçekleştiren bir .NET konsol uygulamasının nasıl oluşturulacağı gösterilir. İkili yaklaşım sınıflandırıcısı Visual Studio 2022'de C# kullanır.
Bu eğitimde şunları öğreniyorsunuz:
- 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
Konsol uygulaması oluşturma
"SentimentAnalysis" 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 ve ardından Gözat sekmesini seçin. Microsoft.ML arayın, istediğiniz paketi seçin ve ardından Yükle'yi seçin. Seçtiğiniz paketin lisans koşullarını kabul ederek yüklemeye devam edin.
Verilerinizi hazırlama
Uyarı
Bu öğreticinin veri kümeleri 'Derin Özellikler Kullanılarak Gruptan Bireysel Etiketlere', Kotzias ve diğerlerinden alınmaktadır. KDD 2015 ve UCI Machine Learning Deposu ' nda barındırıldı - Dua, D. ve Karra Taniskidou, E. (2017). 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.txtDosyayı oluşturduğunuz Veri dizinine kopyalayın.Çözüm Gezgini'nde dosyaya sağ tıklayın ve
yelp_labelled.txtseçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeniyse kopyala olarak değiştirin.
Sınıf oluşturma ve yolları tanımlama
usingdosyasının en üstüne aşağıdaki ek yönergeleri 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 yönergelerin hemen altındaki
usingsatı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'nde projeye sağ tıklayın veardından Yeni Öğ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'yi seçin.
SentimentData.cs dosyası kod düzenleyicisinde açılır. aşağıdaki
usingyönergeyi SentimentData.cs en üstüne ekleyin:using Microsoft.ML.Data;Mevcut sınıf tanımını kaldırın ve
SentimentDataveSentimentPredictionolmak üzere iki sınıftan oluşan aşağıdaki kodu SentimentData.cs dosyasına 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ı (SentimentText) için bir string ve duyarlılık için ya 1 (pozitif) ya da 0 (negatif) olarak belirtilen bir bool (Sentiment) değerine sahiptir. Her iki alanda da her alanın veri dosyası sırasını açıklayan LoadColumn öznitelikleri eklenmiştir. Buna ek olarak, Sentiment özelliğini Label alanı olarak belirlemek için bir ColumnName özniteliğine sahiptir. Aşağıdaki örnek dosyanın üst bilgi satırı yoktur ve şuna benzer:
| SentimentText | Yaklaşım (Etiket) |
|---|---|
| Garsonun hizmeti biraz yavaştı. | 0 |
| Kabuk iyi değil. | 0 |
| Vay... Burayı sevdim. | 1 |
| Hizmet çok hızlıydı. | 1 |
SentimentPrediction model eğitiminden sonra kullanılan tahmin sınıfıdır. Türetilir SentimentData'den, böylece giriş SentimentText çıkış tahminiyle birlikte görüntülenebilir.
Prediction Boole değeri, modelin yeni giriş SentimentTextile 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 Prediction'dir.
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 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 benzer, kavramsal olarak.
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
LoadData()birProgram.csyö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.
Aşağıdaki kodu yöntemin ilk satırı
LoadData()olarak ekleyin:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);LoadFromTextFile() yöntemi, veri şemasını tanımlar ve dosyada okur. Veri yolu değişkenlerini alır ve
IDataViewdöndürür.
Model eğitimi ve testi için veri kümesini bölme
Modeli hazırlarken, modeli eğitmek için veri kümesinin bir bölümü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öntemine
LoadData()sonraki satır olarak ekleyin:TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);Önceki kod, yüklenen veri kümesini eğitim ve test veri kümelerine ayırmak ve DataOperationsCatalog.TrainTestData sınıfında geri döndürmek için TrainTestSplit() yöntemini kullanır. parametresiyle verilerin test kümesi yüzdesini
testFractionbelirtin. Varsayılan değer 10%'dir. Bu durumda, daha fazla veri değerlendirmek için 20% kullanırsınız.splitDataViewyönteminin sonunda değeriniLoadData()döndürür:return splitDataView;
Modeli oluşturma ve eğitma
aşağıdaki çağrıyı yöntemine
BuildAndTrainModelçağrısınınLoadDataaltına 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 duygu durumunu tahmin eder.
- Modeli geri 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 anahtar türüFeaturessütununa dönüştürür ve bunu yeni bir veri kümesi sütunu olarak ekler:SentimentText Duyarlılık Özellikler Garsonun hizmeti biraz yavaştı. 0 [0.76, 0.65, 0.44, …] Kabuk iyi değil. 0 [0.98, 0.43, 0.54, …] Vay... Burayı sevdim. 1 [0.35, 0.73, 0.46, …] Hizmet çok hızlıydı. 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.
aşağıdakini içinde bir sonraki kod satırı olarak 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, estimator öğesine eklenir ve geçmiş verilerden öğrenmek için SentimentText (Features) özelliklendirilmiş ve Label giriş parametrelerini kabul eder.
Modeli eğitin
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 iade etme
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
BuildAndTrainModelaltına yeni yönteme bir çağrı ekleyin:Evaluate(mlContext, model, splitDataView.TestSet);splitTestSetaşağıdaki 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 tahminlerde 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ümesini ()predictions aldıktan 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,
AreaUnderRocCurvemodelin pozitif ve negatif sınıfları doğru bir şekilde sınıflandıracağından ne kadar emin olduğunu gösterir. ÖğesininAreaUnderRocCurvemümkün olduğunca yakın olmasını istiyorsunuz.Ölçüm,
F1Scoremodelin F1 puanını alır ve bu da duyarlık ve geri çekme arasındaki dengenin bir ölçüsüdür. ÖğesininF1Scoremümkün olduğunca yakın olmasını istiyorsunuz.
Test verilerinin sonucunu tahmin etme
UseModelWithSingleItem()Aşağıdaki kodu kullanarak yöntemini hemen yöntemindenEvaluate()sonra 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 duygusal eğilimi tahmin eder.
- Raporlama için test verilerini ve tahminlerini birleştirir.
- Tahmin edilen sonuçları görüntüler.
Aşağıdaki kodu kullanarak yöntem çağrısının
Evaluate()hemen altına yeni yönteme bir çağrı ekleyin:UseModelWithSingleItem(mlContext, model);Yönteminde ilk satır
UseModelWithSingleItem()olarak oluşturmak için aşağıdaki kodu ekleyin: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.
PredictionEngineiş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarda kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için hizmeti kullanınPredictionEnginePool. Bu hizmet, uygulamanız genelinde kullanılmak üzere birObjectPoolPredictionEnginenesne oluşturur. ASP.NET Core Web API'sinde kullanmaPredictionEnginePoolhakkında bu kılavuza bakın.Uyarı
PredictionEnginePoolhizmet uzantısı şu anda önizleme aşamasındadır.UseModelWithSingleItem()yönteminde,SentimentDataörneğini oluşturarak eğitilen modelin tahminini test etmek için bir yorum ekleyin.SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };Yönteminde sonraki kod
PredictionEnginesatırları olarak aşağıdakileri ekleyerek test açıklaması verileriniUseModelWithSingleItem()öğesine geçirin:var resultPrediction = predictionFunction.Predict(sampleStatement);Predict() işlevi tek bir veri satırında 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öntemini hemen yöntemindenUseModelWithSingleItem()sonra 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 duygu durumunu tahmin eder.
- Raporlama için test verilerini ve tahminlerini birleştirir.
- Tahmin edilen sonuçları görüntüler.
Aşağıdaki kodu kullanarak yöntem çağrısının
UseModelWithSingleItem()hemen altına yeni yönteme 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." } };
Açıklama 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 başlık oluşturun:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
öğesinden SentimentPredictionSentimentDataTransform() 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 ===============");
Results
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! İleti yaklaşımını sınıflandırmak ve tahmin etmek için bir makine öğrenmesi modelini başarıyla oluşturdunuz.
Başarılı modeller oluşturmak yinelemeli bir işlemdir. Öğreticide hızlı model eğitimi sağlamak için küçük veri kümeleri kullanıldığı için bu modelin ilk kalitesi daha düşüktür. 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 bunu iyileştirmeyi deneyebilirsiniz.
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Sonraki Adımlar
Bu öğreticide şunların nasıl yapılacağı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