Aracılığıyla paylaş


Kılavuz: ML.NET ile k-means kümeleme kullanarak iris çiçeklerini kategorilere ayırma

Bu öğreticide, ML.NET'i kullanarakiris çiçek veri kümesi için kümeleme modeli nasıl oluşturacağınızı gösteriyoruz.

Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:

  • Sorunu anlama
  • Uygun makine öğrenmesi görevini seçin
  • Verileri hazırlama
  • Verileri yükleme ve dönüştürme
  • Öğrenme algoritması seçme
  • Modeli eğitin
  • Tahminler için modeli kullanma

Önkoşullar

Sorunu anlama

Bu sorun, iris çiçek kümesini çiçek özelliklerine göre farklı gruplara bölmekle ilgili. Bu özellikler sepalin uzunluğu ve genişliği ile petalin uzunluğu ve genişliğidir. Bu öğreticide, her çiçeğin türünün bilinmediğini varsayalım. Özelliklerden bir veri kümesinin yapısını öğrenmek ve bir veri örneğinin bu yapıya nasıl uyduğunu tahmin etmek istiyorsunuz.

Uygun makine öğrenmesi görevini seçin

Her çiçeğin hangi gruba ait olduğunu bilmediğiniz için denetimsiz makine öğrenmesi görevini seçersiniz. Veri kümesini, aynı gruptaki öğelerin diğer gruplardakilere göre birbirine daha benzer olacak şekilde gruplara ayırmak için kümeleme makine öğrenmesi görevini kullanın.

Konsol uygulaması oluşturma

  1. "IrisFlowerClustering" adlı bir C# Konsol Uygulaması oluşturun. sonraki 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ümesini ve model dosyalarını depolamak için projenizde Data adlı bir dizin oluşturun:

    Çözüm Gezgini'nde projeye sağ tıklayın ve Ekle>Yeni Klasörseçin. "Veri" yazın ve seçin, ardındangirin.

  4. Microsoft.ML NuGet paketini yükleyin:

    Not (Hatırlatma)

    Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    Çözüm Gezginibölümünde projeye sağ tıklayın ve NuGet Paketlerini Yönetseçin. Paket kaynağı olarak "nuget.org" öğesini seçin, Gözat sekmesini seçin, Microsoft.ML arayın ve Yükle'yi seçin. Değişiklikleri Önizleme iletişim Tamam düğmesini seçin ve listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans Kabulü iletişim kutusundaki Kabul Ediyorum düğmesini seçin.

Verileri hazırlama

  1. iris.data veri kümesini indirin ve önceki adımda oluşturduğunuz Data klasörüne kaydedin. iris veri kümesi hakkında daha fazla bilgi için Wikipedia sayfası Iris çiçek veri kümesi sayfasına ve veri kümesinin kaynağı olan Iris Veri Kümesi sayfasına bakın.

  2. Çözüm Gezgini'nde iris.data dosyasına sağ tıklayın ve Özellikler'i seçin. Gelişmişaltında, Çıktı Dizinine Kopyala değerini Daha Yeniyse Kopyalaolarak değiştirin.

iris.data dosyası aşağıdakileri temsil eden beş sütun içerir:

  • santimetre cinsinden sepal uzunluk
  • santimetre cinsinden sepal genişlik
  • santimetre cinsinden petal uzunluğu
  • santimetre cinsinden taçyaprağı genişliği
  • iris çiçeği türü

Kümeleme örneği için bu öğreticide son sütun yoksayılır.

Veri sınıfları oluşturma

Giriş verileri ve tahminler için sınıflar oluşturun:

  1. Çözüm Gezgini'nde projeye sağ tıklayın ve ardından >Yeni ÖğeEkle'yi seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf seçin ve Adı alanını IrisData.csolarak değiştirin. Ardından Ekleöğesini seçin.

  3. Yeni dosyaya aşağıdaki using yönergesini ekleyin:

    using Microsoft.ML.Data;
    

Mevcut sınıf tanımını kaldırın ve IrisData.cs dosyasına IrisData ve ClusterPredictionsınıflarını tanımlayan aşağıdaki kodu ekleyin:

public class IrisData
{
    [LoadColumn(0)]
    public float SepalLength;

    [LoadColumn(1)]
    public float SepalWidth;

    [LoadColumn(2)]
    public float PetalLength;

    [LoadColumn(3)]
    public float PetalWidth;
}

public class ClusterPrediction
{
    [ColumnName("PredictedLabel")]
    public uint PredictedClusterId;

    [ColumnName("Score")]
    public float[]? Distances;
}

IrisData giriş veri sınıfıdır ve veri kümesindeki her özellik için tanımlara sahiptir. Veri kümesi dosyasındaki kaynak sütunların dizinlerini belirtmek için LoadColumn özniteliğini kullanın.

ClusterPrediction sınıfı, bir IrisData örneğine uygulanan kümeleme modelinin çıkışını temsil eder. PredictedClusterId ve Distances alanlarını sırasıyla PredictedLabel ve Score sütunlarına bağlamak için ColumnName özniteliğini kullanın. Kümeleme görevi söz konusu olduğunda bu sütunlar şu anlama gelir:

  • PredictedLabel sütunu, tahmin edilen kümenin kimliğini içerir.
  • Score sütunu, küme merkezlerine olan Öklid uzaklıklarının karelerine sahip bir dizi içerir. Dizi uzunluğu küme sayısına eşittir.

Not

Giriş ve tahmin veri sınıflarındaki kayan nokta değerlerini göstermek için float türünü kullanın.

Veri ve model yollarını tanımlama

Program.cs dosyasına geri dönün ve veri kümesi dosyasının yollarını tutmak ve modeli kaydetmek için dosyaya iki alan ekleyin:

  • _dataPath, modeli eğitmek için kullanılan veri kümesini içeren dosyanın yolunu içerir.
  • _modelPath, eğitilen modelin depolandığı dosyanın yolunu içerir.

Bu yolları belirtmek için using yönergelerinin altına aşağıdaki kodu ekleyin:

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

ML bağlamı oluşturma

aşağıdaki ek using yönergelerini Program.cs dosyasının en üstüne ekleyin:

using Microsoft.ML;
using IrisFlowerClustering;

Console.WriteLine("Hello World!"); satırını aşağıdaki kodla değiştirin:

var mlContext = new MLContext(seed: 0);

Microsoft.ML.MLContext sınıfı, makine öğrenmesi ortamını temsil eder ve veri yükleme, model eğitimi, tahmin ve diğer görevler için günlük kaydı yapma ve giriş noktaları sağlama mekanizmaları sunar. Bu, Entity Framework'te DbContext kullanmakla kavramsal olarak karşılaştırılabilir.

Veri yüklemeyi ayarlama

Veri yükleme yolunu ayarlamak için aşağıdaki kodu MLContext altına ekleyin:

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

Genel MLContext.Data.LoadFromTextFile uzantısı yöntemi sağlanan IrisData türünden veri kümesi şemasını çıkarsar ve transformatörler için giriş olarak kullanılabilecek IDataView döndürür.

Öğrenme işlem hattı oluşturma

Bu öğreticide, kümeleme görevinin öğrenme işlem hattı aşağıdaki iki adımdan oluşur:

  • yüklenen sütunları kümeleme eğitmeni tarafından kullanılan bir Özellikler sütununa birleştirin;
  • k-means++ kümeleme algoritmasını kullanarak modeli eğitmek için bir KMeansTrainer eğitmeni kullanın.

Verileri yükledikten sonra aşağıdakileri ekleyin:

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

Kod, veri kümesinin üç kümeye bölünmesi gerektiğini belirtir.

Modeli eğitin

Önceki bölümlerde eklenen adımlar işlem hattını eğitim için hazırlamıştır, ancak hiçbiri yürütüllenmemiştir. Veri yükleme ve model eğitimi gerçekleştirmek için dosyanın en altına aşağıdaki satırı ekleyin:

var model = pipeline.Fit(dataView);

Modeli kaydetme

Bu noktada, mevcut veya yeni .NET uygulamalarınızla tümleştirilebilen bir modeliniz vardır. Modelinizi bir .zip dosyasına kaydetmek için aşağıdaki kodu Fit yöntemini çağırarak ekleyin:

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

Tahminler için modeli kullanma

Tahminler yapmak için transformatör işlem hattı aracılığıyla giriş türünün örneklerini alan ve çıkış türünün örneklerini üreten PredictionEngine<TSrc,TDst> sınıfını kullanın. Bu sınıfın bir örneğini oluşturmak için aşağıdaki satırı ekleyin:

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(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ı uygundur. Üretim ortamlarında performansı ve iş parçacığı güvenliğini artırmak için, uygulamanız genelinde kullanılabilecek PredictionEngine nesnelerden ObjectPool oluşturan PredictionEnginePool hizmetini kullanın. ASP.NET Core Web API' kullanma hakkında bu kılavuza bakın.

Not

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

Test verileri örneklerini barındıracak TestIrisData sınıfını oluşturun:

  1. Çözüm Gezginiiçinde projeye sağ tıklayın ve Yeni Öğe Ekle>'iseçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf seçin ve Adı alanını TestIrisData.csolarak değiştirin. Ardından Ekleöğesini seçin.

  3. sınıfını aşağıdaki örnekte olduğu gibi statik olacak şekilde değiştirin:

    static class TestIrisData
    

Bu öğreticide bu sınıfta bir iris veri örneği tanıtılır. Modelle deneme yapmak için başka senaryolar da ekleyebilirsiniz. TestIrisData sınıfına aşağıdaki kodu ekleyin:

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

Belirtilen öğenin ait olduğu kümeyi bulmak için Program.cs dosyasına dönün ve dosyanın en altına aşağıdaki kodu ekleyin:

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

Belirtilen veri örneğini hangi kümenin içerdiğini ve bu örnekten küme centroidlerine uzaklıkların karesini görmek için programı çalıştırın. Sonuçlarınız aşağıdakine benzer olmalıdır:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Tebrikler! Artık iris kümelemeye yönelik bir makine öğrenmesi modelini başarıyla oluşturdunuz ve tahminlerde bulunmak için kullandınız. Bu öğreticinin kaynak kodunu dotnet/samples GitHub deposunda bulabilirsiniz.

Sonraki adımlar

Bu öğreticide şunların nasıl yapılacağını öğrendiniz:

  • Sorunu anlama
  • Uygun makine öğrenmesi görevini seçin
  • Verileri hazırlama
  • Verileri yükleme ve dönüştürme
  • Öğrenme algoritması seçme
  • Modeli eğitin
  • Tahminler için modeli kullanma

Öğrenmeye devam etmek ve daha fazla örnek bulmak için dotnet/machinelearning GitHub deposuna göz atın.

Dotnet/machinelearning GitHub deposunu