Aracılığıyla paylaş


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

Bu öğreticide, özellikle New York City taksi ücretlerini tahmin etmek için ML.NET kullanarak bir regresyon modelinin nasıl der edileceği gösterilmektedir.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Verileri hazırlama ve anlama
  • Verileri yükleme ve dönüştürme
  • Öğrenme algoritması seçme
  • Modeli eğitme
  • 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 6'yı 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:

    Not

    Bu örnek, aksi belirtilmedikçe belirtilen 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 düğmesini seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusundaki 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ı işlemi 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ınmaktadır.

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

  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 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: Seyahatte olan yolcu sayısı bir özelliktir.
  • trip_time_in_secs: Yolculuğun ne kadar sürdüğü. Yolculuk 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: Yolculuğun uzaklığı bir özelliktir.
  • payment_type: Ödeme yöntemi (nakit veya kredi kartı) bir özelliktir.
  • fare_amount: Ödenen toplam taksi ücreti etikettir.

Veri sınıfları oluşturma

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

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardındanYeni Öğ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 düğmesini 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.cs dosyasına ve TaxiTripFarePredictionolmak üzere iki sınıfı TaxiTrip olan aşağıdaki kodu 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. Özniteliği uygulanmış tek bir ScoreColumnNameAttribute float alanına FareAmountsahiptir. Regresyon görevi söz konusu olduğunda Score sütunu tahmin edilen etiket değerlerini içerir.

Not

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

Aşağıdaki ek using deyimleri Program.cs dosyasının en üstüne ekleyin:

using Microsoft.ML;
using TaxiFarePrediction;

Veri kümelerine sahip 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şkenini 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 kavramsal olarak benzerdir.

Değişkenleri başlatma

değişkeni bildirmek Console.WriteLine("Hello World!") ve başlatmak mlContext için satırını 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 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 ve 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. Yönteminin ilk satırı Train() olarak aşağıdaki kodu ekleyin:

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

Taksi yolculuğu ücretini tahmin etmek istediğinizde sütun tahmin FareAmount edeceğiniz sütundur Label (modelin çıkışı). CopyColumnsEstimator öğesini kopyalamak FareAmountve aşağıdaki kodu eklemek için dönüştürme sınıfını kullanın:

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

Modeli eğiten algoritma sayısal özellikler gerektirir, bu nedenle kategorik veri (VendorId, ve PaymentType) değerlerini sayılara (VendorIdEncoded, RateCodeRateCodeEncoded, ve 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ırlamadaki son adım, dönüştürme sınıfını kullanarak mlContext.Transforms.Concatenate tüm özellik sütunlarını Özellikler sütununda birleştirir. Varsayılan olarak, öğrenme algoritması yalnızca Özellikler sütunundaki özellikleri işler. Şu 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 ücreti 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 yapma 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.

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

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

Modeli eğitme

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 Train() satırıyla eğitilen modeli döndürür:

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 Evaluate()öğesine ekleyerek verileri dönüştürünTest:

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 nesnesi döndürür.

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

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

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

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ındaki değerleri alır. Değeri 1'e ne kadar yakınsa 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:#.##}");

Tahminler için modeli kullanma

TestSinglePrediction Aşağıdaki kodu kullanarak yönteminden Evaluate hemen sonra yöntemini 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);

için PredictionEngine aşağıdaki kodu ekleyerek ücreti tahmin etmek için TestSinglePrediction()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 ortamlarında kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için, uygulamanızın PredictionEnginePoolPredictionEngine tamamında kullanmak üzere bir ObjectPool nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

Not

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

Bu öğreticide bu sınıf içinde bir test 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 yönteminin sonraki kod satırları olarak aşağıdakileri ekleyerek bunu öğesine TestSinglePrediction() geçirinPredictionEngine:

var prediction = predictionFunction.Predict(taxiTripSample);

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

Belirtilen yolculuğun tahmini ü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 bunu kullandınız. Bu öğreticinin kaynak kodunu dotnet/samples GitHub deposunda bulabilirsiniz.

Sonraki adımlar

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

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

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