Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
В этом руководстве показано, как создать модель регрессии с помощью ML.NET прогнозирования цен, в частности, тарифы на такси в Нью-Йорке.
В этом руководстве вы узнаете, как:
- Подготовка и понимание данных
- Загрузка и преобразование данных
- Выбор алгоритма обучения
- Обучение модели
- Оценка модели
- Использование модели для прогнозирования
Предпосылки
- Visual Studio 2022 или более поздней версии с установленной нагрузкой разработки для настольных приложений .NET.
Создайте консольное приложение
Создайте консольное приложение C# с именем TaxiFarePrediction.
Выберите .NET 8 в качестве платформы для использования. Нажмите кнопку Создать.
Создайте каталог с именем Data в проекте для хранения файлов набора данных и моделей.
Установите пакет NuGet Microsoft.ML и Microsoft.ML.FastTree :
Замечание
В этом примере используется последняя стабильная версия упомянутых пакетов NuGet, если не указано иное.
В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. Выберите "nuget.org" в качестве источника пакета, перейдите на вкладку "Обзор ", найдите Microsoft.ML, выберите пакет в списке и нажмите кнопку "Установить". Нажмите кнопку "ОК " в диалоговом окне "Предварительные изменения" , а затем нажмите кнопку "Принять" в диалоговом окне принятия лицензий, если вы согласны с условиями лицензии для перечисленных пакетов. Выполните то же самое для пакета NuGet Microsoft.ML.FastTree .
Подготовка и понимание данных
Скачайте taxi-fare-train.csv и наборы данных taxi-fare-test.csv и сохраните их в папку данных , созданную на предыдущем шаге. Эти наборы данных используются для обучения модели машинного обучения и оценки точности модели. Эти наборы данных изначально относятся к набору данных NYC TLC Taxi Trip.
В обозревателе решений щелкните правой кнопкой мыши каждый из файлов *.csv и выберите "Свойства". В разделе "Дополнительно" измените значение Копировать в выходной каталог на Копировать, если новее.
Откройте набор данныхtaxi-fare-train.csv и просмотрите заголовки столбцов в первой строке. Посмотрите на каждый из столбцов. Изучите данные и определите, какие столбцы являются функциями и какой из них — метка.
Это label столбец, который вы хотите прогнозировать. Идентифицированные Featuresвходные данные предоставляют модели для прогнозирования Label.
Предоставленный набор данных содержит следующие столбцы:
- vendor_id: Идентификатор поставщика такси является функцией.
- rate_code: Тип скорости поездки на такси является функцией.
- passenger_count: Количество пассажиров в поездке является особенностью.
- trip_time_in_secs: Время поездки заняло. Вы хотите предсказать тариф поездки до завершения поездки. В этот момент вы не знаете, сколько времени займет поездка. Таким образом, время поездки не является функцией, и вы исключите этот столбец из модели.
- trip_distance: Расстояние поездки является особенностью.
- payment_type: Метод оплаты (наличные или кредитные карты) — это функция.
- fare_amount: Общая плата за такси обозначается как метка.
Создание классов данных
Создайте классы для входных данных и прогнозов:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".
В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на TaxiTrip.cs. Затем нажмите кнопку "Добавить".
Добавьте следующие
usingдирективы в новый файл:using Microsoft.ML.Data;
Удалите существующее определение класса и добавьте следующий код, имеющий два класса TaxiTrip и TaxiTripFarePredictionфайл 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 — это класс входных данных и содержит определения для каждого столбца набора данных.
LoadColumnAttribute Используйте атрибут, чтобы указать индексы исходных столбцов в наборе данных.
Класс TaxiTripFarePrediction представляет прогнозируемые результаты. Он имеет одно поле с плавающей запятой, FareAmountс примененным атрибутом ScoreColumnNameAttribute . В случае задачи регрессии столбец Score содержит прогнозируемые значения меток.
Замечание
float Используйте тип для представления значений с плавающей запятой в классах входных и прогнозирующих данных.
Определение путей к данным и моделям
Добавьте следующие дополнительные using директивы в начало файла Program.cs :
using Microsoft.ML;
using TaxiFarePrediction;
Чтобы сохранить модель, необходимо создать три поля, чтобы хранить пути к файлам с наборами данных и файлом:
-
_trainDataPathсодержит путь к файлу с набором данных, используемым для обучения модели. -
_testDataPathсодержит путь к файлу с набором данных, используемым для оценки модели. -
_modelPathсодержит путь к файлу, в котором хранится обученная модель.
Добавьте следующий код прямо под разделом usings, чтобы указать эти пути и переменную _textLoader :
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");
Все операции ML.NET начинаются в классе MLContext. Инициализация mlContext создает новую среду ML.NET, которую можно совместно использовать для объектов рабочего процесса создания модели. Это концептуально похоже на DBContext в Entity Framework.
Инициализация переменных
Замените Console.WriteLine("Hello World!") строку следующим кодом, чтобы объявить и инициализировать mlContext переменную:
MLContext mlContext = new MLContext(seed: 0);
Добавьте следующую строку кода для вызова Train метода:
var model = Train(mlContext, _trainDataPath);
Метод Train() выполняет следующие задачи:
- Загружает данные.
- Извлекает и преобразует данные.
- Обучает модель.
- Возвращает модель.
Метод Train обучает модель. Создайте этот метод чуть ниже с помощью следующего кода:
ITransformer Train(MLContext mlContext, string dataPath)
{
}
Загрузка и преобразование данных
ML.NET использует интерфейс IDataView как гибкий и эффективный способ описания числовых или текстовых табличных данных.
IDataView может загружать текстовые файлы или в режиме реального времени (например, базы данных SQL или файлы журналов). Добавьте следующий код в первую строку Train() метода:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');
Для предсказания тарифа FareAmount для поездки на такси, столбец FareAmount — это Label, которую вы будете прогнозировать (выходные данные модели).
CopyColumnsEstimator Используйте класс преобразования для копирования FareAmountи добавьте следующий код:
var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")
Алгоритм, обучающий модель, требует числовых функций, поэтому необходимо преобразовать категориальные значения данных (VendorId, RateCodeи PaymentType) в числа (VendorIdEncoded, RateCodeEncodedи PaymentTypeEncoded). Для этого используйте класс преобразования OneHotEncodingTransformer , который назначает разные числовые значения ключей разным значениям в каждом из столбцов и добавьте следующий код:
.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"))
Последний шаг подготовки данных объединяет все столбцы признаков в столбец "Компоненты " с помощью mlContext.Transforms.Concatenate класса преобразования. По умолчанию алгоритм обучения обрабатывает только компоненты из столбца "Компоненты ". Добавьте следующий код:
.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))
Выбор алгоритма обучения
Эта проблема заключается в прогнозировании тарифа на такси в Нью-Йорке. На первый взгляд, может показаться, что это просто зависит от расстояния, пройденного. Тем не менее, операторы такси в Нью-Йорке взимают различные суммы за дополнительные услуги, такие как дополнительные пассажиры или оплата с использованием кредитной карты вместо наличных. Вы хотите спрогнозировать ценовую стоимость, которая является реальным значением на основе других факторов в наборе данных. Для этого выберите задачу машинного обучения регрессии .
Добавьте задачу машинного обучения FastTreeRegressionTrainer в определения преобразования данных, добавив следующую строку кода в Train():
.Append(mlContext.Regression.Trainers.FastTree());
Обучение модели
Поместите модель в обучение dataview и верните обученную модель, добавив следующую строку кода в Train() метод:
var model = pipeline.Fit(dataView);
Метод Fit() обучает модель путем преобразования набора данных и применения обучения.
Верните обученную модель со следующей строкой кода в методе Train() :
return model;
Оценка модели
Затем оцените производительность модели с помощью тестовых данных для проверки качества и проверки.
Evaluate() Создайте метод сразу после Train()этого с помощью следующего кода:
void Evaluate(MLContext mlContext, ITransformer model)
{
}
Метод Evaluate выполняет следующие задачи:
- Загружает тестовый набор данных.
- Создает средство оценки регрессии.
- Оценивает модель и создает метрики.
- Отображает метрики.
Добавьте вызов нового метода сразу после вызова метода Train, используя следующий код:
Evaluate(mlContext, model);
Загрузите тестовый набор данных с помощью метода LoadFromTextFile(). Оцените модель с помощью этого набора данных в качестве проверки качества, добавив следующий код в Evaluate метод:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');
Затем преобразуйте Test данные, добавив в него следующий код Evaluate():
var predictions = model.Transform(dataView);
Метод Transform() делает прогнозы для входных строк тестового набора данных.
Метод RegressionContext.Evaluate вычисляет метрики качества для PredictionModel использования указанного набора данных. Он возвращает RegressionMetrics объект, содержащий совокупные метрики, вычисляемые оценщиками регрессии.
Чтобы отобразить их, чтобы определить качество модели, сначала необходимо получить метрики. Добавьте следующий код в следующую строку в методе Evaluate :
var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");
После получения прогнозируемого набора метод Evaluate() оценивает модель, которая сравнивает прогнозируемые значения с фактическим Labels в тестовом наборе данных и возвращает метрики о том, как выполняется модель.
Добавьте следующий код для оценки модели и создания метрик оценки:
Console.WriteLine();
Console.WriteLine($"*************************************************");
Console.WriteLine($"* Model quality metrics evaluation ");
Console.WriteLine($"*------------------------------------------------");
RSquared — это другая метрика оценки моделей регрессии. RSquared принимает значения от 0 до 1. Чем ближе его значение равно 1, тем лучше модель. Добавьте следующий код в Evaluate метод для отображения значения RSquared:
Console.WriteLine($"* RSquared Score: {metrics.RSquared:0.##}");
RMS — это одна из метрик оценки модели регрессии. Чем ниже, тем лучше модель. Добавьте следующий код в Evaluate метод для отображения значения RMS:
Console.WriteLine($"* Root Mean Squared Error: {metrics.RootMeanSquaredError:0.##}");
Использование модели для прогнозирования
TestSinglePrediction Создайте метод сразу после Evaluate метода, используя следующий код:
void TestSinglePrediction(MLContext mlContext, ITransformer model)
{
}
Метод TestSinglePrediction выполняет следующие задачи:
- Создает один комментарий тестовых данных.
- Прогнозирует сумму тарифа на основе тестовых данных.
- Объединяет тестовые данные и прогнозы для создания отчетов.
- Отображает прогнозируемые результаты.
Добавьте вызов нового метода сразу после вызова метода Evaluate, используя следующий код:
TestSinglePrediction(mlContext, model);
PredictionEngine Используйте для прогнозирования тарифа, добавив следующий кодTestSinglePrediction():
var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);
PredictionEngine — это удобный API, который позволяет выполнять прогноз на одном экземпляре данных.
PredictionEngine не является потокобезопасной. Его можно использовать в однопоточных или прототипных средах. Для повышения производительности и безопасности потоков в рабочих средах используйте PredictionEnginePool службу, которая создает ObjectPoolPredictionEngine объекты для использования во всем приложении. См. это руководство по использованию PredictionEnginePool в веб-API ASP.NET Core.
Замечание
PredictionEnginePool Расширение службы в настоящее время находится в предварительной версии.
В этом руководстве используется одно тестовое путешествие в этом классе. Позже можно добавить другие сценарии для экспериментов с моделью. Добавьте поездку для тестирования прогноза стоимости обученной модели в методе TestSinglePrediction() путем создания экземпляра 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
};
Затем спрогнозируйте тариф, используя один экземпляр данных о поездке на такси, и передайте его в PredictionEngine, вставив следующие строки кода в метод TestSinglePrediction().
var prediction = predictionFunction.Predict(taxiTripSample);
Функция Predict() делает прогноз на одном экземпляре данных.
Чтобы отобразить прогнозируемый тариф указанной поездки, добавьте следующий код в TestSinglePrediction метод:
Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 15.5");
Console.WriteLine($"**********************************************************************");
Запустите программу, чтобы просмотреть прогнозируемый тариф на такси для тестового случая.
Поздравляю! Теперь вы успешно создали модель машинного обучения для прогнозирования тарифов на поездку на такси, оценили ее точность и использовали ее для прогнозирования. Исходный код для этого руководства можно найти в репозитории dotnet/samples GitHub.
Дальнейшие шаги
Из этого руководства вы узнали, как:
- Подготовка и понимание данных
- Создание конвейера обучения
- Загрузка и преобразование данных
- Выбор алгоритма обучения
- Обучение модели
- Оценка модели
- Использование модели для прогнозирования
Продолжите к следующему уроку, чтобы узнать больше.