Hi Rekan Makers,
Ini adalah artikel berseri yang membahas tentang penggunaan ML.NET untuk membangun model machine learning. Jika rekan-rekan ingin memahami fungsi keseluruhan ML.NET mungkin bisa melihat artikel terdahulu disini.
Kali ini kita akan mencoba membuat Model ML untuk melakukan prediksi penggunaan bahan bakar berdasarkan beberapa faktor, dataset yang akan kita gunakan adalah Auto MPG, dataset ini diambil dari StatLib library yang maintain oleh Carnegie Mellon University.
Dataset ini memiliki beberapa attribute antara lain:
- mpg: ini menunjukan jumlah penggunaan bahan bakar dalam kota (mil per-galon), ini menjadi label
- cylinders: attribut ini menjadi features
- displacement:atribut ini menjadi features
- horsepower: attribut ini menjadi features
- weight: attribut ini menjadi features
- acceleration: attribut ini menjadi features
- model year: attribut ini menjadi features
- origin: attribut ini menjadi features
- car name: attribut ini tidak digunakan, karena tidak memiliki korelasi signifikan terhadap label
selanjutnya, rekan-rekan memastikan sudah menginstall .NET Core / .NET Framework versi terakhir, dalam artikel ini saya menggunakan .NET Core versi 2.2. Jika belum silakan download disini. Jika belum memiliki IDE silakan download visual studio and vs code.
Langkah pertama silakan buat project baru dengan tipe console application. Kalau dengan dengan .net core bisa menggunakan CLI, silakan buka terminal atau command line (cmd.exe). Lalu ketik:
mkdir MpgPredictorApp
Lalu masuk ke folder yang baru dibuat dengan mengetik:
cd MpgPredictorApp
Selanjutnya buat aplikasi console dengan mengetik:
dotnet new console
Kita perlu menambahkan nuget package ML.NET dan algoritma FastLearner dengan mengetik:
dotnet add package Microsoft.ML dotnet add package Microsoft.ML.Trainers.FastTree
Kemudian buatlah folder dengan nama “Data” dengan mengetik:
mkdir Data
Lalu download file csv dari link ini, dan masukan ke folder “Data” tersebut.
Kemudian buka dengan visual studio code folder “MpgPredictorApp”, bisa juga dengan mengetik:
code .
Nah silakan buka file Program.cs, oh ya jika temen-temen belum menginstall extension tuk C# install disini
pada Program.cs masukan namespace ML.NET dengan mengetik pada bagian atas:
using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Trainers.FastTree; using System.IO; using System.Collections.Generic; using System.Linq;
Lalu kita buatkan data class, buat file baru dengan nama “ModelInput.cs” dan isi dengan:
using System; using System.Collections.Generic; using System.Text; using Microsoft.ML.Data; namespace MpgPredictorApp { public class ModelInput { [ColumnName("mpg"), LoadColumn(0)] public float Mpg { get; set; } [ColumnName("cylinders"), LoadColumn(1)] public float Cylinders { get; set; } [ColumnName("displacement"), LoadColumn(2)] public float Displacement { get; set; } [ColumnName("horsepower"), LoadColumn(3)] public float Horsepower { get; set; } [ColumnName("weight"), LoadColumn(4)] public float Weight { get; set; } [ColumnName("acceleration"), LoadColumn(5)] public float Acceleration { get; set; } [ColumnName("model_year"), LoadColumn(6)] public float Model_year { get; set; } [ColumnName("origin"), LoadColumn(7)] public float Origin { get; set; } [ColumnName("car_name"), LoadColumn(8)] public string Car_name { get; set; } } }
Class ini memapping kolom dari CSV yang kita gunakan sebagai file training.
lalu buka file “ModelOutput.cs” dan isi dengan:
using System; using System.Collections.Generic; using System.Text; namespace MpgPredictorApp { public class ModelOutput { public float Score { get; set; } } }
Class ini digunakan untuk menyimpan hasil prediksi
Dalam class program masukan beberapa deklarasi variabel:
static string TRAIN_DATA_FILEPATH = @"auto-mpg.data.csv"; static string modelRelativePath = "MLModel.zip";
Lalu kembali ke Program.cs, pada void Main masukan baris ini:
var DataDir = new DirectoryInfo(GetAbsolutePath(@"..\..\..\Data")); MLContext mlContext = new MLContext(seed: 1); // Load Data IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>( path: Path.Combine(DataDir.FullName, TRAIN_DATA_FILEPATH), hasHeader: true, separatorChar: ',', allowQuoting: true, allowSparse: false);
Semua kode untuk melakukan training dan evaluasi menggunakan object MLContext, ini adalah pipeline yang digunakan untuk keseluruhan proses. Selanjutnya kode diatas melakukan loading data dari file csv, lalu selanjutkan masukan kode ini dibawahnya:
// Data process configuration with pipeline data transformations var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", new[] { "cylinders", "displacement", "horsepower", "weight", "acceleration", "model_year", "origin" }); // Set the training algorithm var trainer = mlContext.Regression.Trainers.FastTree(new FastTreeRegressionTrainer.Options() { NumberOfLeaves = 6, MinimumExampleCountPerLeaf = 1, NumberOfTrees = 500, LearningRate = 0.08338325f, Shrinkage = 0.08298761f, LabelColumnName = "mpg", FeatureColumnName = "Features" }); var trainingPipeline = dataProcessPipeline.Append(trainer); ITransformer model = trainingPipeline.Fit(trainingDataView);
Kode diatas digunakan untuk memilih kolom-kolom yang dijadikan features, karena semua sudah berbentuk numerik langsung dapat digabungkan menjadi 1 kolom features dengan tipe vektor. Setelah itu kita masukan algoritma ML yang kita pilih yaitu FastTree, dan set label kolom ke kolom “mpg”. Lalu untuk memulai proses training kita panggil method Fit. Ini akan memakan waktu beberapa detik untuk eksekusi. Lalu masukan kode berikut:
mlContext.Model.Save(model, trainingDataView.Schema, GetAbsolutePath(modelRelativePath));
Kode ini digunakan untuk menyimpan model ke dalam file binary. Sebenarnya file ini adalah zip file yang menyimpan data hasil training dan beberapa metadata. Lalu kita dapat melakukan evaluasi dari model yang dihasilkan dengan kode berikut:
var crossValidationResults = mlContext.Regression.CrossValidate(trainingDataView, trainingPipeline, numberOfFolds: 5, labelColumnName: “mpg”);
PrintRegressionFoldsAverageMetrics(crossValidationResults);
Kode diatas digunakan untuk mengevaluasi performa dari model, alternatif lain dengan kode berikut:
var result = model.Transform(trainingDataView);
var metric = mlContext.Regression.Evaluate(result, labelColumnName: “mpg”);
Console.WriteLine($”r-sq: {metric.RSquared}”);
Console.WriteLine($”RMS: {metric.RootMeanSquaredError}”);
Metric R-squared berisi nilai 0-1, semakin mendekati 1 semakin akurat model kita. Sedangkan, Root Mean Squared semakin rendah nilainya semakin baik. Lalu kita bisa melakukan prediksi dengan kode berikut:
ITransformer mlModel = mlContext.Model.Load(GetAbsolutePath(modelRelativePath), out DataViewSchema inputSchema); var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel); ModelInput sampleData = mlContext.Data.CreateEnumerable<ModelInput>(trainingDataView, false).First(); // Try a single prediction ModelOutput predictionResult = predEngine.Predict(sampleData); Console.WriteLine($"Single Prediction --> Actual value: {sampleData.Mpg} | Predicted value: {predictionResult.Score}");
Pada kode diatas, kita mencoba meload model yang sudah disave sebelumnya, lalu kita membuat objek prediction engine untuk melakukan inferensi. Lalu kita ambil 1 row data dari data training untuk ujicoba. Lalu kita panggil method Predict untuk menghasilkan prediksi dan kita komparasi dengan hasil aktualnya. Cukup mendekati bukan hasilnya ? Dan untuk menjalankan aplikasi ini tanpa error rekan-rekan perlu tambahkan 2 method berikut:
public static void PrintRegressionFoldsAverageMetrics(IEnumerable<TrainCatalogBase.CrossValidationResult<RegressionMetrics>> crossValidationResults) { var L1 = crossValidationResults.Select(r => r.Metrics.MeanAbsoluteError); var L2 = crossValidationResults.Select(r => r.Metrics.MeanSquaredError); var RMS = crossValidationResults.Select(r => r.Metrics.RootMeanSquaredError); var lossFunction = crossValidationResults.Select(r => r.Metrics.LossFunction); var R2 = crossValidationResults.Select(r => r.Metrics.RSquared); Console.WriteLine($"*************************************************************************************************************"); Console.WriteLine($"* Metrics for Regression model "); Console.WriteLine($"*------------------------------------------------------------------------------------------------------------"); Console.WriteLine($"* Average L1 Loss: {L1.Average():0.###} "); Console.WriteLine($"* Average L2 Loss: {L2.Average():0.###} "); Console.WriteLine($"* Average RMS: {RMS.Average():0.###} "); Console.WriteLine($"* Average Loss Function: {lossFunction.Average():0.###} "); Console.WriteLine($"* Average R-squared: {R2.Average():0.###} "); Console.WriteLine($"*************************************************************************************************************"); } public static string GetAbsolutePath(string relativePath) { FileInfo _dataRoot = new FileInfo(typeof(Program).Assembly.Location); string assemblyFolderPath = _dataRoot.Directory.FullName; string fullPath = Path.Combine(assemblyFolderPath, relativePath); return fullPath; }
Source code lengkapnya bisa diunduh di link ini. Silakan ber-experiment dengan data yang rekan-rekan miliki. Jangan lupa ikuti terus series ML.NET ini.
Salam Makers