Apa itu ML.NET dan bagaimana cara kerjanya?

ML.NET memberi Anda kemampuan untuk menambahkan pembelajaran mesin ke aplikasi .NET, baik dalam skenario online atau offline. Dengan kemampuan ini, Anda dapat membuat prediksi otomatis menggunakan data yang tersedia untuk aplikasi Anda. Aplikasi pembelajaran mesin memanfaatkan pola dalam data untuk membuat prediksi daripada perlu diprogram secara eksplisit.

Pusat ML.NET adalah model pembelajaran mesin. Model menentukan langkah-langkah yang diperlukan untuk mengubah data input Anda menjadi prediksi. Dengan ML.NET, Anda dapat melatih model kustom dengan menentukan algoritma, atau Anda dapat mengimpor model TensorFlow dan ONNX yang telah dilatih sebelumnya.

Setelah memiliki model, Anda dapat menambahkannya ke aplikasi Anda untuk membuat prediksi.

ML.NET berjalan di Windows, Linux, dan macOS menggunakan .NET, atau di Windows menggunakan .NET Framework. 64 bit didukung pada semua platform. 32 bit didukung pada Windows, kecuali untuk fungsionalitas terkait TensorFlow, LightGBM, dan ONNX.

Tabel berikut ini memperlihatkan contoh jenis prediksi yang bisa Anda buat dengan ML.NET.

Jenis prediksi Contoh
Klasifikasi/Kategorisasi Bagi umpan balik pelanggan secara otomatis menjadi kategori positif dan negatif.
Regresi/Prediksi nilai berkelanjutan Prediksi harga rumah berdasarkan ukuran dan lokasi.
Deteksi Anomali Mendeteksi transaksi perbankan penipuan.
Rekomendasi Sarankan produk yang mungkin ingin dibeli pembeli online, berdasarkan pembelian mereka sebelumnya.
Rangkaian waktu/data berurutan Prakiraan cuaca atau penjualan produk.
Klasifikasi gambar Mengategorikan patologi dalam gambar medis.
Klasifikasi teks Mengategorikan dokumen berdasarkan kontennya.
Kesamaan kalimat Mengukur seberapa mirip dua kalimat.

Halo dunia ML.NET

Kode dalam cuplikan berikut menunjukkan aplikasi ML.NET paling sederhana. Contoh ini membangun model regresi linier untuk memprediksi harga rumah menggunakan ukuran rumah dan data harga.

   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
       }
   }

Alur kerja kode

Diagram berikut mewakili struktur kode aplikasi, serta proses iteratif pengembangan model:

  • Mengumpulkan dan memuat data pelatihan ke dalam objek IDataView
  • Tentukan alur operasi untuk mengekstrak fitur dan menerapkan algoritma pembelajaran mesin
  • Melatih model dengan memanggil Fit() pada alur
  • Mengevaluasi model dan melakukan iterasi untuk meningkatkan
  • Simpan model ke dalam format biner, untuk digunakan dalam aplikasi
  • Memuat kembali model ke objek ITransformer
  • Buat prediksi dengan memanggil CreatePredictionEngine.Predict()

ML.NET alur pengembangan aplikasi termasuk komponen untuk pembuatan data, pengembangan alur, pelatihan model, evaluasi model, dan penggunaan model

Mari kita menggali sedikit lebih dalam ke dalam konsep-konsep tersebut.

Model pembelajaran mesin

Model ML.NET adalah objek yang berisi transformasi untuk dilakukan pada data input Anda untuk tiba di output yang diprediksi.

Dasar

Model paling dasar adalah regresi linier dua dimensi, di mana satu kuantitas berkelanjutan sebanding dengan yang lain, seperti dalam contoh harga rumah di atas.

Model Regresi Linier dengan parameter bias dan berat

Modelnya sederhana: $Price = b + Ukuran * w$. Parameter $b$ dan $w$ diperkirakan dengan memasang baris pada satu set pasangan (ukuran, harga). Data yang digunakan untuk menemukan parameter model disebut data pelatihan. Input model pembelajaran mesin disebut fitur. Dalam contoh ini, $Size$ adalah satu-satunya fitur. Nilai kebenaran dasar yang digunakan untuk melatih model pembelajaran mesin disebut label. Di sini, nilai $Price$ dalam himpunan data pelatihan adalah label.

Lebih kompleks

Model yang lebih kompleks mengklasifikasikan transaksi keuangan ke dalam kategori menggunakan deskripsi teks transaksi.

Setiap deskripsi transaksi dipecah menjadi sekumpulan fitur dengan menghapus kata dan karakter yang berlebihan, dan menghitung kombinasi kata dan karakter. Set fitur digunakan untuk melatih model linier berdasarkan serangkaian kategori dalam data pelatihan. Semakin mirip deskripsi baru dengan yang ada di set pelatihan, semakin besar kemungkinan akan ditetapkan ke kategori yang sama.

Model Klasifikasi Teks

Baik model harga rumah maupun model klasifikasi teks adalah model linier . Bergantung pada sifat data Anda dan masalah yang Anda atasi, Anda juga dapat menggunakan model pohon keputusan, model aditif umum, dan lainnya. Anda dapat mengetahui selengkapnya tentang model di Tugas.

Penyiapan data

Dalam kebanyakan kasus, data yang Anda miliki tersedia tidak cocok untuk digunakan langsung untuk melatih model pembelajaran mesin. Data mentah perlu disiapkan, atau diproses sebelumnya, sebelum dapat digunakan untuk menemukan parameter model Anda. Data Anda mungkin perlu dikonversi dari nilai string ke representasi numerik. Anda mungkin memiliki informasi berlebihan dalam data input Anda. Anda mungkin perlu mengurangi atau memperluas dimensi data input Anda. Data Anda mungkin perlu dinormalisasi atau diskalakan.

Tutorial ML.NET mengajarkan Anda tentang alur pemrosesan data yang berbeda untuk data teks, gambar, numerik, dan rangkaian waktu yang digunakan untuk tugas pembelajaran mesin tertentu.

Cara menyiapkan data menunjukkan kepada Anda cara menerapkan persiapan data secara lebih umum.

Anda dapat menemukan lampiran semua transformasi yang tersedia di bagian sumber daya.

Evaluasi model

Setelah Anda melatih model Anda, bagaimana Anda tahu seberapa baik itu akan membuat prediksi di masa depan? Dengan ML.NET, Anda dapat mengevaluasi model terhadap beberapa data pengujian baru.

Setiap jenis tugas pembelajaran mesin memiliki metrik yang digunakan untuk mengevaluasi akurasi dan presisi model terhadap himpunan data pengujian.

Untuk contoh harga rumah kami, kami menggunakan tugas Regresi . Untuk mengevaluasi model, tambahkan kode berikut ke sampel asli.

        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

Metrik evaluasi memberi tahu Anda bahwa kesalahannya adalah ish rendah, dan korelasi antara output yang diprediksi dan output pengujian tinggi. Itu mudah! Dalam contoh nyata, dibutuhkan lebih banyak penyetelan untuk mencapai metrik model yang baik.

arsitektur ML.NET

Bagian ini menjelaskan pola arsitektur ML.NET. Jika Anda adalah pengembang .NET yang berpengalaman, beberapa pola ini akan akrab bagi Anda, dan beberapa akan kurang akrab.

Aplikasi ML.NET dimulai dengan MLContext objek. Objek singleton ini berisi katalog. Katalog adalah pabrik untuk pemuatan dan penyimpanan data, transformasi, pelatih, dan komponen operasi model. Setiap objek katalog memiliki metode untuk membuat berbagai jenis komponen.

Tugas Katalog
Pemuatan dan penyimpanan data DataOperationsCatalog
Penyiapan data TransformsCatalog
Klasifikasi biner BinaryClassificationCatalog
Klasifikasi multikelas MulticlassClassificationCatalog
Deteksi anomali AnomalyDetectionCatalog
Pengklusteran ClusteringCatalog
Prakiraan ForecastingCatalog
Peringkat teratas RankingCatalog
Regresi RegressionCatalog
Rekomendasi RecommendationCatalog
Deret waktu TimeSeriesCatalog
Penggunaan model ModelOperationsCatalog

Anda dapat menavigasi ke metode pembuatan di setiap kategori di atas. Menggunakan Visual Studio, katalog muncul melalui IntelliSense.

Intellisense untuk Pelatih Regresi

Membangun alur

Di dalam setiap katalog adalah sekumpulan metode ekstensi yang dapat Anda gunakan untuk membuat alur pelatihan.

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

Dalam cuplikan, Concatenate dan Sdca keduanya adalah metode dalam katalog. Mereka masing-masing membuat objek IEstimator yang ditambahkan ke alur.

Pada titik ini, objek telah dibuat, tetapi tidak ada eksekusi yang terjadi.

Melatih model

Setelah objek dalam alur dibuat, data dapat digunakan untuk melatih model.

var model = pipeline.Fit(trainingData);

Fit() Panggilan menggunakan data pelatihan input untuk memperkirakan parameter model. Ini dikenal sebagai pelatihan model. Ingat, model regresi linier yang ditampilkan sebelumnya memiliki dua parameter model: bias dan berat. Fit() Setelah panggilan, nilai parameter diketahui. (Sebagian besar model akan memiliki lebih banyak parameter daripada ini.)

Anda dapat mempelajari selengkapnya tentang pelatihan model di Cara melatih model Anda.

Objek model yang dihasilkan mengimplementasikan ITransformer antarmuka. Artinya, model mengubah data input menjadi prediksi.

IDataView predictions = model.Transform(inputData);

Menggunakan model

Anda dapat mengubah data input menjadi prediksi secara massal, atau satu input pada satu waktu. Contoh harga rumah melakukan keduanya: secara massal untuk tujuan mengevaluasi model, dan satu per satu untuk membuat prediksi baru. Mari kita lihat membuat prediksi tunggal.

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

Metode ini CreatePredictionEngine() mengambil kelas input dan kelas output. Nama bidang atau atribut kode menentukan nama kolom data yang digunakan selama pelatihan dan prediksi model. Untuk informasi selengkapnya, lihat Membuat prediksi dengan model terlatih.

Model dan skema data

Inti dari alur pembelajaran mesin ML.NET adalah objek DataView .

Setiap transformasi dalam alur memiliki skema input (nama data, jenis, dan ukuran yang diharapkan transformasi untuk dilihat pada inputnya); dan skema output (nama data, jenis, dan ukuran yang dihasilkan transformasi setelah transformasi).

Jika skema output dari satu transformasi dalam alur tidak cocok dengan skema input transformasi berikutnya, ML.NET akan melemparkan pengecualian.

Objek tampilan data memiliki kolom dan baris. Setiap kolom memiliki nama dan jenis dan panjang. Misalnya, kolom input dalam contoh harga rumah adalah Ukuran dan Harga. Keduanya adalah jenis dan mereka adalah jumlah skalar daripada yang vektor.

ML.NET contoh Tampilan Data dengan data prediksi harga rumah

Semua algoritma ML.NET mencari kolom input yang merupakan vektor. Secara default, kolom vektor ini disebut Fitur. Itulah sebabnya contoh harga rumah menggabungkan kolom Ukuran ke dalam kolom baru yang disebut Fitur.

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

Semua algoritma juga membuat kolom baru setelah melakukan prediksi. Nama tetap kolom baru ini bergantung pada jenis algoritma pembelajaran mesin. Untuk tugas regresi, salah satu kolom baru disebut Skor seperti yang ditunjukkan pada atribut data harga.

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

Anda dapat mengetahui selengkapnya tentang kolom output tugas pembelajaran mesin yang berbeda dalam panduan Tugas Pembelajaran Mesin.

Properti penting objek DataView adalah bahwa objek tersebut dievaluasi dengan malas. Tampilan data hanya dimuat dan dioperasikan selama pelatihan dan evaluasi model, dan prediksi data. Saat menulis dan menguji aplikasi ML.NET, Anda dapat menggunakan debugger Visual Studio untuk mengintip objek tampilan data apa pun dengan memanggil metode Pratinjau .

var debug = testPriceDataView.Preview();

Anda dapat menonton debug variabel di debugger dan memeriksa kontennya. Jangan gunakan metode Pratinjau dalam kode produksi, karena secara signifikan menurunkan performa.

Penyebaran model

Dalam aplikasi kehidupan nyata, kode pelatihan dan evaluasi model Anda akan terpisah dari prediksi Anda. Bahkan, kedua kegiatan ini sering dilakukan oleh tim terpisah. Tim pengembangan model Anda dapat menyimpan model untuk digunakan dalam aplikasi prediksi.

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

Langkah berikutnya

  • Pelajari cara membangun aplikasi menggunakan tugas pembelajaran mesin yang berbeda dengan himpunan data yang lebih realistis dalam tutorial.

  • Pelajari tentang topik tertentu secara lebih mendalam di Panduan Cara.

  • Jika Anda sangat tertarik, Anda dapat langsung menyelami dokumentasi Referensi API.