Aracılığıyla paylaş


Öğretici: ML.NET ile k ortalamalar kümeleme kullanarak iris çiçeklerini kategorilere ayırma

Bu öğreticide, iris çiçek veri kümesi için bir kümeleme modeli oluşturmak üzere ML.NET nasıl kullanılacağı gösterilmektedir.

Bu öğreticide şunların nasıl yapıldığı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ğitme
  • Tahminler için modeli kullanma

Önkoşullar

Sorunu anlama

Bu sorun, iris çiçeklerini çiçek özelliklerine göre farklı gruplara bölmekle ilgili. Bu özellikler, bir sepyanın uzunluğu ve genişliği ile bir yaprakların 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. Bir veri kümesini, aynı gruptaki öğelerin diğer gruplardakilere göre birbirine daha benzer şekilde gruplara bölmek için bir kümeleme makine öğrenmesi görevi kullanın.

Konsol uygulaması oluşturma

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

    Çözüm Gezgini'da projeye sağ tıklayın veYeni Klasör Ekle'yi> seçin. "Veri" yazın ve Enter tuşuna basın.

  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 projeye sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paket kaynağı olarak "nuget.org" öğesini seçin, Gözat sekmesini seçin, Microsoft.ML arayın ve Yükle düğmesini seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusundaki Tamam düğmesini ve ardından Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin.

Verileri hazırlama

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

  2. Çözüm Gezgini'dairis.data dosyasına sağ tıklayın ve Özellikler'i seçin. Gelişmiş'in altında, Çıkış Dizinine Kopyala değerini Daha yeniyse Kopyala olarak 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 petal genişliği
  • iris çiçeği türü

Kümeleme örneğinin iyiliğ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'da projeye sağ tıklayın ve ardındanYeni Öğe Ekle'yi> seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını IrisData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

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

    using Microsoft.ML.Data;
    

Mevcut sınıf tanımını kaldırın ve ve ClusterPredictionsınıflarını IrisData tanımlayan aşağıdaki kodu IrisData.cs dosyasına 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.

sınıfı, ClusterPrediction bir IrisData örneğe uygulanan kümeleme modelinin çıkışını temsil eder. ve Distances alanlarını sırasıyla PredictedLabel ve Score sütunlarına bağlamak PredictedClusterId 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.
  • Puan sütunu, küme centroid'lerine uzaklıkları Öklid karesi olan bir dizi içerir. Dizi uzunluğu küme sayısına eşittir.

Not

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

Veri ve model yollarını tanımlama

Program.cs dosyasına Geri dö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 deyimlerinin 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önergeleri 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üğe kaydetmeye ve giriş noktalarına yönelik mekanizmalar sağlar. Bu, kavramsal olarak Entity Framework'te kullanmakla DbContext karşılaştırılabilir.

Veri yüklemeyi ayarlama

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

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

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

Öğ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ütunuyla birleştirin;
  • k-means++ kümeleme algoritmasını kullanarak modeli eğitmek için bir KMeansTrainer eğitmen 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ğitme

Önceki bölümlerde eklenen adımlar işlem hattını eğitim için hazırladı, ancak hiçbiri yürütüldü. 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 yöntemini çağırarak Fit 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 sınıfını kullanın PredictionEngine<TSrc,TDst> . 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 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.

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

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardındanYeni Öğe Ekle'yi> seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını TestIrisData.cs olarak değiştirin. Ardından Ekle düğmesini 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ıf içinde bir iris veri örneği tanıtılır. Modelle deneme yapmak için başka senaryolar ekleyebilirsiniz. Sınıfına aşağıdaki kodu TestIrisData 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 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 centroid'lerine 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ümeleme için başarıyla bir makine öğrenmesi modeli oluşturdunuz ve tahminlerde bulunmak için bunu kullandınız. Bu öğreticinin kaynak kodunu dotnet/samples GitHub deposunda bulabilirsiniz.

Sonraki adımlar

Bu öğreticide, şunların nasıl yapıldığı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ğitme
  • Tahminler için modeli kullanma

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