— -

Введение
Прогнозирование цен на такси — классическая задача в науке о данных и машинном обучении. Мы будем использовать набор данных от 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. По мере того, как я продолжаю исследовать мир машинного обучения, я буду экспериментировать с различными алгоритмами, гиперпараметрами и методами предварительной обработки, чтобы еще больше улучшить свои прогностические модели.
Спасибо, что присоединились ко мне в этом путешествии, и удачного кодирования!
— -