Bagikan melalui


Tutorial: Mengklasifikasikan bunga iris menggunakan pengklusteran k-means dengan ML.NET

Tutorial ini menggambarkan cara menggunakan ML.NET untuk membangun model pengklusteran untuk himpunan data bunga iris .

Dalam tutorial ini, Anda mempelajari cara:

  • Memahami masalahnya
  • Pilih tugas pembelajaran mesin yang sesuai
  • Menyiapkan data
  • Memuat dan mengubah data
  • Pilih algoritma pembelajaran
  • Melatih model
  • Menggunakan model untuk prediksi

Prasyarat

Memahami masalahnya

Masalah ini adalah tentang membagi kumpulan bunga iris ke dalam kelompok yang berbeda berdasarkan karakteristik bunga. Fitur-fitur tersebut adalah panjang dan lebar sepal dan panjang dan lebar kelopak. Untuk tutorial ini, asumsikan bahwa jenis setiap bunga tidak diketahui. Anda ingin mempelajari struktur himpunan data dari fitur dan memprediksi bagaimana instans data sesuai dengan struktur ini.

Pilih tugas pembelajaran mesin yang sesuai

Karena Anda tidak tahu ke kelompok mana setiap bunga termasuk, Anda memilih tugas pembelajaran mesin tidak diawasi. Untuk membagi himpunan data dalam grup-sehingga elemen dalam grup yang sama lebih mirip satu sama lain daripada yang ada di grup lain, gunakan pengklusteran tugas pembelajaran mesin.

Membuat aplikasi konsol

  1. Buat Aplikasi Konsol C# yang disebut "IrisFlowerClustering". Klik tombol Berikutnya.

  2. Pilih .NET 8 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.

  3. Buat direktori bernama Data di proyek Anda untuk menyimpan himpunan data dan file model:

    DiPenjelajah Solusi, klik kanan proyek dan pilih TambahkanFolder Baru. Ketik "Data" dan pilih Masukkan.

  4. Instal paket nuget Microsoft.ML:

    Nota

    Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.

    Di Solution Explorer, klik kanan proyek dan pilih Kelola Paket NuGet. Pilih "nuget.org" sebagai sumber Paket, pilih tab Telusuri, cari Microsoft.ML dan pilih Instal. Pilih tombol OK pada dialog Pratinjau Perubahan lalu pilih tombol Saya Terima pada dialog Penerimaan Lisensi jika Anda setuju dengan ketentuan lisensi untuk paket yang tercantum.

Menyiapkan data

  1. Unduh himpunan data iris.data dan simpan ke folder Data yang telah Anda buat pada langkah sebelumnya. Untuk informasi selengkapnya tentang himpunan data iris, lihat halaman kumpulan data bunga Iris Wikipedia dan halaman Himpunan Data Iris , yang merupakan sumber himpunan data.

  2. Di Solution Explorer, klik kanan file iris.data dan pilih properti . Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.

File iris.data berisi lima kolom yang mewakili:

  • panjang sepal dalam sentimeter
  • lebar sepal dalam sentimeter
  • panjang petal dalam sentimeter
  • lebar petal dalam sentimeter
  • jenis bunga iris

Demi contoh pengklusteran, tutorial ini mengabaikan kolom terakhir.

Membuat kelas data

Buat kelas untuk data input dan prediksi:

  1. DiPenjelajah Solusi, klik kanan proyek, lalu pilih TambahkanItem Baru.

  2. Dalam kotak dialog Tambahkan Item Baru, pilih Kelas dan ubah bidang Nama menjadi IrisData.cs. Kemudian, pilih Tambahkan.

  3. Tambahkan arahan using berikut ke file baru:

    using Microsoft.ML.Data;
    

Hapus definisi kelas yang ada dan tambahkan kode berikut, yang menentukan kelas IrisData dan ClusterPrediction, ke file IrisData.cs:

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 adalah kelas data input dan memiliki definisi untuk setiap fitur dari himpunan data. Gunakan atribut LoadColumn untuk menentukan indeks kolom sumber dalam file himpunan data.

Kelas ClusterPrediction mewakili output model pengklusteran yang diterapkan ke instans IrisData. Gunakan atribut ColumnName untuk mengikat bidang dan ke kolom PredictedLabel dan Score masing-masing. Dalam kasus tugas pengklusteran, kolom tersebut memiliki arti berikut:

  • Kolom PredictedLabel berisi ID dari kluster yang diprediksi.
  • kolom Skor berisi array dengan jarak Euclidean kuadrat ke sentroid kluster. Panjang array sama dengan jumlah kluster.

Nota

Gunakan jenis float untuk mewakili nilai floating-point dalam kelas data input dan prediksi.

Menentukan jalur data dan model

Kembali ke file Program.cs dan tambahkan dua bidang untuk menyimpan jalur ke file himpunan data dan ke file untuk menyimpan model:

  • _dataPath berisi jalur ke file dengan himpunan data yang digunakan untuk melatih model.
  • _modelPath berisi jalur ke file tempat model terlatih disimpan.

Tambahkan kode berikut di bawah arahan using untuk menentukan jalur tersebut:

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

Membuat konteks ML

Tambahkan arahan using tambahan berikut ke bagian atas file Program.cs:

using Microsoft.ML;
using IrisFlowerClustering;

Ganti baris Console.WriteLine("Hello World!"); dengan kode berikut:

var mlContext = new MLContext(seed: 0);

Kelas Microsoft.ML.MLContext mewakili lingkungan pembelajaran mesin dan menyediakan mekanisme untuk pencatatan dan titik masuk untuk pemuatan data, pelatihan model, prediksi, dan tugas lainnya. Ini sebanding secara konseptual dengan menggunakan DbContext dalam Kerangka Kerja Entitas.

Menyiapkan pemuatan data

Tambahkan kode berikut di bawah MLContext untuk menyiapkan cara memuat data:

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

Metode ekstensi MLContext.Data.LoadFromTextFile generik menyimpulkan skema himpunan data dari jenis IrisData yang disediakan dan mengembalikan IDataView yang dapat digunakan sebagai input untuk transformator.

Membuat alur pembelajaran

Untuk tutorial ini, alur pembelajaran tugas pengklusteran terdiri dari dua langkah berikut:

  • menggabungkan kolom yang dimuat ke dalam satu kolom Fitur, yang digunakan oleh pengelola pengklusteran;
  • gunakan pelatih KMeansTrainer untuk melatih model menggunakan algoritma pengklusteran k-means++.

Tambahkan yang berikut ini setelah memuat data:

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

Kode menentukan bahwa himpunan data harus dibagi dalam tiga kluster.

Melatih model

Langkah-langkah yang ditambahkan di bagian sebelumnya menyiapkan alur untuk pelatihan, namun, tidak ada yang dijalankan. Tambahkan baris berikut di bagian bawah file untuk melakukan pemuatan data dan pelatihan model:

var model = pipeline.Fit(dataView);

Simpan model

Pada titik ini, Anda memiliki model yang dapat diintegrasikan ke dalam salah satu aplikasi .NET anda yang sudah ada atau baru. Untuk menyimpan model Anda ke file .zip, tambahkan kode berikut di bawah ini dengan memanggil metode Fit:

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

Menggunakan model untuk prediksi

Untuk membuat prediksi, gunakan kelas PredictionEngine<TSrc,TDst> yang mengambil instans jenis input melalui alur transformator dan menghasilkan instans jenis output. Tambahkan baris berikut untuk membuat instans kelas tersebut:

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine adalah API yang memudahkan, yang memungkinkan Anda melakukan prediksi pada satu instance data. PredictionEngine tidak aman untuk akses bersamaan. Dapat diterima untuk digunakan di lingkungan utas tunggal atau prototipe. Untuk meningkatkan performa dan keselamatan thread di lingkungan produksi, gunakan layanan PredictionEnginePool, yang membuat ObjectPool objek dari tipe PredictionEngine untuk digunakan di seluruh aplikasi Anda. Berikut panduan ini tentang bagaimana menggunakan PredictionEnginePool diASP.NET Core Web API.

Nota

Ekstensi layanan PredictionEnginePool saat ini sedang dalam pratayang.

Buat kelas TestIrisData untuk menampung instans data pengujian:

  1. Di Penjelajah Solusi, klik kanan pada proyek, lalu pilih Tambah>Item Baru.

  2. Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi TestIrisData.cs. Kemudian, pilih Tambahkan.

  3. Ubah kelas menjadi statis seperti dalam contoh berikut:

    static class TestIrisData
    

Tutorial ini memperkenalkan satu instans data iris dalam kelas ini. Anda dapat menambahkan skenario lain untuk bereksperimen dengan model. Tambahkan kode berikut ke kelas TestIrisData:

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

Untuk mengetahui kluster tempat item yang ditentukan berada, kembali ke file Program.cs dan tambahkan kode berikut di bagian bawah file:

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

Jalankan program untuk melihat kluster mana yang berisi instans data yang ditentukan dan jarak kuadrat dari instans tersebut ke sentroid kluster. Hasil Anda harus mirip dengan yang berikut ini:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Selamat! Anda sekarang telah berhasil membangun model pembelajaran mesin untuk pengklusteran iris dan menggunakannya untuk membuat prediksi. Anda dapat menemukan kode sumber untuk tutorial ini di dotnet/samples repositori GitHub.

Langkah berikutnya

Dalam tutorial ini, Anda belajar cara:

  • Memahami masalahnya
  • Pilih tugas pembelajaran mesin yang sesuai
  • Menyiapkan data
  • Memuat dan mengubah data
  • Pilih algoritma pembelajaran
  • Melatih model
  • Menggunakan model untuk prediksi

Lihat repositori GitHub dotnet/machinelearning untuk terus mempelajari dan menemukan lebih banyak sampel.