Aracılığıyla paylaş


Öğretici: ML.NET ile regresyon kullanarak fiyatları tahmin edin

Bu öğreticide, başta New York City taksi ücretleri olmak üzere fiyatları tahmin etmek için ML.NET kullanarak bir regresyon modeli oluşturma işlemi gösterilmektedir.

Bu eğitimde şunları öğreniyorsunuz:

  • Verileri hazırlama ve anlama
  • Verileri yükleme ve dönüştürme
  • Öğrenme algoritması seçme
  • Modeli eğitin
  • Modeli değerlendirme
  • Tahminler için modeli kullanma

Önkoşullar

Konsol uygulaması oluşturma

  1. "TaxiFarePrediction" adlı bir C# Konsol Uygulaması oluşturun.

  2. Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.

  3. Veri kümesini ve model dosyalarını depolamak için projenizde Data adlı bir dizin oluşturun.

  4. Microsoft.ML ve Microsoft.ML.FastTree NuGet Paketini yükleyin:

    Uyarı

    Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    Çözüm Gezgini'da projeye sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paket kaynağı olarak "nuget.org" öğesini seçin, Gözat sekmesini seçin, Microsoft.ML arayın, listeden paketi seçin ve Yükle'yi seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini ve ardından Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin. Microsoft.ML.FastTree NuGet paketi için de aynısını yapın.

Verileri hazırlama ve anlama

  1. taxi-fare-train.csv ve taxi-fare-test.csv veri kümelerini indirin ve önceki adımda oluşturduğunuz Veri klasörüne kaydedin. Makine öğrenmesi modelini eğitmek ve ardından modelin ne kadar doğru olduğunu değerlendirmek için bu veri kümelerini kullanırız. Bu veri kümeleri başlangıçta NYC TLC Taxi Trip veri kümesinden alınıyor.

  2. Çözüm Gezgini'nde *.csv dosyalarının her birine sağ tıklayın ve Özellikler'i seçin. Gelişmiş sekmesinin altında, Çıkış Dizinine Kopyala değerini Daha Yeniyse Kopyala olarak ayarlayın.

  3. taxi-fare-train.csv veri kümesini açın ve ilk satırdaki sütun üst bilgilerine bakın. Sütunların her birine göz atın. Verileri anlayın ve hangi sütunların özellik olduğuna ve hangisinin etiket olduğuna karar verin.

label, tahmin etmek istediğiniz sütundur. Tanımlanan Features, modeline tahmin Labeletmek için verdiğiniz girişlerdir.

Sağlanan veri kümesi aşağıdaki sütunları içerir:

  • vendor_id: Taksi satıcısının kimliği bir özelliktir.
  • rate_code: Taksi yolculuğunun fiyat türü bir özelliktir.
  • passenger_count: Yolculukta yolcu sayısı bir özelliktir.
  • trip_time_in_secs: Yolculuğun ne kadar sürdüğü. Seyahat tamamlanmadan önce seyahatin ücretini tahmin etmek istiyorsunuz. O anda, yolculuğun ne kadar süreceğini bilemezsin. Bu nedenle, yolculuk süresi bir özellik değildir ve bu sütunu modelin dışında tutacaksınız.
  • trip_distance: Seyahatin uzaklığı bir özelliktir.
  • payment_type: Ödeme yöntemi (nakit veya kredi kartı) bir özelliktir.
  • fare_amount: Toplam taksi ücreti olarak ödenen tutar etikettir.

Veri sınıfları oluşturma

Giriş verileri ve tahminler için sınıflar oluşturun:

  1. Çözüm Gezgini'nde projeye sağ tıklayın veardından Yeni Öğe Ekle'yi> seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını TaxiTrip.cs olarak değiştirin. Ardından Ekle'yi seçin.

  3. Yeni dosyaya aşağıdaki using yönergeleri ekleyin:

    using Microsoft.ML.Data;
    

Mevcut sınıf tanımını kaldırın ve TaxiTrip ve TaxiTripFarePrediction olmak üzere iki sınıf içeren aşağıdaki kodu TaxiTrip.cs dosyasına ekleyin:

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 giriş veri sınıfıdır ve veri kümesi sütunlarının her biri için tanımlara sahiptir. Veri kümesindeki LoadColumnAttribute kaynak sütunların dizinlerini belirtmek için özniteliğini kullanın.

TaxiTripFarePrediction sınıfı, tahmin edilen sonuçları temsil eder. Üzerine ScoreColumnNameAttribute özniteliği uygulanmış tek bir FareAmount float alanı vardır. Regresyon görevi söz konusu olduğunda Score sütunu tahmin edilen etiket değerlerini içerir.

Uyarı

float Giriş ve tahmin veri sınıflarındaki kayan nokta değerlerini göstermek için türünü kullanın.

Veri ve model yollarını tanımlama

using dosyasının en üstüne aşağıdaki ek yönergeleri ekleyin:

using Microsoft.ML;
using TaxiFarePrediction;

Veri kümeleri içeren dosyaların yollarını ve modeli kaydetmek için dosyayı tutmak için üç alan oluşturmanız gerekir:

  • _trainDataPath modeli eğitmek için kullanılan veri kümesini içeren dosyanın yolunu içerir.
  • _testDataPath , modeli değerlendirmek için kullanılan veri kümesini içeren dosyanın yolunu içerir.
  • _modelPath , eğitilen modelin depolandığı dosyanın yolunu içerir.

Bu yolları ve değişkeni belirtmek için _textLoader aşağıdaki kodu usings bölümünün hemen altına ekleyin:

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");

Tüm ML.NET işlemleri MLContext sınıfında başlar. Başlatma işlemi mlContext , model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext benzer, kavramsal olarak.

Değişkenleri başlatma

Console.WriteLine("Hello World!") değişkeni bildirmek ve başlatmak mlContext için satırı aşağıdaki kodla değiştirin:

MLContext mlContext = new MLContext(seed: 0);

yöntemini çağırmak Train için sonraki kod satırı olarak aşağıdakileri ekleyin:

var model = Train(mlContext, _trainDataPath);

Train() yöntemi aşağıdaki görevleri yürütür:

  • Verileri yükler.
  • Verileri ayıklar ve dönüştürür.
  • Modeli eğiter.
  • Modeli geri döndürür.

Train yöntemi modeli eğiter. Aşağıdaki kodu kullanarak aşağıdaki yöntemi oluşturun:

ITransformer Train(MLContext mlContext, string dataPath)
{

}

Verileri yükleme ve dönüştürme

ML.NET, sayısal veya metin tablolu verilerini açıklamanın esnek, verimli bir yolu olarak IDataView arabirimini kullanır. IDataView metin dosyalarını veya gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) yükleyebilir. Aşağıdaki kodu yöntemin ilk satırı Train() olarak ekleyin:

IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');

Taksi yolculuğu ücretini tahmin etmek istediğinizde, FareAmount sütunu tahmin edeceğiniz Label ve bu da modelin çıktısıdır. öğesini kopyalamak CopyColumnsEstimatoriçin dönüştürme sınıfını FareAmount kullanın ve aşağıdaki kodu ekleyin:

var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")

Modeli eğiten algoritma sayısal özellikler gerektirir, bu nedenle kategorik veri (VendorId, ve RateCode) değerlerini sayılara (PaymentType, VendorIdEncodedRateCodeEncodedve PaymentTypeEncoded) dönüştürmeniz gerekir. Bunu yapmak için, her sütundaki farklı değerlere farklı sayısal anahtar değerleri atayan OneHotEncodingTransformer dönüştürme sınıfını kullanın ve aşağıdaki kodu ekleyin:

.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"))

Veri hazırlama işleminin son adımı, dönüştürme sınıfını kullanarak tüm özellik sütunlarını mlContext.Transforms.Concatenate sütununda birleştirir. Varsayılan olarak, öğrenme algoritması yalnızca Özellikler sütunundaki özellikleri işler. Aşağıdaki kodu ekleyin:

.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))

Öğrenme algoritması seçme

Bu sorun, New York City'de bir taksi yolculuğu ücretini tahmin etmeyle ilgili. İlk bakışta, yalnızca kat edilen mesafeye bağlı gibi görünebilir. Ancak, New York'taki taksi satıcıları ek yolcular veya nakit yerine kredi kartıyla ödeme gibi diğer faktörler için değişen tutarlardan ücret alır. Veri kümesindeki diğer faktörlere göre gerçek bir değer olan fiyat değerini tahmin etmek istiyorsunuz. Bunu yapmak için bir regresyon makine öğrenmesi görevi seçersiniz.

FastTreeRegressionTrainer makine öğrenmesi görevini, içinde bir sonraki kod satırı olarak aşağıdakileri ekleyerek veri dönüştürme tanımlarına ekleyinTrain():

.Append(mlContext.Regression.Trainers.FastTree());

Modeli eğitin

Modeli eğitime dataview sığdırın ve yöntemine aşağıdaki kod satırını ekleyerek eğitilen modeli döndürin Train() :

var model = pipeline.Fit(dataView);

Fit() yöntemi, veri kümesini dönüştürüp eğitimi uygulayarak modelinizi eğiter.

yönteminde aşağıdaki kod satırıyla eğitilen modeli döndür:Train()

return model;

Modeli değerlendirme

Ardından kalite güvencesi ve doğrulama için test verilerinizle model performansınızı değerlendirin. Evaluate() aşağıdaki kodla hemen sonrasında Train()yöntemini oluşturun:

void Evaluate(MLContext mlContext, ITransformer model)
{

}

Evaluate yöntemi aşağıdaki görevleri yürütür:

  • Test veri kümesini yükler.
  • Regresyon değerlendiricisini oluşturur.
  • Modeli değerlendirir ve ölçümler oluşturur.
  • Ölçümleri görüntüler.

Aşağıdaki kodu kullanarak yeni yönteme doğrudan yöntem çağrısının Train altına bir çağrı ekleyin:

Evaluate(mlContext, model);

LoadFromTextFile() yöntemini kullanarak test veri kümesini yükleyin. yöntemine aşağıdaki kodu ekleyerek bu veri kümesini kalite denetimi olarak kullanarak modeli değerlendirin Evaluate :

IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');

Ardından, aşağıdaki kodu öğesine Testekleyerek verileri dönüştürünEvaluate():

var predictions = model.Transform(dataView);

Transform() yöntemi, test veri kümesi giriş satırları için tahminler yapar.

yöntemi, RegressionContext.Evaluate belirtilen veri kümesini kullanarak için PredictionModel kalite ölçümlerini hesaplar. Regresyon değerlendiricileri tarafından hesaplanan genel ölçümleri içeren bir RegressionMetrics nesne döndürür.

Modelin kalitesini belirlemek üzere bunları görüntülemek için önce ölçümleri almanız gerekir. Metodun Evaluate satırına aşağıdaki kodu ekleyin:

var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");

Tahmin kümesini aldıktan sonra Evaluate() yöntemi, tahmin edilen değerleri test veri kümesindeki gerçek Labels değerle karşılaştıran ve modelin performansına ilişkin ölçümleri döndüren modeli değerlendirir.

Modeli değerlendirmek ve değerlendirme ölçümlerini oluşturmak için aşağıdaki kodu ekleyin:

Console.WriteLine();
Console.WriteLine($"*************************************************");
Console.WriteLine($"*       Model quality metrics evaluation         ");
Console.WriteLine($"*------------------------------------------------");

RSquared , regresyon modellerinin bir diğer değerlendirme ölçümüdür. RSquared 0 ile 1 arasında değerler alır. Değeri 1'e ne kadar yakın olursa model o kadar iyi olur. RSquared değerini görüntülemek için yöntemine aşağıdaki kodu Evaluate ekleyin:

Console.WriteLine($"*       RSquared Score:      {metrics.RSquared:0.##}");

RMS , regresyon modelinin değerlendirme ölçümlerinden biridir. Ne kadar düşük olursa, model o kadar iyi olur. RMS değerini görüntülemek için yöntemine aşağıdaki kodu Evaluate ekleyin:

Console.WriteLine($"*       Root Mean Squared Error:      {metrics.RootMeanSquaredError:0.##}");

Tahminler için modeli kullanma

TestSinglePrediction Aşağıdaki kodu kullanarak yöntemini hemen yönteminden Evaluate sonra oluşturun:

void TestSinglePrediction(MLContext mlContext, ITransformer model)
{

}

TestSinglePrediction yöntemi aşağıdaki görevleri yürütür:

  • Test verilerinin tek bir açıklamasını oluşturur.
  • Test verilerine göre ücret miktarını tahmin eder.
  • Raporlama için test verilerini ve tahminlerini birleştirir.
  • Tahmin edilen sonuçları görüntüler.

Aşağıdaki kodu kullanarak yeni yönteme doğrudan yöntem çağrısının Evaluate altına bir çağrı ekleyin:

TestSinglePrediction(mlContext, model);

PredictionEngine için aşağıdaki kodu ekleyerek ücreti tahmin etmek için TestSinglePrediction()komutunu kullanın:

var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);

PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir. PredictionEngine iş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarda kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için hizmeti kullanın PredictionEnginePool . Bu hizmet, uygulamanız genelinde kullanılmak üzere bir ObjectPoolPredictionEngine nesne oluşturur. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

Uyarı

PredictionEnginePool hizmet uzantısı şu anda önizleme aşamasındadır.

Bu kılavuzda bu sınıf içinde bir deneme gezisi kullanılır. Daha sonra modelle deneme yapmak için başka senaryolar ekleyebilirsiniz. örneğini oluşturarak yönteminde eğitilen modelin maliyet tahminini TestSinglePrediction()TaxiTriptest etmek için bir gezi ekleyin:

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

Ardından, taksi yolculuğu verilerinin tek bir örneğini temel alarak ücreti tahmin edin ve bunu PredictionEngine öğesine geçirmek için TestSinglePrediction() yönteminin bir sonraki satırları olarak aşağıdakileri ekleyin:

var prediction = predictionFunction.Predict(taxiTripSample);

Predict() işlevi, tek bir veri örneği üzerinde tahminde bulunur.

Belirtilen yolculuğun tahmin edilen ücretini görüntülemek için yöntemine TestSinglePrediction aşağıdaki kodu ekleyin:

Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 15.5");
Console.WriteLine($"**********************************************************************");

Test çalışmanız için tahmin edilen taksi ücretini görmek için programı çalıştırın.

Tebrikler! Şimdi taksi yolculuğu ücretlerini tahmin etmek için başarıyla bir makine öğrenmesi modeli oluşturdunuz, doğruluğunu değerlendirdiniz ve tahminlerde bulunmak için kullandınız. Bu öğreticinin kaynak kodunu dotnet/samples GitHub deposunda bulabilirsiniz.

Sonraki Adımlar

Bu öğreticide şunların nasıl yapılacağını öğrendiniz:

  • Verileri hazırlama ve anlama
  • Öğrenme işlem hattı oluşturun
  • Verileri yükleme ve dönüştürme
  • Öğrenme algoritması seçme
  • Modeli eğitin
  • Modeli değerlendirme
  • Tahminler için modeli kullanma

Daha fazla bilgi edinmek için sonraki öğreticiye geçin.