Aracılığıyla paylaş


Kılavuz: ML.NET'de ikili sınıflandırma ile web sitesi yorumlarının duygusunu analiz etme

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

  1. "SentimentAnalysis" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.

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

  4. 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.

  1. UCI Yaklaşım Etiketli Cümleler veri kümesi ZIP dosyasını indirin ve sıkıştırmayı açın.

  2. yelp_labelled.txt Dosyayı oluşturduğunuz Veri dizinine kopyalayın.

  3. Çözüm Gezgini'nde dosyaya sağ tıklayın ve yelp_labelled.txt seç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

  1. using dosyası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;
    
  2. Son indirilen veri kümesi dosya yolunu tutacak bir alan oluşturmak için yönergelerin hemen altındaki using satıra aşağıdaki kodu ekleyin:

    string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");
    
  3. 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.

  4. SentimentData.cs dosyası kod düzenleyicisinde açılır. aşağıdaki using yönergeyi SentimentData.cs en üstüne ekleyin:

    using Microsoft.ML.Data;
    
  5. Mevcut sınıf tanımını kaldırın ve SentimentData ve SentimentPrediction olmak ü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:

  1. 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();
    
  2. Sonraki kod satırı olarak aşağıdakileri ekleyin:

    TrainTestData splitDataView = LoadData(mlContext);
    
  3. Aşağıdaki kodu kullanarak dosyanın en altında LoadData() bir Program.cs 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.
  4. 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 IDataView dö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.

  1. 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.

  2. splitDataView yönteminin sonunda değerini LoadData() döndürür:

    return splitDataView;
    

Modeli oluşturma ve eğitma

  1. aşağıdaki çağrıyı yöntemine BuildAndTrainModelçağrısının LoadData altı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.
  2. BuildAndTrainModel() Aşağıdaki kodu kullanarak yönteminin LoadData() altında yöntemini oluşturun:

    ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet)
    {
    
    }
    

Verileri ayıklama ve dönüştürme

  1. 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ü Features sü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.

  1. Evaluate() aşağıdaki kodla hemen sonrasında BuildAndTrainModel()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.
  2. Aşağıdaki kodu kullanarak yöntem çağrısının BuildAndTrainModel altına yeni yönteme bir çağrı ekleyin:

    Evaluate(mlContext, model, splitDataView.TestSet);
    
  3. splitTestSet aşağıdaki kodu Evaluate()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.

  4. 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, AreaUnderRocCurve modelin pozitif ve negatif sınıfları doğru bir şekilde sınıflandıracağından ne kadar emin olduğunu gösterir. Öğesinin AreaUnderRocCurve mümkün olduğunca yakın olmasını istiyorsunuz.

  • Ölçüm, F1Score modelin F1 puanını alır ve bu da duyarlık ve geri çekme arasındaki dengenin bir ölçüsüdür. Öğesinin F1Score mümkün olduğunca yakın olmasını istiyorsunuz.

Test verilerinin sonucunu tahmin etme

  1. UseModelWithSingleItem() Aşağıdaki kodu kullanarak yöntemini hemen yönteminden Evaluate() 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.
  2. 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);
    
  3. 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. PredictionEngine iş 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ın PredictionEnginePool . Bu hizmet, uygulamanız genelinde kullanılmak üzere bir ObjectPoolPredictionEngine nesne oluşturur. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

    Uyarı

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

  4. 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"
    };
    
  5. Yönteminde sonraki kod PredictionEngine satırları olarak aşağıdakileri ekleyerek test açıklaması verilerini UseModelWithSingleItem() öğesine geçirin:

    var resultPrediction = predictionFunction.Predict(sampleStatement);
    

    Predict() işlevi tek bir veri satırında tahminde bulunur.

  6. 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

  1. UseModelWithBatchItems() Aşağıdaki kodu kullanarak yöntemini hemen yönteminden UseModelWithSingleItem() 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.
  2. 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);
    
  3. 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