Aracılığıyla paylaş


Öğ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

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 6'yı 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:

    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.

  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'da dosyaya sağ tıklayın ve Özellikler'iyelp_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

  1. 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;
    
  2. 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");
    
  3. 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.

  4. 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;
    
  5. Mevcut sınıf tanımını kaldırın ve sentimentData.cs dosyasına ve SentimentPredictionolmak ü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ı, SentimentDatakullanıcı açıklamaları için bir string (SentimentText) ve boolSentimentyaklaşı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ş 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 ş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:

  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 Program.cs bir LoadData() 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. 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.

  1. 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 testFractionbelirtin. Varsayılan değer %10'dur, 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. Yönteminin çağrısının BuildAndTrainModelaltı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.
  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 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.

  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ındaki yeni yönteme bir çağrı ekleyin:

    Evaluate(mlContext, model, splitDataView.TestSet);
    
  3. aşağıdaki splitTestSet 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 tahminde 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ü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. Öğesinin AreaUnderRocCurve 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. Öğesinin F1Score mümkün olduğunca yakın olmasını istiyorsunuz.

Test verilerinin sonucunu tahmin edin

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

  4. bir örneği oluşturarak yönteminde eğitilen modelin tahminini UseModelWithSingleItem()SentimentDatatest etmek için bir açıklama ekleyin:

    SentimentData sampleStatement = new SentimentData
    {
        SentimentText = "This was a very bad steak"
    };
    
  5. Yönteminin sonraki kod satırları olarak aşağıdakileri ekleyerek test açıklaması verilerini PredictionEngine öğesine UseModelWithSingleItem() geçirin:

    var resultPrediction = predictionFunction.Predict(sampleStatement);
    

    Predict() işlevi tek bir veri satırı üzerinde 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önteminden UseModelWithSingleItem() 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.
  2. 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);
    
  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."
        }
    };
    

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 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 ===============");

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