Bagikan melalui


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

Membuat aplikasi konsol

  1. Buat Aplikasi Konsol C# yang disebut "TaxiFarePrediction".

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

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

  4. 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

  1. 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.

  2. 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.

  3. 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 Featuresadalah 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:

  1. Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Item baru.

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

  3. 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, , FareAmountdengan ScoreColumnNameAttribute 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 ObjectPoolPredictionEngine 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.