Press "Enter" to skip to content

在数据科学中使用MLOps实施基于需求的酒店房间定价

介绍

在Covid期间,酒店业的收入大幅下降。因此,当人们开始更多地旅行时,吸引顾客仍然是一个挑战。我们将开发一种机器学习工具来解决这个问题,并设置试衣间以吸引更多顾客。利用酒店的数据集,我们将建立一个人工智能工具来选择正确的房价,提高入住率,增加酒店的收入。

学习目标

  • 设置酒店房间正确价格的重要性。
  • 清洗数据,转换数据集和预处理数据集。
  • 使用酒店预订数据创建地图和可视化图表。
  • 数据科学中使用酒店预订数据分析的实际应用。
  • 使用Python编程语言进行酒店预订数据分析。

本文作为数据科学博客马拉松的一部分发表。

什么是酒店房价数据集?

酒店预订数据集包含来自不同来源的数据,包括酒店类型、成人数量、停留时间、特殊要求等列。这些值可以帮助预测酒店房价,从而增加酒店的收入。

酒店房价分析是什么?

在酒店房价分析中,我们将分析数据集的模式和趋势。根据这些信息,我们将进行与定价和运营相关的决策。这些决策将受到多个因素的影响。

  1. 季节性:房价在旺季(如假期)大幅上涨。
  2. 需求:当需求高时(如庆典活动或体育赛事),房价会上涨。
  3. 竞争:酒店房价受附近酒店价格的影响很大。如果一个地区的酒店数量过多,则房价会降低。
  4. 设施:如果酒店有游泳池、水疗中心和健身房等设施,它们会对这些设施收取更高的费用。
  5. 位置:位于主要城镇的酒店相比较而言可以收费更高。

正确设置酒店房价的重要性

设置房价对于增加收入和利润至关重要。正确设置酒店房价的重要性如下:

  • 最大化收入:房价是增加收入的主要关键。通过设置有竞争力的价格,酒店可以增加收入。
  • 增加客户:当房价公平时,更多客人会预订酒店。这有助于增加入住率。
  • 最大化利润:酒店试图提高价格以增加利润。然而,提高价格会减少客人数量,而正确设置价格会增加客人数量。

收集数据和预处理

数据收集预处理是酒店房价分析的重要部分。数据是从酒店网站、预订网站和公共数据集收集的。然后将该数据集转换为可视化所需的格式。在预处理过程中,数据集经历数据清洗和转换。新转换的数据集用于可视化和模型构建。

使用工具和技术可视化数据集

可视化数据集有助于获取洞察力并找到模式,以做出更好的决策。以下是提供更好可视化的 Python 工具:

  • Matplotlib:Matplotlib 是 Python 中用于创建诸如条形图和线图等图表的关键工具之一。
  • Seaborn:Seaborn 是 Python 中的另一个可视化工具。它有助于创建更详细的可视化图像,如热力图和小提琴图。

用于可视化酒店预订数据集的技术

  • 箱线图:该库通过市场细分和停留时间之间的图形来绘制图表。它有助于理解客户类型。
  • 柱状图:使用柱状图,我们绘制了每日平均收入和月份之间的图形;这有助于了解更繁忙的月份。
  • 计数图:我们使用计数图绘制了市场细分和存款类型之间的图表,以了解酒店接收更多存款的细分。

酒店客房数据分析在数据科学中的用途和应用

酒店预订数据集有多种用途和应用,如下所述:

  1. 客户情感分析:通过使用机器学习技术,如客户情感分析,从客户评论中,经理可以确定情感并改善服务,以提供更好的体验。
  2. 预测入住率:通过客户评论和评级,经理可以估计短期内的房间入住率。
  3. 业务运营:这个数据集还可以用于跟踪库存;这使酒店能够拥有足够的房间和材料。
  4. 餐饮业:数据还可以用于设置食品和饮料的价格,以最大化收入同时保持竞争力。
  5. 绩效评估:这个数据集还有助于为客人的体验提供个性化建议。从而提高酒店评级。

酒店客房数据分析的挑战

由于各种原因,酒店客房预订日期可能面临一些挑战:

  • 数据质量:由于我们从多个数据集中收集数据,数据集的质量会受到影响,可能会出现数据缺失、不一致和不准确的情况。
  • 数据隐私:酒店从客户那里收集敏感数据,如果这些数据泄露,会威胁到客户的安全。因此,遵守数据安全准则几乎成为首要任务。
  • 数据整合:酒店有多个系统,如物业管理和预订网站,因此整合这些系统会有困难。
  • 数据量:酒店客房数据可能非常庞大,使得管理和分析变得具有挑战性。

酒店客房数据分析的最佳实践

酒店客房数据分析的最佳实践:

  • 使用物业管理系统、在线预订平台和客户反馈系统来收集数据。
  • 通过定期监控和清理数据来确保数据质量。
  • 通过实施安全措施并遵守数据隐私法规来保护数据隐私。
  • 整合来自不同系统的数据,以获得关于酒店客房数据的完整图片。
  • 使用机器学习技术,如LSTM,来预测房价。
  • 使用数据分析来优化业务运营,如库存和人员安排。
  • 使用数据分析来定向市场推广活动,以吸引更多客人。
  • 使用数据分析来评估绩效并提供创新的客户体验。
  • 借助数据分析,管理层可以更好地了解客户并提供更好的服务。

随着消费支出的增加,酒店和旅游业受益匪浅。这创造了分析客户支出和行为的新趋势和数据。AI工具的增加为探索和发挥该行业的最大潜力提供了机会。借助AI工具的帮助,我们可以收集所需数据并删除不必要的数据,即进行数据预处理。

基于这些数据,我们可以训练我们的模型生成有价值的洞察和实时分析。这也有助于根据每个客户和客人的个体需求提供个性化体验。这对酒店和客户都有很大的好处。

数据分析还帮助管理团队了解他们的客户和库存。这有助于根据需求设置动态房价。更好的库存管理有助于降低成本。

使用Python进行酒店客房数据分析

让我们在Kaggle的数据集上使用Python进行基本的数据分析。要下载数据集,请点击此处。

数据详情

宿舍预订数据集包括不同类型的酒店信息,例如度假酒店和城市酒店,以及市场细分。

数据集的可视化

步骤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')# 显示DataFrame的形状df.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 自动记录训练并保存模型。
  • 评估:此方法将评估模型并将指标(使用 MLflow 自动记录)保存到存储库中。

模型开发

正如我们之前讨论的,经历了不同的步骤。现在,我们将专注于编码部分。

数据摄取

class IngestData:    """    从数据路径摄取数据    """    def __init__(self,data_path:str) -> None:        """        参数:            数据路径: 数据文件所在的路径        """        self.data_path = data_path    def get_data(self):        """        从数据路径摄取数据        返回摄取的数据        """        logging.info(f"从{self.data_path}摄取数据")        return pd.read_csv(self.data_path)    @stepdef ingest_df(data_path:str) -> pd.DataFrame:    """"       从数据路径摄取数据。       参数:       数据路径:数据的路径       返回:       pd.DataFrame: 摄取的数据     """    try:        ingest_data = IngestData(data_path)        df = ingest_data.get_data()        return df    except Exception as e:        logging.error("摄取数据时发生错误")        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()方法。该方法将使用不同的算法(如Lightgbm、随机森林、Xgboost和线性回归)对数据集进行训练。

模型评估

我们将使用不同算法的均方根误差(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: RMSE    """    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 <virtual_environment_name>

您必须使用以下命令在环境中安装一些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_loaderpredictor。每个方法都有不同的功能。

  • 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 仪表板:

控制面板网址:-http://127.0.0.1:8237/workspaces/default/pipelines/07351bb1-6b0d-400e-aeea-551159346f0e/runs/c1ce61f8-dd12-4244-a4d6-514e5520b879/dag

我们已经部署了一个使用最新型号服务的Streamlit应用程序,可以在管道中异步使用。使用Streamlit代码,可以快速完成ZenML。要在本地系统中运行此Streamlit应用程序,请使用以下命令:

# 在本地运行Streamlit应用程序的命令
streamlit run streamlit_app.py

您可以在此处获取完整的端到端实现代码

结果

我们已经尝试了多种算法,并比较了每个模型的性能。结果如下:

随机森林模型具有最低的MSE和最高的R^2分数,表现最佳。这意味着它在预测目标变量方面最准确,并且解释目标变量的大部分差异。LightGBM模型是第二好的模型,其次是XGBoost模型。线性回归模型表现最差。

演示应用

使用Streamlit的此项目的实时演示应用程序。它使用产品的一些输入特征,并使用我们训练的模型预测客户满意度。

结论

由于全球各地的网络可访问性增加,酒店客房预订行业也在迅速发展。因此,对在线酒店客房预订的需求也在增加。酒店管理希望了解如何留住客人并改进产品和服务以做出更好的决策。机器学习在各种业务中至关重要,如客户细分、需求预测、产品推荐、客户满意度等。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *