Это вторая часть модели прогнозирования времени доставки еды. Если вы еще не читали первую статью, рекомендую сделать это, чтобы ознакомиться с набором данных.

Полный код модели прогнозирования времени доставки еды вы можете найти здесь.

Время доставки еды имеет решающее значение в индустрии доставки еды, поскольку оно напрямую влияет на удовлетворенность клиентов.

В первой статье мы исследовали набор данных доставки еды, сосредоточившись на таких важных задачах, как очистка данных и разработка функций. Эти начальные шаги закладывают основу для построения надежной модели машинного обучения.

В этой статье мы продолжим с того места, на котором остановились. Во-первых, мы выполним некоторые шаги предварительной обработки, такие как кодирование категориальных признаков, разделяющее данные на наборы для обучения и тестирования, и стандартизацию для подготовки данных для построения модели. Далее мы будем использовать перекрестную проверку, чтобы определить модель регрессии, которая лучше всего подходит для данных. Наконец, мы оценим производительность модели с помощью метрики оценки R2.

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

Кодирование категориальных признаков

Кодирование категориальных признаков необходимо в машинном обучении для преобразования категориальных значений в числовые представления. Многие модели машинного обучения предназначены для обработки числовых данных, поэтому преобразование категориальных переменных позволяет нам эффективно использовать эти модели. Существуют различные методы кодирования категориальных переменных, включая One Hot Encoding и Label Encoding.

В этом конкретном сценарии используется кодировка меток из-за наличия нескольких функций с категориальными значениями. Кодировка меток присваивает уникальную числовую метку каждой категории объекта. One Hot Encoding — это альтернативный подход, но он может привести к многомерному представлению.

def label_encoding(df):
    categorical_columns = df.select_dtypes(include='object').columns
    label_encoder = LabelEncoder()
    df[categorical_columns] = df[categorical_columns].apply(lambda col: label_encoder.fit_transform(col))

label_encoding(df_train)

Разделить данные обучения и тестирования

Теперь давайте разделим данные на обучающие и тестовые наборы данных. Это поможет нам оценить производительность модели машинного обучения на невидимых данных.

X = df_train.drop('Time_taken(min)', axis=1)  # Features
y = df_train['Time_taken(min)']  # Target variable

# Split the data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Стандартизация

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

# Create a StandardScaler object
scaler = StandardScaler()

# Fit the scaler on the training data
scaler.fit(X_train)

# Perform standardization on the training data
X_train = scaler.transform(X_train)

# Perform standardization on the testing data
X_test = scaler.transform(X_test)

После завершения этих шагов предварительной обработки наши данные теперь готовы к обучению.

Построение модели

На этом этапе мы обучим модель машинного обучения прогнозированию времени доставки еды, что относится к области задач регрессии, поскольку мы стремимся прогнозировать числовое значение. У нас есть множество алгоритмов регрессии, которые мы можем использовать для построения модели, такие как линейная регрессия, дерево решений, случайный лес и XGBoost.

Чтобы определить наиболее подходящий алгоритм для наших данных, мы можем использовать GridSearchCV. Используя этот метод, мы можем исследовать и определить алгоритм, который лучше всего соответствует нашей модели. Кроме того, мы можем точно настроить гиперпараметры для получения оптимальных результатов. GridSearchCV позволяет нам систематически искать различные комбинации алгоритмов и гиперпараметров, чтобы определить наилучшую конфигурацию для нашей конкретной задачи.

models = [
    LinearRegression(),
    DecisionTreeRegressor(),
    RandomForestRegressor(),
    xgb.XGBRegressor(),
]

param_grid = [
    {},  
    {'max_depth': [3, 5, 7]},
    {'n_estimators': [100, 200, 300]},
    {'n_estimators': [20, 25, 30], 'max_depth': [5, 7, 9]},
]

for i, model in enumerate(models):
    grid_search = GridSearchCV(model, param_grid[i], cv=5, scoring='r2')
    grid_search.fit(X_train, y_train)

    print(f"{model.__class__.__name__}:")
    print("Best parameters:", grid_search.best_params_)
    print("Best R2 score:", grid_search.best_score_)
    print()

По нашим оценкам, XGBoost является наиболее эффективным алгоритмом для данных о доставке еды с оптимальными гиперпараметрами n_estimators, установленными на 20 и max_depth установлено значение 9. Имея эти знания, мы можем приступить к обучению данных о доставке еды, используя модель XGBoost и определенные гиперпараметры, тем самым используя ее превосходную производительность для нашей конкретной задачи.

# Create a XGB regressor model
model = xgb.XGBRegressor(n_estimators=20,max_depth=9)

# Fit the model on the training data
model.fit(X_train, y_train)

После построения модели следующим важным шагом является оценка ее производительности на невидимых данных. Эта оценка позволяет нам оценить, насколько эффективно модель обобщает новые, невидимые экземпляры.

Оценить модель

Для оценки производительности модели мы будем использовать метрику оценки R2. Оценка R2 указывает, в какой степени наша модель понимает взаимосвязь между входными функциями и целевой переменной. Более высокий балл R2 означает более эффективную модель, указывая на то, что она может зафиксировать и объяснить большую долю дисперсии целевой переменной на основе предоставленных функций.

# Make predictions on the test data
y_pred = model.predict(X_test)

mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print("Mean Absolute Error (MAE):", round(mae,2))
print("Mean Squared Error (MSE):", round(mse,2))
print("Root Mean Squared Error (RMSE):", round(rmse,2))
print("R-squared (R2) Score:", round(r2,2))

Оценка R2, равная 0,82, означает, что модель может объяснить примерно 82% дисперсии времени доставки еды на основе предоставленных функций.

Заключение

Таким образом, модель прогнозирования доставки еды была успешно построена с использованием XGBoost, в результате чего оценка R2 составила 0,82. Процесс разработки включал в себя важные этапы, такие как очистка данных, разработка функций, кодирование меток и стандартизация, чтобы обеспечить надлежащую подготовку данных. Далее мы провели тщательное сравнение различных алгоритмов регрессии с использованием перекрестной проверки, чтобы определить лучшую модель для набора данных о доставке еды.

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