Öğ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
"IrisFlowerClustering" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.
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.
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
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.
Çö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:
Çö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ı IrisData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.
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 ClusterPrediction
sı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 PredictionEnginePool
PredictionEngine
tamamında kullanmak üzere bir ObjectPool
nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePool
hakkı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:
Çö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ı TestIrisData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.
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.