Внедрение на основе спроса ценообразования на номера отеля в Data Science с использованием MLOps

Применение MLOps в Data Science для ценообразования на номера отеля на основе спроса

Введение

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

Цели обучения

  • Важность установки правильной цены на отели.
  • Очистка данных, преобразование наборов данных и предварительная обработка наборов данных.
  • Создание карт и визуальных графиков с использованием данных о бронировании гостиниц.
  • Применение анализа данных о бронировании гостиницы в реальном мире, используемого в научных исследованиях данных.
  • Выполнение анализа данных о бронировании гостиницы с использованием языка программирования Python.

Эта статья опубликована в рамках Блогосферы по науке о данных.

Что такое набор данных о цене на отельные комнаты?

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

Что такое анализ цены на отельные комнаты?

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

  1. Сезонность: Цены на комнаты резко повышаются в пиковые сезоны, например, во время праздников.
  2. Спрос: Цена на комнаты увеличивается, когда спрос высок, например, во время празднования мероприятия или спортивного события.
  3. Конкуренция: Цены на отельные комнаты сильно зависят от цен соседних отелей. Если количество отелей в районе увеличивается, цена на комнаты уменьшается.
  4. Удобства: Если в отеле есть бассейн, спа и тренажерный зал, он будет брать больше денег за эти услуги.
  5. Расположение: Отель в центре города может брать больше, чем отель в удаленном районе.

Важность установки правильной цены на отельные комнаты

Установка цены на комнаты важна для увеличения дохода и прибыли. Важность правильного установления цены на отельные комнаты заключается в следующем:

  • Максимизация дохода: Цена на отель является основным фактором увеличения дохода. Установив конкурентоспособную цену, гостиницы могут увеличить доход.
  • Увеличение клиентов: Больше гостей будут бронировать отель, когда цены на номера будут справедливыми. Это помогает увеличить занятость.
  • Максимизация прибыли: Гостиницы стремятся брать больше денег для увеличения прибыли. Однако, установив слишком высокую цену, можно уменьшить количество гостей, в то время как правильная цена увеличит число гостей.

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

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

Визуализация набора данных с использованием инструментов и техник

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

  • Matplotlib: Matplotlib является одним из ключевых инструментов на языке Python, используемых для создания диаграмм и графиков, таких как гистограммы и линейные графики.
  • Seaborn: Seaborn является еще одним инструментом визуализации на языке Python. Он помогает создавать более детализированные визуализации, такие как тепловые карты и скрипичные графики.

Техники визуализации набора данных по бронированию отелей.

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

Примеры использования и приложения анализа данных по бронированию отелей в области науки о данных

Набор данных по бронированию отелей имеет несколько примеров использования и приложений, как описано ниже:

  1. Анализ отзывов клиентов: С использованием методов машинного обучения, таких как анализ отзывов клиентов, менеджеры могут определить настроение и улучшить обслуживание для лучшего опыта.
  2. Прогнозирование уровня занятости: Исходя из отзывов и оценок клиентов, менеджеры могут оценить уровень занятости номеров в краткосрочной перспективе.
  3. Операционная деятельность: Этот набор данных также может использоваться для отслеживания инвентаря; это позволяет отелям иметь достаточное количество комнат и материалов.
  4. Питание и напитки: Данные также могут использоваться для установления цен на пищу и напитки с целью максимизации выручки при сохранении конкурентоспособности.
  5. Оценка эффективности: Этот набор данных также помогает разрабатывать персонализированные рекомендации для гостей, тем самым улучшая рейтинги отелей.

Проблемы анализа данных по бронированию отелей

Бронирование номеров в отеле может иметь несколько проблем по разным причинам:

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

Лучшие практики анализа данных по бронированию отелей

Лучшие практики анализа данных по бронированию отелей:

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

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

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

Анализ данных также помогает менеджменту понять своих клиентов и управлять своим инвентарем. Это помогает установить динамические цены на номера в зависимости от спроса. Улучшенное управление инвентарем помогает сократить затраты.

Анализ данных о гостиничных номерах с использованием Python

Давайте выполним фундаментальный анализ данных с помощью Python на наборе данных из Kaggle. Чтобы скачать набор данных, нажмите здесь.

Детали данных

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

Визуализация наборов данных

Шаг 1. Импорт библиотек и чтение набора данных

#Импорт библиотекimport numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.preprocessing import LabelEncoder

Шаг 2. Импорт набора данных и проверка данных

#Чтение файла и преобразование в DataFramedf = pd.read_csv('data\hotel_bookings.csv')#Отображение формы DataFramedf.shape(119390, 32)#Проверка образцов данных df.head()#Проверка информации о наборе данныхdf.info()#Проверка наличия пустых значенийdf.isna().sum()

ВЫВОД

Шаг 3. Визуализация набора данных

#Ящиковая диаграмма распределения количества ночей, проведенных в отелях по сегментам рынка и типам отелейplt.figure(figsize = (15,8))sns.boxplot(x = "market_segment", y = "stays_in_week_nights", data = df, hue = "hotel", palette = 'Set1')

ВЫВОД

#Построение ящиковой диаграммы для сегмента рынка по количеству ночей в выходныеplt.figure(figsize=(12,5))sns.boxplot(x = "market_segment", y = "stays_in_weekend_nights", data = df, hue = "hotel", palette = 'Set1');

ВЫВОД

Наблюдение

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

#Столбчатая диаграмма средней дневной выручки по месяцамplt.figure(figsize = (12,5))sns.barplot(x = 'arrival_date_month', y = 'adr', data = df);

ВЫВОД

Описание работы

В реализации я покажу, как я использовал конвейер ZenML для создания модели, которая использует исторические данные о клиентах для прогнозирования оценки отзыва для следующего заказа или покупки. Кроме того, я развернул приложение Streamlit для представления конечного продукта.

Что такое ZenML?

ZenML – это открытый фреймворк MLOps, упрощающий создание готовых к производству конвейеров ML. Конвейер представляет собой серию взаимосвязанных шагов, где результат одного шага служит входными данными для другого шага, что приводит к созданию готового продукта. Ниже приведены причины выбора конвейера ZenML:

  • Эффективное создание конвейера
  • Стандартизация рабочих процессов ML
  • Анализ данных в реальном времени

Построение модели недостаточно; мы должны развернуть модель в продакшн и отслеживать работу модели со временем и ее взаимодействие с точными мировыми данными. Конвейер машинного обучения от начала до конца – это серия взаимосвязанных шагов, где результат одного шага служит входными данными для другого шага. Через этот процесс можно автоматизировать весь рабочий процесс машинного обучения, от подготовки данных до обучения и развертывания моделей. Это поможет нам непрерывно прогнозировать и уверенно развертывать модели машинного обучения. Таким образом, мы сможем отслеживать нашу готовую к производству модель. Я настоятельно рекомендую обратиться к документации ZenML для получения более подробной информации.

Первый конвейер, который мы создаем, состоит из следующих шагов:

  • ingest_data: Этот метод получит данные и создаст DataFrame.
  • clean_data: Этот метод очистит данные и удалит ненужные столбцы.
  • model_train: Этот метод обучит и сохранит модель, используя автоматическую регистрацию MLflow.
  • Evaluation: Этот метод оценит модель и сохранит метрики – с использованием автоматической регистрации MLflow – в артефактном хранилище.

Разработка модели

Как мы уже обсуждали выше, есть несколько этапов. Теперь мы сосредоточимся на части кодирования.

Взятие данных

class IngestData:    """    Взятие данных из data_path    """    def __init__(self,data_path:str) -> None:        """        Аргументы:            data_path: Путь, где находится файл данных        """        self.data_path = data_path    def get_data(self):        """        Взятие данных из data_path        Возвращает взятые данные        """        logging.info(f"Взятие данных из {self.data_path}")        return pd.read_csv(self.data_path)    @stepdef ingest_df(data_path:str) -> pd.DataFrame:    """"       Взятие данных из data_path.       Аргументы:       data_path: путь к данным       Возвращает:       pd.DataFrame: взятые данные     """    try:        ingest_data = IngestData(data_path)        df = ingest_data.get_data()        return df    except Exception as e:        logging.error(f"Ошибка при взятии данных")        raise e

Выше мы определили метод ingest_df(), который принимает путь к файлу в качестве аргумента и возвращает фрейм данных. Здесь @step является декоратором zenml. Он используется для регистрации функции как шага в конвейере.

Очистка данных и обработка

data["agent"].fillna(data["agent"].median(),inplace=True)data["children"].replace(np.nan,0, inplace=True)data = data.drop(data[data['adr'] < 50].index)data = data.drop(data[data['adr'] > 5000].index)data["total_stay"] = data['stays_in_week_nights'] + data['stays_in_weekend_nights']            data["total_person"] = data["adults"] + data["children"] + data["babies"]  #Инженерия признаковle = LabelEncoder()data['hotel'] = le.fit_transform(data['hotel'])data['arrival_date_month'] = le.fit_transform(data['arrival_date_month'])data['meal'] = le.fit_transform(data['meal'])data['country'] = le.fit_transform(data['country'])data['market_segment'] = le.fit_transform(data['market_segment'])data['reserved_room_type'] = le.fit_transform(data['reserved_room_type'])data['assigned_room_type'] = le.fit_transform(data['assigned_room_type'])data['deposit_type'] = le.fit_transform(data['deposit_type'])data['customer_type'] = le.fit_transform(data['customer_type'])
  • В приведенном выше коде мы удаляем пустые значения и выбросы. Объединяем пребывание в будний день и пребывание в выходные, чтобы получить общее количество дней пребывания.
  • Затем мы выполняем кодирование меток для категориальных столбцов, таких как отель, страна, тип депозита и т. д.

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

from zenml import pipeline@pipeline(enable_cache=False)def train_pipeline(data_path: str):    df = ingest_df(data_path)    X_train, X_test, y_train, y_test = clean_df(df)    model = train_model(X_train, X_test, y_train, y_test)    r2_score,rsme = evaluate_model(model,X_test,y_test)

Мы будем использовать декоратор zenml @pipeline для определения метода train_pipeline(). Метод train_pipeline принимает путь к файлу в качестве аргумента. После взятия данных и разделения их на обучающую и тестовую выборки вызывается метод train_model(). Этот метод train_model() будет использовать различные алгоритмы, такие как Lightgbm, Random Forest, Xgboost и Linear_Regression, для обучения на наборе данных.

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

Мы будем использовать RMSE, R2-количество и MSE разных алгоритмов для определения лучшего из них. В следующем коде мы определили метод evaluate_model(), чтобы использовать другие метрики оценки.

@step(experiment_tracker=experiment_tracker.name)def evaluate_model(model: RegressorMixin,                   X_test: pd.DataFrame,                   y_test: pd.DataFrame,                   ) -> Tuple[                       Annotated[float, "r2_score"],                       Annotated[float, "rmse"]                   ]:    """    Оценивает модель на взятых данных.        Аргументы:        model: RegressorMixin        x_test: pd.DataFrame        y_test: pd.DataFrame        Возвращает:        r2 R2-количество,        rmse RSME    """    try:        prediction = model.predict(X_test)        mse_class = MSE()        mse = mse_class.calculate_scores(y_test,prediction)        mlflow.log_metric("mse",mse)                r2_class = R2()        r2 = r2_class.calculate_scores(y_test,prediction)        mlflow.log_metric("r2",r2)        rmse_class = RMSE()        rmse = rmse_class.calculate_scores(y_test,prediction)        mlflow.log_metric("rmse",rmse)        return r2,rmse    except Exception as e:        logging.error("Ошибка при оценке модели: {}".format(e))        raise e

Настройка среды

Создайте виртуальную среду с помощью Python или Anaconda.

#Команда для создания виртуальной среды python3 -m venv <название_виртуальной_среды>

Вы должны установить некоторые пакеты Python в своей среде с помощью следующей команды.

cd zenml -project /hotel-room-bookingpip install -r requirements.txt

Чтобы выполнить скрипт run_deployment.py, вам также понадобится установить некоторые интеграции с использованием ZenML:

zenml initzenml integration install mlflow -y

В этом проекте мы создали две конвейеры

  • run_pipeline.py, конвейер, который только обучает модель
  • run_deployment.py, конвейер, который также непрерывно разворачивает модель.

run_pipeline.py принимает путь к файлу в качестве аргумента и выполняет метод train_pipeline(). Ниже приведена наглядная иллюстрация различных операций, выполняемых run_pipeline(). Это можно просмотреть с помощью панели инструментов, предоставленной Zenml.

URL панели инструментов: http://127.0.0.1:8237/workspaces/default/pipelines/95881272-b1cc-46d6-9f73-7b967f28cbe1/runs/803ae9c5-dc35-4daa-a134-02bccb7d55fd/dag

run_deployment.py:- В этом файле мы выполним continuous_deployment_pipeline и inference_pipeline.

continuous_deployment_pipeline

from pipelines.deployment_pipeline import continuous_deployment_pipeline,inference_pipelinedef main(config: str,min_accuracy:float):    mlflow_model_deployment_component = MLFlowModelDeployer.get_active_model_deployer()    deploy = config == DEPLOY or config == DEPLOY_AND_PREDICT    predict = config == PREDICT or config == DEPLOY_AND_PREDICT     if deploy:        continuous_deployment_pipeline(            data_path=str            min_accuracy=min_accuracy,            workers=3,            timeout=60        )            df = ingest_df(data_path=data_path)    X_train, X_test, y_train, y_test = clean_df(df)    model = train_model(X_train, X_test, y_train, y_test)    r2_score, rmse = evaluate_model(model,X_test,y_test)    deployment_decision = deployment_trigger(r2_score)    mlflow_model_deployer_step(model=model,                               deploy_decision=deployment_decision,                               workers=workers,                               timeout=timeout)

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

inference_pipeline

@pipeline(enable_cache=False, settings={"docker": docker_settings})def inference_pipeline(pipeline_name: str, pipeline_step_name: str):    # Связываем все этапы артефактов    batch_data = dynamic_importer()    model_deployment_service = prediction_service_loader(        pipeline_name=pipeline_name,        pipeline_step_name=pipeline_step_name,        running=False,    )    predictor(service=model_deployment_service, data=batch_data)

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

  • dynamic_importer:- Загружает набор данных и выполняет предобработку.
  • prediction_service_loader: – Загружает развернутую модель с использованием параметра имени конвейера и имени этапа, предоставленными Zenml.
  • Predictor: – После обучения модели будет выполнено прогнозирование на тестовом наборе данных.

Теперь мы можем визуализировать конвейеры, используя панель инструментов Zenml, чтобы получить четкое представление.

Панель инструментов continuous_deployment_pipeline:-

URL панели инструментов:- http://127.0.0.1:8237/workspaces/default/pipelines/9eb06aba-d7df-43ef-a017-8cb5bb13cd89/runs/e4208fa5-48c8-4a8c-91f1-011c5e1ddbf9/dag

Панель инструментов inference_pipeline:-

URL панели управления:-http://127.0.0.1:8237/workspaces/default/pipelines/07351bb1-6b0d-400e-aeea-551159346f0e/runs/c1ce61f8-dd12-4244-a4d6-514e5520b879/dag

Мы развернули приложение Streamlit, которое асинхронно использует последнюю модель сервиса из конвейера. Это можно быстро сделать с помощью ZenML внутри кода Streamlit. Чтобы запустить это приложение Streamlit на вашей локальной системе, используйте следующую команду:

# команда для запуска приложения Streamlit локальноstreamlit run streamlit_app.py

Вы можете получить полный код реализации от начала до конца здесь

Результаты

Мы провели эксперименты с несколькими алгоритмами и сравнили производительность каждой модели. Результаты следующие:

Модель Случайного Леса показывает лучшие результаты с наименьшим значением MSE и наивысшим значением R^2. Это означает, что она наиболее точно предсказывает целевую переменную и объясняет наибольшую дисперсию в целевой переменной. Вторая лучшая модель – модель LightGBM, за ней следует модель XGBoost. Линейная регрессионная модель показывает самые плохие результаты.

Демонстрационное приложение

Живое демонстрационное приложение этого проекта с использованием Streamlit. Оно принимает определенные характеристики продукта и прогнозирует уровень удовлетворенности клиента с помощью наших обученных моделей.

Заключение

Сектор бронирования отелей также быстро развивается, поскольку доступность Интернета увеличивается в различных частях мира. В связи с этим возрос спрос на онлайн-бронирование гостиничных номеров. Управление отелями желает знать, как удержать своих гостей и улучшить продукты и услуги для принятия более правильных решений. Машинное обучение является важным в различных бизнес-областях, таких как сегментация клиентов, прогнозирование спроса, рекомендация продуктов, удовлетворенность гостей и т. д.

Часто задаваемые вопросы

Медиа, показанное в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.