当前位置: 首页 > 科技观察

在Airbnb使用机器学习预测房源的价格

时间:2023-03-14 21:31:21 科技观察

使用机器学习来预测Airbnb房源的价格这种数据产品的成本非常高。例如,个性化搜索排名可以让客户更容易找到心仪的房子,智能定价可以让房东设定更具竞争力的价格。然而,制造这些产品需要许多数据科学家和工程师花费大量时间和精力。最近,Airbnb的机器学习基础设施得到了改进,使得将新的机器学习模型部署到生产环境中的成本大大降低。例如,我们的MLInfra团队构建了一个通用特征库,允许用户在他们的模型中应用更多高质量、过滤和可重用的特征。数据科学家也开始将自动化机器学习工具整合到他们的工作流程中,以加快模型选择并提高性能标准。此外,MLInfra创建了一个新框架,可以自动将Jupyter笔记本转换为Airflow管道可接受的格式。在本文中,我描述了这些工具如何协同工作以加速建模,从而降低开发LTV模型(预测Airbnb房价)的总体成本。什么是生命周期价值?LTV的全称是CustomerLifetimeValue,意为“客户终生价值”。这是电子商务和营销公司中非常流行的概念。它定义了用户在未来一段时间内预计为公司带来的收入,通常以美元为单位。在一些电子商务公司,如Spotify或Netflix,LTV经常被用来制定产品定价(如订阅费等)。在Airbnb这样的营销公司,了解用户的LTV会帮助我们更有效地分配营销渠道预算,更清晰地根据关键词进行网络营销报价,更好地进行品类细分。我们可以根据过去的数据计算历史值,当然我们可以更进一步,用机器学习来预测新注册房屋的LTV。LTV模型的机器学习工作流程数据科学家通常熟悉机器学习任务,例如特征工程、原型制作、模型选择等。但是,将模型原型投入生产需要一系列数据工程技术,他们可能不是很熟练在。幸运的是,我们有相关的机器学习工具,可以将具体的生产部署工作流程与机器学习模型的分析和建立分开。没有这些神奇的工具,我们将无法轻松地将我们的模型投入生产。下面将通过4个主题介绍我们的工作流程和分别使用的工具:特征工程:定义相关特征原型设计和训练:训练模型原型模型选择和验证:选择模型和调整参数生产部署:将选择一个好的模型原型是使用特征工程工具将其放入生产环境:Airbnb内部特征库——Zipline任何监督学习项目的第一步都是找到会影响结果的相关特征。这个过程称为特征工程。例如,在预测LTV时,一个特征可能是一个列表在接下来的180天内可用的天数百分比,或者它可能是与同一市场中其他房屋相比的定价差异。在Airbnb,特征工程通常涉及从头开始编写Hive查询以创建特征。但是这份工作很无聊,而且要花很多时间。因为它需要一些特定的领域知识和业务逻辑,所以这些特征管道不容易共享或重用。为了使这项工作更具可扩展性,我们开发了Zipline——一个训练功能库。它可以提供不同粒度级别(例如房主、客户、上市公司和市场级别)的功能。这种内部工具的“多源共享”特性使数据科学家能够从过去的项目中识别出大量经过审查的高质量特征。如果没有找到你要提取的特征,用户也可以写一个配置文件创建自己需要的特征:source:{type:hivequery:"""SELECTid_listingaslisting,dim_cityascity,dim_countryascountry,dim_is_activeasis_active,CONCAT(ds,'23:59:59.999')astsFROMcore_data.dim_listingsWHEREdsBETWEEN'{{start_date}}'AND'{{end_date}}'"""dependencies:[core_data.dim_listings]is_snapshot:truestart_date:2010-01-01}features:{city:"列表所在的城市。”country:"Countryinwhichthelistingislocated."is_active:"Ifthelistingisactiveasthedatepartition."}在构建训练集时,Zipline会找出训练集需要的特征,根据key自动组合特征并填充数据。在构建listingLTV模型时,我们使用了一些Zipline中已经存在的特性,同时也自己编写了一些特性。该模型总共使用了150多个特征,包括:位置:国家、市场、社区和其他地理特征价格:隔夜费、清洁费、与类似房源的价格差异已关闭的夜间预订百分比可预订:预订数量以及过去X天的每晚预订数量质量:评论分数、评论数量、用于训练模型的便利设施数据。原型制作和训练的工具:Python机器学习库——scikit-learn以前面的训练集为例,我们需要在训练前对数据进行一些预处理:数据插补:我们需要检查是否有缺失数据,以及是否随机丢失。如果它不是随机现象,我们需要找出它的根本原因;如果它随机丢失,我们需要填补空白数据。对分类进行编码:通常我们不能直接在模型中使用原始分类,因为模型无法拟合字符串。当类别数量比较少的时候,我们可以考虑使用one-hotencoding进行编码。如果类别数量比较多,我们会考虑使用ordinalencoding,即按照类别出现的频率计数进行编码。在这一步,我们还不知道最有效的特性集是什么,所以编写快速迭代的代码很重要。Scikit-Learn、Spark等开源工具的流水线结构是非常方便的原型制作工具。Pipeline允许数据科学家设计蓝图以指定如何转换特征以及训练哪个模型。更具体地说,您可以在下面查看我们LTV模型的管道:transforms=[]transforms.append(('select_binary',ColumnSelector(features=binary)))transforms.append(('numeric',ExtendedPipeline([('选择',ColumnSelector(features=numeric)),('impute',Imputer(missing_values='NaN',strategy='mean',axis=0)),])))forfieldincategorical:transforms.append((field,ExtendedPipeline([('select',ColumnSelector(features=[field])),('encode',OrdinalEncoder(min_support=10))])))features=FeatureUnion(transforms)在高层设计中,我们使用流水线根据特征类型(如二值特征、分类特征、数值特征等)来指定数据在不同特征中的变换。***使用FeatureUnion简单的将特征列组合起来形成最终的训练集。使用流水线开发原型的好处是可以使用数据转换,避免繁琐的数据转换。总的来说,这些转换旨在确保数据在训练和评估期间保持一致,以避免在将原型部署到生产时出现数据不一致。此外,管道还可以将数据转换过程与训练模型过程分开。虽然没有在上面的代码中,但数据科学家可以在最后一步指定一个估计器(estimator)来训练模型。通过试验不同的估计器,数据科学家可以为模型选择性能最佳的估计器,从而减少模型的样本误差。使用工具进行模型选择和验证:各种自动化机器学习框架如上一节所述,我们需要确定哪个候选模型最适合生产。为了做出这个决定,我们需要在模型可解释性和复杂性之间做出权衡。例如,稀疏线性模型具有很好的可解释性,但它们的复杂度太低而无法很好地工作。一个足够复杂的树模型可以适应各种非线性模式,但它的可解释性很差。这种情况也称为偏差和方差之间的权衡。上图引用自James,Witten,Hastie,Tibshirani《R 语言统计学习》在保险,信用审查等方面,需要对模型进行解释。因为对于模型来说,避免无意中排除一些正确的客户是很重要的。然而,在图像分类等应用中,模型的高性能比可解释性更重要。由于模型选择非常耗时,我们选择使用各种自动化机器学习工具来加快这一步骤。通过探索大量模型,我们最终会找到性能最好的模型。例如,我们发现XGBoost(XGBoost)明显优于其他基线模型(例如均值响应模型、岭回归模型、单决策树)。上图:我们可以通过比较RMSE选择性能更好的模型鉴于我们最初的目标是预测房价,我们很乐意在最终生产环境中使用XGBoost模型,它更注重可解释性而不是可解释性模型弹性。生产部署工具:Airbnb写的notebook转换框架—MLAutomator正如开头所说,构建生产环境工作流与在notebook上构建原型是完全不同的。例如,我们如何进行定期再培训?我们如何有效地评估大量实例?我们如何构建一个管道来随着时间的推移监控模型性能?在Airbnb,我们自己开发了一个名为MLAutomator的框架,它可以自动将Jupyternotebook转换为Airflow机器学习流水线。该框架专为熟悉使用Python开发原型但缺乏将模型投入生产的经验的数据科学家而设计。MLAutomator框架概述(图片来源:AaronKeys)首先,该框架要求用户在笔记本中指定模型的配置。这个配置会告诉框架如何定位训练数据表,分配多少计算资源用于训练,以及如何计算模型评估分数。此外,数据科学家需要自己编写特定的拟合和转换函数。fit函数指定如何训练,transform函数将由PythonUDF包装以进行分布式计算(如果需要)。下面的代码片段显示了我们LTV模型中的拟合和转换函数。fit函数告诉框架XGBoost模型需要训练,transformer会根据我们之前定义的pipeline对数据进行转换。deffit(X_train,y_train):importmultiprocessingfromml_helpers.sklearn_extensionssimportDenseMatrixConverterfromml_helpers.dataimportsplit_recordsfromxgboostimportXGBRegressorglobalmodelmodel={}n_subset=N_EXAMPLESX_subset={k:v[:n_subset]fork,vinX_train.iteritems()}模型['transformations']=(['transformations']=([s,ipfelineExtendedPfeatures),('densify',DenseMatrixConverter()),]).fit(X_subset)#并行使用转换器Xt=model['transformations'].transform_parallel(X_train)#并行模型拟合model['regressor']=XGBRegressor().fit(Xt,y_train)deftransform(X):#returndictionaryglobalmodelXt=model['transformations'].transform(X)return{'score':model['regressor'].predict(Xt)}一次笔记本完成后,MLAutomator会将经过训练的模型包装在PythonUDF中,并创建如下图所示的Airflow管道。数据序列化、定期再训练和分布式评估等数据工程任务都将加载到日常批处理作业中。因此,这个框架大大降低了数据科学家将模型投入生产的成本,仿佛有一个数据工程师与科学家一起工作!我们在AirflowDAG中的LTV模型的图形界面,在生产环境中运行注意:除了模型生产优化之外,还有其他项目(如跟踪模型性能随时间变化、使用弹性计算环境建模等)我们没有在本文中介绍。这些都是正在开发的热点区域。经验和展望在过去的几个月里,我们的数据科学家与MLInfra密切合作,产生了许多伟大的模式和想法。我们相信这些工具将为Airbnb开发机器学习模型开辟新范式。首先,模型的开发成本显着降低:通过结合各种独立工具的优势(用于特征工程的Zipline、用于模型原型制作的Pipeline、用于模型选择和验证的AutoML以及用于模型生产的最新MLAutomator),我们大大缩短了模型的开发周期。其次,笔记本的设计降低了进入门槛:还不熟悉框架的数据科学家可以立即访问大量真实世界的用例。在生产环境中,您可以确保笔记本是正确的、不言自明的和唯一的。这种设计模式深受新用户的欢迎。因此,团队将更愿意专注于机器学习产品创意:截至撰写本文时,我们还有其他几个团队以类似的方式探索机器学习产品创意:排序以检查列表队列、预测列表是否会添加合作伙伴、自动标记低质量列表等。我们对这个框架和它带来的新范例的未来感到无比兴奋。通过缩小原型和生产环境之间的差距,我们可以授权数据科学家和数据工程师进行端到端的机器学习项目,并使我们的产品变得更好。