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

ML.NET, çevrimiçi veya çevrimdışı senaryolarda .NET uygulamalarına makine öğrenmesi ekleme olanağı sağlar. Bu özellik sayesinde, uygulamanızın kullanabileceği verileri kullanarak otomatik tahminler yapabilirsiniz. Makine öğrenmesi uygulamaları, verilerdeki desenleri kullanarak açıkça programlanmaları yerine tahminlerde bulunur.

Merkezi 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ğitebilir veya önceden eğitilmiş TensorFlow ve ONNX modellerini içeri aktarabilirsiniz.

Bir modele sahip olduktan sonra tahminlerde bulunmak için modeli uygulamanıza ekleyebilirsiniz.

ML.NET.NET kullanarak Windows, Linux ve macOS üzerinde veya .NET Framework kullanarak Windows üzerinde çalışır. 64 bit tüm platformlarda desteklenir. Windows'da TensorFlow, LightGBM ve ONNX ile ilgili işlevler dışında 32 bit desteklenir.

Aşağıdaki tabloda, ML.NET ile yapabileceğiniz tahmin türü örnekleri gösterilmektedir.

Tahmin türü Örnek
Sınıflandırma/Kategorilere Ayırma Müşteri geri bildirimlerini otomatik olarak pozitif ve negatif kategorilere ayırın.
Regresyon/Sürekli değerleri tahmin et Büyüklüğüne ve konumuna göre evlerin fiyatını tahmin edin.
Anomali Algılama Sahte bankacılık işlemlerini tespit edin.
Öneriler Önceki alışverişlerine göre çevrimiçi alışveriş yapanların satın almak isteyebileceği ürünleri önerin.
Zaman serisi/sıralı veriler Hava durumunu veya ürün satışlarını tahmin edin.
Resim sınıflandırması Tıbbi görüntülerde patolojileri kategorilere ayırın.
Metin sınıflandırması Belgeleri içeriğine göre kategorilere ayırın.
Cümle benzerliği İki cümlenin ne kadar benzer olduğunu ölçün.

Merhaba ML.NET Dünya

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

   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, uygulama kodu yapısının yanı sıra model geliştirmenin yinelemeli sürecini temsil eder:

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

Veri 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 ayrıntılı inceleyelim.

Makine öğrenmesi modeli

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

Temel

En temel model, yukarıdaki ev fiyatı örneğinde olduğu gibi bir sürekli miktarın diğerine orantılı olduğu iki boyutlu doğrusal regresyondur.

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

Model basitçe: $Price = b + Boyut * w$. $b$ ve $w$ parametreleri, bir dizi (boyut, fiyat) çifti üzerine bir çizgi uydurarak tahmin edilir. Modelin parametrelerini bulmak için kullanılan verilere eğitim verileri adı verilir. Bir makine öğrenmesi modelinin girişlerine özellik adı verilir. Bu örnekte $Size$ tek özelliktir. Makine öğrenmesi modelini eğitmek için kullanılan temel gerçeklik değerlerine etiket adı verilir. Burada, eğitim veri kümesindeki $Price$ değerleri etiketlerdir.

Daha karmaşık

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

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 ayrılır. Özellik kümesi, eğitim verilerindeki kategori kümesine göre doğrusal bir model eğitmek için kullanılır. Yeni bir açıklama, eğitim kümesindekilere ne kadar benzerse, aynı kategoriye atanma olasılığı o kadar yüksektir.

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ş katkı modellerini ve diğerlerini de kullanabilirsiniz. Görevler'de modeller hakkında daha fazla bilgi edinebilirsiniz.

Veri hazırlama

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

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 olarak nasıl uygulayabileceğinizi gösterir.

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

Modeli değerlendirme

Modelinizi eğitdikten sonra gelecekteki tahminleri ne kadar iyi yapacağınızı nasıl biliyorsunuz? ML.NET ile modelinizi bazı yeni test verilerine göre değerlendirebilirsiniz.

Her makine öğrenmesi görevi türü, test veri kümesine göre modelin doğruluğunu ve duyarlığını 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ğe 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 olduğunu ve tahmin edilen çıkış ile 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 ayarlama gerekir.

ML.NET mimarisi

Bu bölümde ML.NET mimari desenleri açıklanmaktadır. Deneyimli bir .NET geliştiricisiyseniz, bu desenlerden bazıları size tanıdık gelecek ve bazıları daha az tanıdık olacaktır.

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

Görev Katalog
Veri yükleme ve kaydetme DataOperationsCatalog
Veri hazırlama TransformsCatalog
İkili sınıflandırma BinaryClassificationCatalog
Çok sınıflı sınıflandırma MulticlassClassificationCatalog
Anomali algılama AnomalyDetectionCatalog
Kümeleme ClusteringCatalog
Tahmin ForecastingCatalog
Derecelendirme RankingCatalog
Regresyon RegressionCatalog
Öneri RecommendationCatalog
Zaman serisi TimeSeriesCatalog
Model kullanımı ModelOperationsCatalog

Yukarıdaki kategorilerin her birinde oluşturma yöntemlerine gidebilirsiniz. Visual Studio'yu kullanarak kataloglar IntelliSense aracılığıyla gösterilir.

Regresyon Eğitmenleri için IntelliSense

İşlem hattını oluşturma

Her kataloğun içinde, eğitim işlem hattı oluşturmak için kullanabileceğiniz bir uzantı yöntemleri kümesi bulunur.

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

Kod parçacığında Concatenate ve Sdca her ikisi de katalogdaki yöntemlerdir. Her biri, işlem hattına eklenmiş bir IEstimator nesnesi oluşturur.

Bu noktada, nesneler oluşturulmuştur, ancak hiçbir yürütme gerçekleşmemiştir.

Modeli eğitme

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

var model = pipeline.Fit(trainingData);

Çağırma Fit() , modelin parametrelerini tahmin etmek için giriş eğitim verilerini kullanır. Bu, modeli eğitma olarak bilinir. Daha önce gösterilen 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 bundan çok daha fazla parametre olacaktır.)

Model eğitimi hakkında daha fazla bilgi için bkz. Modelinizi eğitma.

Sonuçta elde edilen model nesnesi arabirimini ITransformer uygular. Yani model, giriş verilerini tahminlere dönüştürür.

IDataView predictions = model.Transform(inputData);

Modeli kullanma

Giriş verilerini toplu olarak tahminlere veya tek seferde bir girişe dönüştürebilirsiniz. Ev fiyatı örneği her ikisini de yaptı: modeli değerlendirmek amacıyla toplu olarak ve yeni bir tahmin yapmak için teker teker. Tek tahminde bulunmaya bakalım.

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

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

Veri modelleri ve şema

ML.NET makine öğrenmesi işlem hattının temelinde DataView nesneleri bulunur.

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

İşlem hattındaki bir dönüşümden alınan çıkış şeması bir sonraki dönüşümün giriş şemasıyla eşleşmiyorsa, 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ı, bir türü ve uzunluğu vardır. Örneğin, ev fiyatı örneğindeki giriş sütunları Boyut ve Fiyat'tır. Her ikisi de tür ve vektör olanlar yerine skaler miktarlardır.

Ev fiyatı tahmin verileriyle Veri Görünümü örneğini ML.NET

Tüm ML.NET algoritmaları vektör olan bir giriş sütunu arar. Varsayılan olarak, bu vektör sütunu Özellikler olarak adlandırılır. Bu nedenle ev fiyatı örneği, Boyut sütununu Özellikler adlı yeni bir sütunla birleştirir.

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

Tüm algoritmalar bir tahmin gerçekleştirdikten sonra yeni sütunlar da 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 birine price data özniteliğinde gösterildiği gibi Score adı verilir.

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

Farklı makine öğrenmesi görevlerinin çıkış sütunları hakkında daha fazla bilgiye Makine Öğrenmesi Görevleri kılavuzundan ulaşabilirsiniz.

DataView nesnelerinin önemli bir özelliği, bunların gevşek bir şekilde değerlendirilmeleridir. Veri görünümleri yalnızca model eğitimi ve değerlendirmesi ile veri tahmini sırasında yüklenir ve çalıştırılır. ML.NET uygulamanızı yazarken ve test ederken, Preview yöntemini çağırarak herhangi bir veri görünümü nesnesine göz atmak için Visual Studio hata ayıklayıcısını kullanabilirsiniz.

var debug = testPriceDataView.Preview();

Hata ayıklayıcıda değişkeni izleyebilir debug ve içindekileri inceleyebilirsiniz. Performansı önemli ölçüde düşürdiğinden üretim kodunda Preview yöntemini kullanmayın.

Model dağıtımı

Gerçek hayattaki uygulamalarda model eğitim ve değerlendirme kodunuz tahmininizden ayrı olacaktır. Aslında bu iki etkinlik genellikle ayrı ekipler tarafından gerçekleştirilir. Model geliştirme ekibiniz modeli tahmin uygulamasında kullanmak üzere kaydedebilir.

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

Sonraki adımlar

  • Öğreticilerde daha gerçekçi veri kümeleriyle farklı makine öğrenmesi görevlerini kullanarak uygulama oluşturmayı öğrenin.

  • Nasıl Yapılır Kılavuzları'nda belirli konular hakkında daha ayrıntılı bilgi edinin.

  • Çok istekliyseniz DOĞRUDAN API Başvurusu belgelerine göz atabilirsiniz.