Tutorial: Memprediksi harga menggunakan regresi dengan ML.NET
Tutorial ini menggambarkan cara membangun model regresi menggunakan ML.NET untuk memprediksi harga, khususnya, tarif taksi Kota New York.
Dalam tutorial ini, Anda akan mempelajari cara:
- Menyiapkan dan memahami data
- Memuat dan mengubah data
- Memilih algoritma pembelajaran
- Latih model
- Mengevaluasi model
- Menggunakan model untuk prediksi
Prasyarat
- Visual Studio 2022 dengan beban kerja ".NET Desktop Development" terinstal.
Membuat aplikasi konsol
Buat Aplikasi Konsol C# yang disebut "TaxiFarePrediction".
Pilih .NET 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.
Buat direktori bernama Data di proyek Anda untuk menyimpan himpunan data dan file model.
Instal paket NuGet Microsoft.ML dan Microsoft.ML.FastTree :
Catatan
Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.
Di Penjelajah Solusi, klik kanan proyek, lalu pilih Kelola Paket NuGet. Pilih "nuget.org" sebagai Sumber paket, pilih tab Telusuri , cari Microsoft.ML, pilih paket dalam daftar, dan pilih tombol 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. Lakukan hal yang sama untuk paket NuGet Microsoft.ML.FastTree .
Menyiapkan dan memahami data
Unduh taxi-fare-train.csv dan himpunan data taxi-fare-test.csv dan simpan ke folder Data yang telah Anda buat di langkah sebelumnya. Kami menggunakan himpunan data ini untuk melatih model pembelajaran mesin dan kemudian mengevaluasi seberapa akurat modelnya. Himpunan data ini awalnya berasal dari himpunan data Perjalanan Taksi TLC NYC.
Di Penjelajah Solusi, klik kanan setiap file *.csv dan pilih Properti. Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.
Buka himpunan datataxi-fare-train.csv dan lihat header kolom di baris pertama. Lihat masing-masing kolom. Pahami data dan putuskan kolom mana yang merupakan fitur dan mana yang merupakan label.
adalah label
kolom yang ingin Anda prediksi. yang diidentifikasi Features
adalah input yang Anda berikan model untuk memprediksi Label
.
Himpunan data yang disediakan berisi kolom berikut:
- vendor_id: ID vendor taksi adalah fitur.
- rate_code: Jenis tarif perjalanan taksi adalah fitur.
- passenger_count: Jumlah penumpang dalam perjalanan adalah fitur.
- trip_time_in_secs: Jumlah waktu yang dibutuhkan perjalanan. Anda ingin memprediksi tarif perjalanan sebelum perjalanan selesai. Pada saat itu, Anda tidak tahu berapa lama perjalanan akan berlangsung. Dengan demikian, waktu perjalanan bukanlah fitur dan Anda akan mengecualikan kolom ini dari model.
- trip_distance: Jarak perjalanan adalah fitur.
- payment_type: Metode pembayaran (tunai atau kartu kredit) adalah fitur.
- fare_amount: Total tarif taksi yang dibayarkan adalah label .
Membuat kelas data
Buat kelas untuk data input dan prediksi:
Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Item baru.
Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi TaxiTrip.cs. Kemudian, pilih tombol Tambahkan .
Tambahkan arahan berikut
using
ke file baru:using Microsoft.ML.Data;
Hapus definisi kelas yang ada dan tambahkan kode berikut, yang memiliki dua kelas TaxiTrip
dan TaxiTripFarePrediction
, ke file TaxiTrip.cs :
public class TaxiTrip
{
[LoadColumn(0)]
public string? VendorId;
[LoadColumn(1)]
public string? RateCode;
[LoadColumn(2)]
public float PassengerCount;
[LoadColumn(3)]
public float TripTime;
[LoadColumn(4)]
public float TripDistance;
[LoadColumn(5)]
public string? PaymentType;
[LoadColumn(6)]
public float FareAmount;
}
public class TaxiTripFarePrediction
{
[ColumnName("Score")]
public float FareAmount;
}
TaxiTrip
adalah kelas data input dan memiliki definisi untuk setiap kolom himpunan data.
LoadColumnAttribute Gunakan atribut untuk menentukan indeks kolom sumber dalam himpunan data.
Kelas TaxiTripFarePrediction
mewakili hasil yang diprediksi. Ini memiliki bidang float tunggal, , FareAmount
dengan Score
ColumnNameAttribute atribut yang diterapkan. Dalam kasus tugas regresi, kolom Skor berisi nilai label yang diprediksi.
Catatan
float
Gunakan jenis untuk mewakili nilai floating-point dalam kelas data input dan prediksi.
Menentukan jalur data dan model
Tambahkan pernyataan tambahan using
berikut ke bagian atas file Program.cs :
using Microsoft.ML;
using TaxiFarePrediction;
Anda perlu membuat tiga bidang untuk menyimpan jalur ke file dengan himpunan data dan file untuk menyimpan model:
-
_trainDataPath
berisi jalur ke file dengan himpunan data yang digunakan untuk melatih model. -
_testDataPath
berisi jalur ke file dengan himpunan data yang digunakan untuk mengevaluasi model. -
_modelPath
berisi jalur ke file tempat model terlatih disimpan.
Tambahkan kode berikut tepat di bawah bagian penggunaan untuk menentukan jalur tersebut _textLoader
dan untuk variabel :
string _trainDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-train.csv");
string _testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-test.csv");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "Model.zip");
Semua operasi ML.NET dimulai di kelas MLContext. Menginisialisasi mlContext
membuat lingkungan ML.NET baru yang dapat dibagikan di seluruh objek alur kerja pembuatan model. Ini mirip, secara konseptual, ke DBContext
dalam Kerangka Kerja Entitas.
Inisialisasi variabel
Console.WriteLine("Hello World!")
Ganti baris dengan kode berikut untuk mendeklarasikan dan menginisialisasi mlContext
variabel:
MLContext mlContext = new MLContext(seed: 0);
Tambahkan yang berikut ini sebagai baris kode berikutnya untuk memanggil Train
metode :
var model = Train(mlContext, _trainDataPath);
Metode menjalankan Train()
tugas-tugas berikut:
- Memuat data.
- Mengekstrak dan mengubah data.
- Melatih model.
- Mengembalikan model.
Metode ini Train
melatih model. Buat metode tersebut tepat di bawah ini menggunakan kode berikut:
ITransformer Train(MLContext mlContext, string dataPath)
{
}
Memuat dan mengubah data
ML.NET menggunakan antarmuka IDataView sebagai cara yang fleksibel dan efisien untuk menjelaskan data tabular numerik atau teks.
IDataView
dapat memuat file teks atau secara real time (misalnya, database SQL atau file log). Tambahkan kode berikut sebagai baris pertama metode Train()
:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');
Karena Anda ingin memprediksi tarif perjalanan taksi, FareAmount
kolom adalah Label
yang akan Anda prediksi (output model).
CopyColumnsEstimator
Gunakan kelas transformasi untuk menyalin FareAmount
, dan menambahkan kode berikut:
var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")
Algoritma yang melatih model memerlukan fitur numerik , jadi Anda harus mengubah nilai data kategoris (VendorId
, RateCode
, dan PaymentType
) menjadi angka (VendorIdEncoded
, RateCodeEncoded
, dan PaymentTypeEncoded
). Untuk melakukannya, gunakan kelas transformasi OneHotEncodingTransformer , yang menetapkan nilai kunci numerik yang berbeda ke nilai yang berbeda di setiap kolom, dan tambahkan kode berikut:
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName:"VendorId"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"))
Langkah terakhir dalam persiapan data menggabungkan semua kolom fitur ke dalam kolom Fitur menggunakan mlContext.Transforms.Concatenate
kelas transformasi. Secara default, algoritma pembelajaran hanya memproses fitur dari kolom Fitur . Tambahkan kode berikut:
.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))
Memilih algoritma pembelajaran
Masalah ini adalah tentang memprediksi tarif perjalanan taksi di New York City. Pada pandangan pertama, tampaknya hanya tergantung pada jarak yang dilalui. Namun, vendor taksi di New York mengenakan biaya yang bervariasi untuk faktor lain seperti penumpang tambahan atau membayar dengan kartu kredit alih-alih uang tunai. Anda ingin memprediksi nilai harga, yang merupakan nilai nyata, berdasarkan faktor lain dalam himpunan data. Untuk melakukannya, Anda memilih tugas pembelajaran mesin regresi .
Tambahkan tugas pembelajaran mesin FastTreeRegressionTrainer ke definisi transformasi data dengan menambahkan yang berikut ini sebagai baris kode berikutnya di Train()
:
.Append(mlContext.Regression.Trainers.FastTree());
Latih model
Paskan model ke pelatihan dataview
dan kembalikan model terlatih dengan menambahkan baris kode berikut dalam Train()
metode :
var model = pipeline.Fit(dataView);
Metode Fit() melatih model Anda dengan mengubah himpunan data dan menerapkan pelatihan.
Kembalikan model terlatih dengan baris kode berikut dalam Train()
metode :
return model;
Mengevaluasi model
Selanjutnya, evaluasi performa model Anda dengan data pengujian Anda untuk jaminan kualitas dan validasi.
Evaluate()
Buat metode , tepat setelah Train()
, dengan kode berikut:
void Evaluate(MLContext mlContext, ITransformer model)
{
}
Metode menjalankan Evaluate
tugas-tugas berikut:
- Memuat himpunan data pengujian.
- Membuat evaluator regresi.
- Mengevaluasi model dan membuat metrik.
- Menampilkan metrik.
Tambahkan panggilan ke metode baru tepat di bawah Train
panggilan metode, menggunakan kode berikut:
Evaluate(mlContext, model);
Muat himpunan data pengujian menggunakan metode LoadFromTextFile(). Evaluasi model menggunakan himpunan data ini sebagai pemeriksaan kualitas dengan menambahkan kode berikut dalam Evaluate
metode :
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');
Selanjutnya, ubah Test
data dengan menambahkan kode berikut ke Evaluate()
:
var predictions = model.Transform(dataView);
Metode Transform() membuat prediksi untuk baris input himpunan data pengujian.
Metode ini RegressionContext.Evaluate
menghitung metrik kualitas untuk menggunakan himpunan PredictionModel
data yang ditentukan. Ini mengembalikan RegressionMetrics objek yang berisi metrik keseluruhan yang dihitung oleh evaluator regresi.
Untuk menampilkan ini untuk menentukan kualitas model, Anda harus mendapatkan metrik terlebih dahulu. Tambahkan kode berikut sebagai baris berikutnya dalam Evaluate
metode :
var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");
Setelah Anda memiliki set prediksi, metode Evaluate() menilai model, yang membandingkan nilai yang diprediksi dengan aktual Labels
dalam himpunan data pengujian dan mengembalikan metrik tentang performa model.
Tambahkan kode berikut untuk mengevaluasi model dan menghasilkan metrik evaluasi:
Console.WriteLine();
Console.WriteLine($"*************************************************");
Console.WriteLine($"* Model quality metrics evaluation ");
Console.WriteLine($"*------------------------------------------------");
RSquared adalah metrik evaluasi lain dari model regresi. RSquared mengambil nilai antara 0 dan 1. Semakin dekat nilainya menjadi 1, semakin baik modelnya. Tambahkan kode berikut ke Evaluate
dalam metode untuk menampilkan nilai RSquared:
Console.WriteLine($"* RSquared Score: {metrics.RSquared:0.##}");
RMS adalah salah satu metrik evaluasi model regresi. Semakin rendah, semakin baik modelnya. Tambahkan kode berikut ke Evaluate
dalam metode untuk menampilkan nilai RMS:
Console.WriteLine($"* Root Mean Squared Error: {metrics.RootMeanSquaredError:#.##}");
Menggunakan model untuk prediksi
TestSinglePrediction
Buat metode , tepat setelah Evaluate
metode , menggunakan kode berikut:
void TestSinglePrediction(MLContext mlContext, ITransformer model)
{
}
Metode menjalankan TestSinglePrediction
tugas-tugas berikut:
- Membuat satu komentar data pengujian.
- Memprediksi jumlah tarif berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan panggilan ke metode baru tepat di bawah Evaluate
panggilan metode, menggunakan kode berikut:
TestSinglePrediction(mlContext, model);
PredictionEngine
Gunakan untuk memprediksi tarif dengan menambahkan kode berikut ke TestSinglePrediction()
:
var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);
PredictionEngine adalah API kenyamanan, yang memungkinkan Anda melakukan prediksi pada satu instans data.
PredictionEngine
tidak aman untuk utas. Penggunaan di lingkungan utas tunggal atau prototipe dapat diterima. Untuk meningkatkan performa dan keamanan utas di lingkungan produksi, gunakan PredictionEnginePool
layanan , yang menciptakan ObjectPool
PredictionEngine
objek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakan PredictionEnginePool
dalam ASP.NET Core Web API.
Catatan
PredictionEnginePool
ekstensi layanan saat ini dalam pratinjau.
Tutorial ini menggunakan satu perjalanan uji dalam kelas ini. Nantinya Anda dapat menambahkan skenario lain untuk bereksperimen dengan model. Tambahkan perjalanan untuk menguji prediksi biaya model terlatih dalam TestSinglePrediction()
metode dengan membuat instans :TaxiTrip
var taxiTripSample = new TaxiTrip()
{
VendorId = "VTS",
RateCode = "1",
PassengerCount = 1,
TripTime = 1140,
TripDistance = 3.75f,
PaymentType = "CRD",
FareAmount = 0 // To predict. Actual/Observed = 15.5
};
Selanjutnya, prediksi tarif berdasarkan satu instans data perjalanan taksi dan teruskan ke PredictionEngine
dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam TestSinglePrediction()
metode :
var prediction = predictionFunction.Predict(taxiTripSample);
Fungsi Predict() membuat prediksi pada satu instans data.
Untuk menampilkan prediksi tarif perjalanan yang ditentukan, tambahkan kode berikut ke TestSinglePrediction
dalam metode :
Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 15.5");
Console.WriteLine($"**********************************************************************");
Jalankan program untuk melihat prediksi tarif taksi untuk kasus pengujian Anda.
Selamat! Anda sekarang telah berhasil membangun model pembelajaran mesin untuk memprediksi tarif perjalanan taksi, mengevaluasi akurasinya, dan menggunakannya untuk membuat prediksi. Anda dapat menemukan kode sumber untuk tutorial ini di repositori GitHub dotnet/samples .
Langkah berikutnya
Di tutorial ini, Anda akan mempelajari cara:
- Menyiapkan dan memahami data
- Membuat alur pembelajaran
- Memuat dan mengubah data
- Memilih algoritma pembelajaran
- Latih model
- Mengevaluasi model
- Menggunakan model untuk prediksi
Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut.