— -

Введение

Прогнозирование цен на такси — классическая задача в науке о данных и машинном обучении. Мы будем использовать набор данных от Kaggle, который содержит различные функции, такие как продолжительность поездки, количество пассажиров, пройденное расстояние и многое другое. Наша цель — построить модели, которые точно прогнозируют стоимость проезда на такси на основе этих функций.

Обзор набора данных

Набор данных можно найти на [этой ссылке Kaggle](https://www.kaggle.com/datasets/raviiloveyou/predict-taxi-fare-with-a-bigquery-ml-forecasting). Он включает в себя следующие столбцы:

- `trip_duration`
- `passenger_counts`
- `пройденное_расстояние`
- `fare`
- `tips`
- `misc_fare`
- ` total_fare`

Теперь давайте начнем с кода!

Исследование данных и предварительная обработка

# Load the necessary libraries
library(tidyverse)

# Load the dataset
data_org <- read.csv("path_to_your_dataset/train.csv")
test_act_df <- read.csv("path_to_your_dataset/test.csv")

# Remove rows with zero fare
df <- filter(data_org, fare != 0)

# Drop unnecessary columns
no_need <- c('tip', 'miscellaneous_fees', 'total_fare')
data_org <- select(data_org, -no_need)

# Split the data
set.seed(1234)
data_org <- data_org[sample(1:nrow(data_org)), ]

Поезд-тестовый сплит

Чтобы оценить производительность наших моделей, мы разделим набор данных на наборы для обучения и тестирования. Модель будет обучена на обучающем наборе и оценена на тестовом наборе, чтобы убедиться, что она хорошо обобщает новые, невидимые данные.

# Convert data to matrices
data_mat <- as.matrix(data_org)

# Split the data
train_data <- data_mat[1:146771, ]
test_data <- data_mat[-(1:146771), ]

train_labels <- data_org$fare[1:146771]
test_labels <- data_org$fare[-(1:146771)]

Обучение модели XGBoost

Мы начнем с обучения модели XGBoost, мощного алгоритма повышения градиента.

# Load the XGBoost library
library(xgboost)

# Create DMatrix for training and testing data
dtrain <- xgb.DMatrix(data = train_data, label = train_labels)
dtest <- xgb.DMatrix(data = test_data, label = test_labels)

# Train the XGBoost model
model <- xgboost(data = dtrain,
                 nround = 1000,
                 objective = "reg:squarederror",
                 print_every_n = 500)

Оценка модели

Теперь давайте оценим производительность модели XGBoost, используя показатель среднеквадратичной ошибки (RMSE).

# Make predictions
pred <- predict(model, dtest)

# Calculate RMSE
xgboost_rmse <- sqrt(mean((pred - test_labels)^2))
print(paste("XGBoost RMSE:", xgboost_rmse))

Настройка гиперпараметров

Чтобы оптимизировать производительность модели XGBoost, мы можем выполнить настройку гиперпараметров.

# Define watchlist for early stopping
watchlist <- list(train = dtrain, test = dtest)

# Tune hyperparameters
model_tuned <- xgb.train(data = dtrain,
                         max.depth = 3,
                         eta = 0.01,
                         nthread = 3,
                         nround = 5000,
                         watchlist = watchlist,
                         objective = "reg:squarederror",
                         early_stopping_rounds = 50,
                         print_every_n = 500)

Модель случайного леса

В дополнение к XGBoost мы можем изучить алгоритм Random Forest для нашей задачи прогнозирования.

# Load the Random Forest library
library(randomForest)

# Train the Random Forest model
model_rf <- randomForest(
  x = train_data,
  y = train_labels,
  ntree = 500,
  mtry = sqrt(ncol(train_data)),
  importance = TRUE
)

# Make predictions using Random Forest
pred_rf <- predict(model_rf, newdata = test_data)

# Calculate RMSE for Random Forest
rf_rmse <- sqrt(mean((pred_rf - test_labels)^2))
print(paste("Random Forest RMSE:", rf_rmse))

## Визуализация результатов

Давайте визуализируем производительность наших моделей, сравнивая фактические и прогнозируемые значения тарифов.

# Convert predictions to data frame
results_df <- data.frame(Actual = test_labels, Predicted = pred)

# Create a scatter plot for XGBoost results
ggplot(results_df, aes(x = Actual, y = Predicted)) +
  geom_point(color = "blue", alpha = 0.6) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "black") +
  labs(x = "Actual Fare", y = "Predicted Fare",
       title = "XGBoost: Actual vs. Predicted Fare Prices") +
  theme_minimal()

# Convert Random Forest predictions to data frame
results_df_rf <- data.frame(Actual = test_labels, Predicted = pred_rf)

# Create a scatter plot for Random Forest results
ggplot(results_df_rf, aes(x = Actual, y = Predicted)) +
  geom_point(color = "blue", alpha = 0.6) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "black") +
  labs(x = "Actual Fare", y = "Predicted Fare",
       title = "Random Forest: Actual vs. Predicted Fare Prices") +
  theme_minimal()

Заключение

В этом посте мы предприняли попытку прогнозировать цены на проезд в такси с помощью машинного обучения. Мы исследовали алгоритмы XGBoost и Random Forest, провели предварительную обработку данных, обучили модели и оценили их производительность. С помощью визуализации мы сравнили фактические и прогнозируемые значения тарифов, получив представление об эффективности наших моделей.

И XGBoost, и Random Forest продемонстрировали свои возможности в прогнозировании платы за проезд в такси: XGBoost достиг среднеквадратического отклонения 0,999, а Random Forest — 11,575. По мере того, как я продолжаю исследовать мир машинного обучения, я буду экспериментировать с различными алгоритмами, гиперпараметрами и методами предварительной обработки, чтобы еще больше улучшить свои прогностические модели.

Спасибо, что присоединились ко мне в этом путешествии, и удачного кодирования!

— -