Öğ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
- ".NET Masaüstü Geliştirme" iş yükü yüklü Visual Studio 2022.
Konsol uygulaması oluşturma
"TaxiFarePrediction" adlı bir C# Konsol Uygulaması oluşturun.
Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.
Veri kümesini ve model dosyalarını depolamak için projenizde Data adlı bir dizin oluşturun.
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
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.
Çö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.
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 Label
etmek 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:
Çözüm Gezgini'da projeye sağ tıklayın ve ardındanYeni Öğe Ekle'yi> seçin.
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.
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 TaxiTripFarePrediction
olmak ü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 Score
ColumnNameAttribute float alanına FareAmount
sahiptir. 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 FareAmount
ve 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
, RateCode
RateCodeEncoded
, 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 PredictionEnginePool
PredictionEngine
tamamında kullanmak üzere bir ObjectPool
nesne oluşturan hizmetini kullanın.
ASP.NET Core Web API'sinde kullanma PredictionEnginePool
hakkı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()
TaxiTrip
test 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.