- 原文地址:Using Machine Learning to Predict Value of Homes On Airbnb
- 原文做者:Robert Chang
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:lsvih
- 校对者:TobiasLee, RichardLeeH, reid3290
位于希腊爱琴海伊莫洛维里的一个 Airbnb 民宿的美好风景html
数据产品一直是 Airbnb 服务的重要组成部分,不过咱们很早就意识到开发一款数据产品的成本是很高的。例如,个性化搜索排序可让客户更容易发现中意的房屋,智能订价可让房东设定更具竞争力的价格。然而,须要许多数据科学家和工程师付出许多时间和精力才能作出这些产品。前端
最近,Airbnb 机器学习的基础架构进行了改进,使得部署新的机器学习模型到生产环境中的成本下降了许多。例如,咱们的 ML Infra 团队构建了一个通用功能库,这个库让用户能够在他们的模型中应用更多高质量、通过筛选、可复用的特征。数据科学家们也开始将一些自动化机器学习工具归入他们的工做流中,以加快模型选择的速度以及提升性能标准。此外,ML Infra 还建立了一个新的框架,能够自动将 Jupyter notebook 转换成 Airflow pipeline 能接受的格式。python
在本文中,我将介绍这些工具是如何协同运做来加快建模速度,从而下降开发 LTV 模型(预测 Airbnb 民宿价格)整体成本的。react
LTV 全称 Customer Lifetime Value,意为“客户终身价值”,是电子商务、市场公司中很流行的一种概念。它定义了在将来一个时间段内用户预期为公司带来的收益,一般以美圆为单位。android
在一些例如 Spotify 或者 Netflix 之类的电子商务公司里,LTV 一般用于制定产品订价(例如订阅费等)。而在 Airbnb 之类的市场公司里,知晓用户的 LTV 将有助于咱们更有效地分配营销渠道的预算,更明确地根据关键字作在线营销报价,以及作更好的类目细分。ios
咱们能够根据过去的数据来计算历史值,固然也能够进一步使用机器学习来预测新登记房屋的 LTV。git
数据科学家们一般比较熟悉和机器学习任务相关的东西,例如特征工程、原型制做、模型选择等。然而,要将一个模型原型投入生产环境中须要的是一系列数据工程技术,他们可能对此不太熟练。github
不过幸运的是,咱们有相关的机器学习工具,能够将具体的生产部署工做流从机器学习模型的分析创建中分离出来。若是没有这些神奇的工具,咱们就没法轻松地将模型应用于生产环境。下面将经过 4 个主题来分别介绍咱们的工做流以及各自用到的工具:apache
使用工具:Airbnb 内部特征库 — Zipline后端
任何监督学习项目的第一步都是去找到会影响到结果的相关特征,这一个过程被称为特征工程。例如在预测 LTV 时,特征能够是某个房源房屋在接下来 180 天内的可以使用天数所占百分比,或者也能够是其与同市场其它房屋订价的差别。
在 Airbnb 中,要作特征工程通常得从头开始写 Hive 查询语句来建立特征。可是这个工做至关无聊,并且须要花费不少时间。由于它须要一些特定的领域知识和业务逻辑,也所以这些特征 pipeline 并不容易共享或复用。为了让这项工做更具可扩展性,咱们开发了 Zipline —— 一个训练特征库。它能够提供不一样粒度级别(例如房主、客户、房源房屋及市场级别)的特征。
这个内部工具“多源共享”的特性让数据科学家们能够在过去的项目中找出大量高质量、通过审查的特征。若是没有找到但愿提取的特征,用户也能够写一个配置文件来建立他本身须要的特征:
source: {
type: hive
query:""" SELECT id_listing as listing , dim_city as city , dim_country as country , dim_is_active as is_active , CONCAT(ds, ' 23:59:59.999') as ts FROM core_data.dim_listings WHERE ds BETWEEN '{{ start_date }}' AND '{{ end_date }}' """
dependencies: [core_data.dim_listings]
is_snapshot: true
start_date: 2010-01-01
}
features: {
city: "City in which the listing is located."
country: "Country in which the listing is located."
is_active: "If the listing is active as of the date partition."
}复制代码
在构建训练集时,Zipline 将会找出训练集所须要的特征,自动的按照 key 将特征组合在一块儿并填充数据。在构造房源 LTV 模型时,咱们使用了一些 Zipline 中已经存在的特征,还本身写了一些特征。模型总共使用了 150 多个特征,其中包括:
实例数据集
在定义好特征以及输出变量以后,就能够根据咱们的历史数据来训练模型了。
使用工具:Python 机器学习库 — scikit-learn
之前面的训练集为例,咱们在作训练前先要对数据进行一些预处理:
在这一步中,咱们还不知道最有效的一组特征是什么,所以编写可快速迭代的代码是很是重要的。如 Scikit-Learn、Spark 等开源工具的 pipeline 结构对于原型构建来讲是很是方便的工具。Pipeline 可让数据科学家们设计蓝图,指定如何转换特征、训练哪个模型。更具体来讲,能够看下面咱们 LTV 模型的 pipeline:
transforms = []
transforms.append(
('select_binary', ColumnSelector(features=binary))
)
transforms.append(
('numeric', ExtendedPipeline([
('select', ColumnSelector(features=numeric)),
('impute', Imputer(missing_values='NaN', strategy='mean', axis=0)),
]))
)
for field in categorical:
transforms.append(
(field, ExtendedPipeline([
('select', ColumnSelector(features=[field])),
('encode', OrdinalEncoder(min_support=10))
])
)
)
features = FeatureUnion(transforms)复制代码
在高层设计时,咱们使用 pipeline 来根据特征类型(如二进制特征、分类特征、数值特征等)来指定不一样特征中数据的转换方式。最后使用 FeatureUnion 简单将特征列组合起来,造成最终的训练集。
使用 pipeline 开发原型的优点在于,它可使用 data transforms 来避免繁琐的数据转换。总的来讲,这些转换是为了确保数据在训练和评估时保持一致,以免将原型部署到生产环境时出现的数据不一致。
另外,pipeline 还能够将数据转换过程和训练模型过程分开。虽然上面代码中没有,但数据科学家能够在最后一步指定一种 estimator(估值器)来训练模型。经过尝试使用不一样的估值器,数据科学家能够为模型选出一个表现最佳的估值器,减小模型的样本偏差。
使用工具:各类自动机器学习框架
如上一节所述,咱们须要肯定候选模型中的哪一个最适合投入生产。为了作这个决策,咱们须要在模型的可解释性与复杂度中进行权衡。例如,稀疏线性模型的解释性很好,但它的复杂度过低了,不能很好地运做。一个足够复杂的树模型能够拟合各类非线性模式,可是它的解释性不好。这种状况也被称为误差(Bias)和方差(Variance)的权衡。
上图引用自 James、Witten、Hastie、Tibshirani 所著《R 语言统计学习》
在保险、信用审查等应用中,须要对模型进行解释。由于对模型来讲避免无心排除一些正确客户是很重要的事。不过在图像分类等应用中,模型的高性能比可解释更重要。
因为模型的选择至关耗时,咱们选择采用各类自动机器学习工具来加速这个步骤。经过探索大量的模型,咱们最终会找到表现最好的模型。例如,咱们发现 XGBoost (XGBoost) 明显比其余基准模型(好比 mean response 模型、岭回归模型、单一决策树)的表现要好。
上图:咱们经过比较 RMSE 能够选择出表现更好的模型
鉴于咱们的最初目标是预测房源价格,所以咱们很舒服地在最终的生产环境中使用 XGBoost 模型,比起可解释性它更注重于模型的弹性。
使用工具:Airbnb 本身写的 notebook 转换框架 — ML Automator
如开始所说,构建生产环境工做流和在笔记本上构建一个原型是彻底不一样的。例如,咱们如何进行按期的重训练?咱们如何有效地评估大量的实例?咱们如何创建一个 pipeline 以随时监视模型性能?
在 Airbnb,咱们本身开发了一个名为 ML Automator 的框架,它能够自动将 Jupyter notebook 转换为 Airflow 机器学习 pipeline。该框架专为熟悉使用 Python 开发原型,但缺少将模型投入生产环境经验的数据科学家准备。
ML Automator 框架概述(照片来源:Aaron Keys)
下面的代码片断展现了咱们 LTV 模型中的 fit 与 transform 函数。fit 函数告诉框架须要训练 XGBoost 模型,同时转换器将根据咱们以前定义的 pipeline 转换数据。
def fit(X_train, y_train):
import multiprocessing
from ml_helpers.sklearn_extensions import DenseMatrixConverter
from ml_helpers.data import split_records
from xgboost import XGBRegressor
global model
model = {}
n_subset = N_EXAMPLES
X_subset = {k: v[:n_subset] for k, v in X_train.iteritems()}
model['transformations'] = ExtendedPipeline([
('features', features),
('densify', DenseMatrixConverter()),
]).fit(X_subset)
# 并行使用转换器
Xt = model['transformations'].transform_parallel(X_train)
# 并行进行模型拟合
model['regressor'] = XGBRegressor().fit(Xt, y_train)
def transform(X):
# return dictionary
global model
Xt = model['transformations'].transform(X)
return {'score': model['regressor'].predict(Xt)}复制代码
一旦 notebook 完成,ML Automator 将会把训练好的模型包装在 Python UDF 中,并建立一个以下图所示的 Airflow pipeline。数据序列化、按期重训练、分布式评价等数据工程任务都将被载入到平常批处理做业中。所以,这个框架显著下降了数据科学家将模型投入生产的成本,就像有一位数据工程师在与科学家一块儿工做同样!
咱们 LTV 模型在 Airflow DAG 中的图形界面,运行于生产环境中
Note:除了模型生产化以外,还有一些其它项目(例如跟踪模型随着时间推移的性能、使用弹性计算环境建模等)咱们没有在这篇文章中进行介绍。这些都是正在进行开发的热门领域。
过去的几个月中,咱们的数据科学家们与 ML Infra 密切合做,产生了许多很好的模式和想法。咱们相信这些工具将会为 Airbnb 开发机器学习模型开辟新的范例。
咱们对这个框架和它带来的新范式的将来感到无比的兴奋。经过缩小原型与生产环境间的差距,咱们可让数据科学家和数据工程师更多去追求端到端的机器学习项目,让咱们的产品作得更好。
想使用或者一块儿开发这些机器学习工具吗?咱们正在寻找 能干的你加入咱们的数据科学与分析团队!
特别感谢参与这项工做的Data Science&ML Infra团队的成员:Aaron Keys, Brad Hunter, Hamel Husain, Jiaying Shi, Krishna Puttaswamy, Michael Musson, Nick Handel, Varant Zanoyan, Vaughn Quoss 等人。另外感谢 Gary Tang, Jason Goodman, Jeff Feng, Lindsay Pettingill 给本文提的意见。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。