ML.NET nedir ve nasıl çalışır?

ML.NET, çevrimiçi veya çevrimdışı senaryolarda makine öğrenmesini .NET uygulamalarına eklemenizi sağlar. Bu özellik sayesinde, uygulamanıza uygun verileri kullanarak otomatik tahminler yapma imkanınız vardır. Makine öğrenmesi uygulamaları, açıkça programlanmış olmak yerine tahminde bulunuyorsa veri desenlerini kullanır.

ML.NET,bir makine öğrenmesi modelidir. Model, giriş verilerinizi tahmine dönüştürmek için gereken adımları belirtir. ML.NET ile bir algoritma belirterek özel bir model eğitin veya önceden eğitilmiş TensorFlow ve ONNX modellerini içeri aktarabilirsiniz.

Modeliniz olduktan sonra, tahminlerde olmak için modeli uygulamanıza ekebilirsiniz.

ML.NET, Windows, Linux ve macOS üzerinde .NET Core veya Windows kullanarak .NET Framework. 64 bit tüm platformlarda de kullanılabilir. TensorFlow, LightGBM ve ONNX ile ilgili işlevler dışında 32 bit Windows için de kullanılabilir.

ML.NET ile tahminler ML örnekleri:

Sınıflandırma/Kategorilere Ayırma

Müşteri geri bildirimlerini otomatik olarak olumlu ve olumsuz kategorilere bölme

Regresyon/Sürekli değerleri tahmin edin

Boyuta ve konuma göre evlerin fiyatını tahmin edin

Anomali Algılama

Sahte bankacılık işlemlerini algılama

Öneriler

Çevrimiçi alışveriş yapanların önceki satın almalarına göre satın almak istemeleri gereken ürünler önerin

Zaman serisi/sıralı veriler

Hava durumu/ürün satışlarını tahmin edin

Resimleri sınıflandırma

Tıbbi görüntülerde kategorilere ayırma

Hello ML.NET World

Aşağıdaki kod parçacığındaki kod, en basit ML.NET uygulamasını gösteriyor. Bu örnek, ev boyutu ve fiyat verilerini kullanarak ev fiyatlarını tahmin etmek için doğrusal bir regresyon modeli sağlar.

   using System;
   using Microsoft.ML;
   using Microsoft.ML.Data;

   class Program
   {
       public class HouseData
       {
           public float Size { get; set; }
           public float Price { get; set; }
       }

       public class Prediction
       {
           [ColumnName("Score")]
           public float Price { get; set; }
       }

       static void Main(string[] args)
       {
           MLContext mlContext = new MLContext();

           // 1. Import or create training data
           HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F } };
           IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

           // 2. Specify data preparation and model training pipeline
           var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
               .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

           // 3. Train model
           var model = pipeline.Fit(trainingData);

           // 4. Make a prediction
           var size = new HouseData() { Size = 2.5F };
           var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

           Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");

           // Predicted price for size: 2500 sq ft= $261.98k
       }
   }

Kod iş akışı

Aşağıdaki diyagram hem uygulama kodu yapısını hem de model geliştirmenin iterative işlemini temsil eder:

  • Eğitim verilerini IDataView nesnesine toplama ve yükleme
  • Özellikleri ayıklamak ve makine öğrenmesi algoritması uygulamak için işlem hattı belirtme
  • İşlem hattında Fit() çağrısıyla modeli eğitin
  • Modeli değerlendirme ve geliştirmek için iterate
  • Modeli bir uygulamada kullanmak üzere ikili biçime kaydedin
  • Modeli bir ITransformer nesnesine geri yükleme
  • CreatePredictionEngine.Predict() çağrısıyla tahminde bulunuyor

ML oluşturma, işlem hattı geliştirme, model eğitimi, model değerlendirmesi ve model kullanımı bileşenlerini içeren ML.NET uygulama geliştirme akışı

Şimdi bu kavramları biraz daha derinlemesine araştıracağız.

Makine öğrenmesi modeli

ML.NET modeli, giriş verilerinizde gerçekleştirecek ve tahmin edilen çıkışa ulaşacak dönüştürmeleri içeren bir nesnedir.

Temel

En temel model, yukarıdaki ev fiyatı örneğinde olduğu gibi sürekli miktarlardan birinin diğer miktarla orantılı olduğu iki boyutlu doğrusal regresyondur.

Sapma ve ağırlık parametreleriyle Doğrusal Regresyon Modeli

Model basitçe şöyledir: $Price = b + Boyut * w$. $$ $b $w$ parametreleri, bir satır bir dizi (boyut, fiyat) çifti üzerine sığdırarak tahmin edilmektedir. Modelin parametrelerini bulmak için kullanılan verilere eğitim verileri denir. Makine öğrenmesi modelinin girişlerinin adı özelliklerdir. Bu örnekte, $Size$ tek özelliktir. Makine öğrenmesi modelini eğitmek için kullanılan temel doğruluk değerleri etiket olarak adlandırılan değerlerdir. Burada, $Price veri kümesinde yer alan $Price$ değerleri etiketlerdir.

Daha karmaşık

Daha karmaşık bir model, işlem metni açıklamasını kullanarak finansal işlemleri kategorilere sınıflandırabilir.

Her işlem açıklaması, yedekli sözcükler ve karakterler kaldırılarak ve sözcük ve karakter birleşimleri sayılarak bir özellik kümesine göre ayarlanır. Özellik kümesi, eğitim verilerinde kategori kümesine göre doğrusal bir modeli eğitmek için kullanılır. Yeni bir açıklama, eğitim kümesinde yer alanlara ne kadar benzer olursa aynı kategoriye atanma olasılığı o kadar fazladır.

Metin Sınıflandırma Modeli

Hem ev fiyat modeli hem de metin sınıflandırma modeli doğrusal modellerdir. Verilerinizin doğasına ve çözmekte olduğunuz soruna bağlı olarak karar ağacı modellerini, genelleştirilmiş eklenebilir modelleri ve diğer modelleri de kullanabilirsiniz. Görevler'de modeller hakkında daha fazla bilgi bulabilirsiniz.

Veri hazırlama

Çoğu durumda, mevcut verileriniz makine öğrenmesi modelini eğitmek için doğrudan kullanılmaya uygun değildir. Ham verilerin modelinizin parametrelerini bulmak için kullanılamadan önce hazır olması veya önceden işlenmesi gerekir. Verilerinizin dize değerlerinden sayısal bir gösterime dönüştürülmesi gerekir. Giriş verilerinizde yedekli bilgiler olabilir. Giriş verilerinizin boyutlarını azaltmanız veya genişletmeniz gerekir. Verilerinizin normalleştirilmiş veya ölçeklendirilen olması gerekir.

ML.NET öğreticileri, belirli makine öğrenmesi görevleri için kullanılan metin, görüntü, sayısal ve zaman serisi verileri için farklı veri işleme işlem hatları hakkında bilgi verir.

Verilerinizi hazırlama, veri hazırlamayı daha genel bir şekilde nasıl uygulayacaklarını gösterir.

Kullanılabilir tüm dönüştürmelerin ekini kaynaklar bölümünde bulabilirsiniz.

Modeli değerlendirme

Modelinizi eğittiniz, gelecekte ne kadar iyi tahminler yapacaktır? ML.NET ile modelinizi bazı yeni test verilerine göre değerlendirebilirsiniz.

Her makine öğrenmesi görevi türü, modelin test veri kümesine göre doğruluğunu ve duyarlığı değerlendirmek için kullanılan ölçümlere sahiptir.

Ev fiyatı örneğimizde Regresyon görevini kullandık. Modeli değerlendirmek için aşağıdaki kodu özgün örneğine ekleyin.

        HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };

        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);

        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");

        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

        // R^2: 0.96
        // RMS error: 0.19

Değerlendirme ölçümleri, hatanın düşük ish olduğunu ve tahmin edilen çıkışla test çıkışı arasındaki bağıntının yüksek olduğunu belirtir. Ne kadar kolay oldu! Gerçek örneklerde iyi model ölçümleri elde etmek için daha fazla ayar yapmak gerekir.

ML.NET mimarisi

Bu bölümde ML.NET'in mimari ML üzerinden geçebilirsiniz. Deneyimli bir .NET geliştiricisiyseniz bu desenlerden bazıları size tanıdık gelecek, bazıları ise daha az tanıdık gelecektir. Sıkı tutun, biz de bu sırada!

ML.NET uygulaması bir nesnesiyle MLContext başlar. Bu tek nesne kataloglar içerir. Katalog; veri yükleme ve kaydetme, dönüştürme, eğitmenler ve model işlemi bileşenleri için bir fabrikadır. Her katalog nesnesinin farklı bileşen türlerini oluşturmak için yöntemleri vardır:

Veri yükleme ve kaydetme

Veri hazırlama

Eğitim algoritmaları

İkili sınıflandırma

Çok sınıflı sınıflandırma

Anormallik algılama

Kümeleme

Tahmin etme

Sıralama

Regresyon

Öneri

Microsoft.ML.Recommender NuGet paketini ekleyin

TimeSeries

Microsoft.ML.TimeSeries NuGet paketini ekleyin

Model kullanımı

Yukarıdaki kategorilerin her birsinde oluşturma yöntemlerine gidin. Bu Visual Studio kataloglar IntelliSense aracılığıyla gösterir.

Regresyon Eğitmenleri için IntelliSense

İşlem hattını oluşturma

Her kataloğun içinde bir dizi uzantı yöntemi vardır. Şimdi eğitim işlem hattı oluşturmak için uzantı yöntemlerinin nasıl kullanıldıklarına bakalım.

    var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
        .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

kod parçacığında Concatenate ve her ikisi de Sdca katalogda kullanılan yöntemlerdir. Her biri işlem hattına eklenen bir IEstimator nesnesi oluşturur.

Bu noktada, nesneler yalnızca oluşturulur. Yürütme olmadı.

Modeli eğitme

İşlem hattında nesneler oluşturulduktan sonra veriler modeli eğitmek için kullanılabilir.

    var model = pipeline.Fit(trainingData);

çağrısı, Fit() modelin parametrelerini tahmin etmek için giriş eğitim verilerini kullanır. Bu, modeli eğitme olarak bilinir. Yukarıdaki doğrusal regresyon modelinin iki model parametresi olduğunu unutmayın: sapma ve ağırlık. Çağrıdan Fit() sonra parametrelerin değerleri bilinir. Çoğu modelde bunun çok daha fazla parametresi olur.

Model eğitimi hakkında daha fazla bilgi edinmek için modelinizi eğitma konusundan bilgi edinmek için buraya dilersiniz.

Sonuçta elde edilen model nesnesi ITransformer arabirimini uygulayan. Diğer bir ifadeyle model giriş verilerini tahminlere dönüştürer.

   IDataView predictions = model.Transform(inputData);

Modeli kullanma

Giriş verilerini toplu tahminlere veya aynı anda bir girişe dönüştürebilirsiniz. Ev fiyatı örneğinde, modeli değerlendirmek amacıyla toplu olarak ve tek tek yeni bir tahmin yapmak için her ikisini de yaptık. Şimdi tek tahminler yapmaya bakalım.

    var size = new HouseData() { Size = 2.5F };
    var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
    var price = predEngine.Predict(size);

yöntemi CreatePredictionEngine() bir giriş sınıfı ve bir çıkış sınıfı alır. Alan adları ve/veya kod öznitelikleri, model eğitimi ve tahmin sırasında kullanılan veri sütunlarının adlarını belirler. Daha fazla bilgi için bkz. Eğitilmiş bir modelle tahmin yapma.

Veri modelleri ve şema

ML.NET makine öğrenmesi işlem hattı, DataView nesneleridir.

İşlem hattında her dönüştürmenin bir giriş şeması (veri adları, türleri ve dönüşümün girişte görmeyi beklediğiniz boyutları) vardır; ve bir çıkış şeması (veri adları, türleri ve dönüştürmeden sonra dönüşümün ürettiği boyutlar).

İşlem hattında bir dönüştürmeden gelen çıkış şeması bir sonraki dönüştürmenin giriş şemasıyla eşleyenene kadar ML.NET bir özel durum oluşturur.

Veri görünümü nesnesinin sütunları ve satırları vardır. Her sütunun bir adı, türü ve uzunluğu var. Örneğin, ev fiyatı örneğinde giriş sütunları Boyut ve Fiyat'tır. Hem tür hem de vektör miktarları yerine skaler miktarlardır.

ML fiyat tahmini verileriyle ML.NET Veri Görünümü örneği

Tüm ML.NET algoritmaları vektör olan bir giriş sütununa bakar. Varsayılan olarak bu vektör sütunu Özellikler olarak çağrılır. Bu nedenle Size sütununu, ev fiyatı örneğimizde Özellikler adlı yeni bir sütuna dahil etmiş oluruz.

   var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

Tüm algoritmalar ayrıca tahmin gerçekleştirdikten sonra yeni sütunlar oluşturur. Bu yeni sütunların sabit adları makine öğrenmesi algoritmasının türüne bağlıdır. Regresyon görevi için yeni sütunlardan birinin adı Puan'dır. Bu nedenle fiyat verilerimizi bu adla öznitelik olarak kullandık.

    public class Prediction
    {
        [ColumnName("Score")]
        public float Price { get; set; }
    }

Farklı makine öğrenmesi görevlerinin çıkış sütunları hakkında daha fazla bilgi için Machine Learning bulabilirsiniz.

DataView nesnelerinin önemli bir özelliği, bunların yavaş olarak değerlendirilmeleridir. Veri görünümleri yalnızca model eğitimi, değerlendirme ve veri tahmini sırasında yüklenir ve bu görünümler üzerinde çalışır. ML.NET uygulamanızı yazarken ve test ederken, Visual Studio hata ayıklayıcısını kullanarak Önizleme yöntemini çağırarak herhangi bir veri görünümü nesnesine göz atabilirsiniz.

    var debug = testPriceDataView.Preview();

Değişkenini hata debug ayıklayıcısında izleyebilir ve içeriğini incelersiniz. Önizleme yöntemini üretim kodunda kullanmayın çünkü performansı önemli ölçüde düşürebilir.

Model Dağıtımı

Gerçek hayattaki uygulamalarda model eğitim ve değerlendirme kodunuz tahmininize göre ayrı bir değere sahip olur. Aslında bu iki etkinlik genellikle ayrı ekipler tarafından gerçekleştirilir. Model geliştirme takımınız modeli tahmin uygulamasında kullanmak üzere kaydedebilir.

   mlContext.Model.Save(model, trainingData.Schema,"model.zip");

Sonraki adımlar