解密Airbnb的定价算法

对于计划出租房屋的房主,你应该将房屋的租金设定为多少呢?或者对于租房的顾客而言,应该给自己的租房支付多少呢?不管是对于一次有计划的远足,还是一次说走就走的旅行,为租房付出多少才真正合适呢?

回答这些问题并不容易。事实上,可以通过将潜在的租房列在我们网站—Airbnb上来实现,Airbnb是一家联系旅游人士和家有空房出租的房主的服务型网站,它可以为用户提供各式各样的住宿信息。

在焦点小组,我们观察到人们在我们的网站上填写房屋信息的过程中,往往在价格选项上会显得为难。很多人会查看他们的邻居们所设置的价码,然后选择一个可比较的价格;这个过程会让用户在浏览器中打开很多标签,然后找出那些与他们接近的房源。有些人在填写信息之前,脑子里已经有了一个目标,可能是为了赚取一些额外的资金,来帮助支付抵押贷款或度假费用。于是,他们开出的价格主要是为帮助他们实现这一目标,反而没有考虑房子真实的市场价值。而对于这其中的有些人,不幸的是,通常他们的房子都没能被租出去。

显然,Airbnb需要为人们提供一种更好的方式—自动化定价,以帮助顾客做出正确的决定。这就是我们为什么在2012年就开始构建定价工具,并至今一直在努力地改进它们的原因。今年6月,我们发布了我们最新的版本。我们开始实行动态定价,也就是说,根据不断变化的市场条件每天提供新的价格提示。我们调整了我们的通用定价算法以考虑市场上一些偶然的、甚至是令人惊讶的特征。此外,我们还增加了一种独特的机器学习方法,让我们的系统不仅能从自己的经验中学习,而且必要时还能利用人的一些直觉。

在线网络中,许多公司使用算法来设置或建议价格。以易趣为例,它会告诉用户哪些类似的产品已经售出,以致用户可以基于这些信息对自己的产品设置价格。易趣的定价问题是相对容易解决的,因为它不用关心卖家和买家在哪里,也不需要是关心产品在什么时候出售。虽然在搭乘共享公司Uber和Lyft中,地域和时间都是需要考虑的因素,但是这两家公司仅仅通过法令来确定价格,在定价方面并没有用户选项,也不需要考虑定价的透明性。

在Airbnb上,我们面临着一个异常复杂的问题。我们网站上的数百万房源都是独一无二的,它们有自己的地址、大小和装饰。顾客在接待、饮食或旅游引导方面的要求也不尽相同。一些规律的(如季节性天气变化)和不规律的(如本地的大型活动)因素都会让问题变得更加复杂。

三年前,通过利用房源信息中最重要的一些特征,如房间和床铺的数量、周围的环境、以及某些特殊的设施(如停车位、游泳池等),我们开始构建一个为潜在用户提供价格提示的工具。我们在2013年正式将它推出,它在大多数情况下工作得很好。但它也存在局限性。第一,其定价算法的工作方式是不变的。举个例子,假如我们考虑俄勒冈州波特兰市珍珠区的情况,如果设定河边的房子的价格比远离河边的房子的价格要高,除非我们手动地对这些指标进行变更,否则该算法将永远这样执行。第二,我们的定价工具并不是动态的,并不会根据你预定房间的时间或有多少人在同一时间预定而对价格提示做出调整。

自去年年中以来,我们一直在试图改变这种状况。我们想构建一个工具,其能够通过与用户进行交互而从错误中获得提高。我们也希望使用该工具来调节需求,在必要的时候,可以在房间空余时给出价格下降的提示,或根据需求增加给出价格增长的提示。我们现在已经解决了这些问题,并且在今年6月份的时候用户已经开始使用这一新工具。接下来,我们将告诉你这些工具是如何不断改进的,并且它们现在是如何工作的。我们还会告诉你,为什么我们最新的工具—Aerosolve,除了对租赁的房屋进行定价,最终还可以做的更多。这也是为什么我们将其发布到开源社区的原因。

三个简单的例子

为了得到解决这个问题的思路,我们首先举三种简单的情况。

比如,去年足球世界杯期间你居住在巴西。你的家乡会涌入大量来自于世界各地的游客,聚集在一起享受这个星球上最伟大的足球比赛。如果此时你的房子里正好有空余的房间,你也想满足其他足球爱好者的需求,顺便赚取一些额外的现金,就可以将它们租出去。为了帮助你设置合理的价格,我们的工具需要考虑几个因素。首先,在这个国家,这是一代人才可能经历一次的事情,所以我们在Airbnb上绝对没有历史数据可供参考。其次,所有酒店都被预定一空,供需之间巨大的不平衡此时尤为明显。第三,人们来旅游的时候,他们已经在机票和国际旅行上花了很多钱,因此他们也已经准备为住房花上一笔。因此,除了房间大小、房间数量和位置等因素,这些因素也都应该被考虑进去。

或者,想象你在苏格兰高地继承了一座城堡,为了支付清理护城河、经营酒厂、以及饲养猎鹰的成本,你决定将炮塔改造成一个提供早餐和住宿的旅馆。不同于世界杯的情况,此时你有一些可比较的数据,那就是附近的城堡。一些数据可能跨越了很多年,提供了有关旅行的一些季节性信息。而且你知道,因为该地区还有其他的住宿选择,此时,对于旅游租房的供应和需求相当平衡。然而,这种特殊的城堡在苏格兰是独一无二的,其拥有独特的双护城河。系统应该如何评价这些特有的功能的价值呢?

再看最后一个例子,假设你在巴黎拥有一个典型的两居室公寓。当你决定在8月份休假数周,并向南去往蒙彼利埃,此时想把房子租出去。此时存在很多可比较的房源,所以它是相对容易定价的。但是,当有很多人对你的房子产生兴趣的时候,你决定开始逐步提高价格,以最大限度地赚取更多的现金。但这是一个棘手的问题,如果你定价太高,或预定日期太紧迫,将面临赚不到任何钱的可能,这时该怎么办?或者相反的情况,你一开始设置了较低的价格,虽然在接下来的几个月里就会承担较小的风险,可是却赚了更少的钱。我们应该如何帮助房主获得更好的信息,以避免这种不确定性和遗憾呢?

这些都是我们所面临的各种各样的问题。我们想构建一个易于使用的工具,当用户决定出租自己的房子的时候,为他们提供有用的信息,同时为定价提示给出明确的理由。

工具的整体架构

对于我们的工具,其整体架构出奇简单:当一个新房主开始在我们的网站上添加一个房源的时候,我们的系统提取房源的关键属性,查看在这区域中有相同或相似属性的、且被成功预定的房源,同时考虑到需求要素和季节性特征,提供一个居中的价格提示。

当我们试图将这个问题描述清楚的时候,最棘手的问题出现了,即房源的哪些属性是关键属性。没有两个房源在设计和布局上是相同的,房源也分布在城市的每一个角落,而且很多都不是公寓或别墅,而是城堡和小屋。我们的工具选择了三大类型的数据来设置价格:相似性、新旧程度和位置。

对于相似性数据,一开始查看所有已知的可量化的房源属性,然后看哪些房源与顾客计划支付的价格最接近。之后看房间里可以住多少人,是一个大的集体宿舍还是小的私人房间,以及住房的类型(公寓、城堡、蒙古包等)和评论数量。

这里最令人惊讶的属性也许是评论数量。事实证明,人们愿意为有很多评论的房源进行支付。而针对买什么以及向谁买等问题,亚马逊、eBay和许多网站都靠评论帮助用户进行选择,但评语数量是否会导致价格有很大的区别目前并不清楚。对我们来说,与没有任何评论相比,即使只有一条评论也会导致房源有一个巨大的价格差异。

我们也考虑了新旧程度,因为市场变化频繁,特别是旅游业。最重要的是,旅游是一种季节性很强的活动,所以在进行分析的时候,重要的是基于现在的数据,或者去年这个时候的数据,而上个月的数据可能关联性很小。下图给出了一个例子,说明季节性需求和当地的活动会导致房屋出租价格起伏,在得克萨斯州奥斯汀市,在South
by Southwest(SXSW)和Austin City Limits festivals音乐节期间,房屋出租价格会上涨。

对于像伦敦和巴黎这样高度发达的市场,获得市场数据是很容易的,在我们的网站上有成千上万被预定的房源可供比较。对于新兴市场,我们按照大小、旅游业的发展水平以及在Airbnb上所处的增长阶段,将它们进行分类。这样,我们不仅仅能够将其与所在城市的房源进行比较,而且可以与其他具有相似特征的市场相比较。因此,如果来自于日本的一个房主第一次在Airbnb进行注册,计划出租一套位于京都的公寓,我们不妨查看来自于东京或冈山的房源,如果Airbnb上没有这些城市的数据,我们还可以与来自于阿姆斯特丹的房源进行比较,因为对于Airbnb来说,阿姆斯特丹是一个比较成熟的市场,而且它与京都具有接近的城市规模和旅游业水平。

最后,我们需要考虑位置,对我们来说,这是一个与酒店相当不同的问题。酒店通常成片地分布在几个主要的地点,而我们的房源几乎分布在城市的每一个角落。

在我们的定价算法的早期版本中,算法以房源为中心绘制一个不断扩大的圆圈,考虑在房源位置附件不同半径上与其特征相似的房源。这种方法有的时候工作的很好,但我们最终发现一个重要的缺陷。想象我们在巴黎有一套公寓。如果公寓是位于市中心,那么我们将圆圈不断扩大时,它会迅速开始覆盖塞纳河两侧非常不同的街区。在巴黎,虽然在塞纳河两边的房子都不错,但仅仅相隔百米距离的公寓都会有非常大的价格差异。在其他的一些城市,有时这个问题会显得更加明显。在伦敦,举例来说,仅仅相隔一条泰晤士河,格林尼治地区的价格可以超过伦敦码头附近的两倍。

因此,我们让一个制图员在世界各地主要的一些大城市中为每一个街区绘制边界。这些信息的创建是非常准确的,通过使用相关的地理空间数据,如周围的河流、公路和运输线,我们能够对房源进行准确分类。

现在,这些问题得到了解决。例如,在十月份的第一个周末,如果想在伦敦租住一个二人标间,泰晤士河边上格林尼治地区的价格提示是130美元一晚,而河对岸具有类似条件的房间的价格提示仅仅是60美元一晚。以前的算法让系统为很多新的房源给出一个99美元的价格提示,没有考虑它们的具体特征。虽然这不是长时间发生,也不是在每一个地区都这样,但我们认识到,当这种情况发生的时候,可能会导致人们质疑我们的定价工具是否有效。

动态定价与算法自动学习

随着时间的推进,我们不断改进我们的算法,直到他们能够考虑数千种不同的因素,并在非常精细的水平上理解地理位置。但该工具仍然存在两个不足。其一,它给出的这些价格提示是静态的,事实上,在了解了当地的一些活动和旅游的季节性变化之后,它应该在一年之中不同的季节为相同属性的房源建议不同的价格。但它并没有这样做,然而,航空公司却会当日期临近的时候改变机票价格,订单减少时将价格下调,在市场升温时将价格提高。

另外一个不足是,工具本身是静态的。事实上,当工具能够挖掘到前所未有的历史数据的时候,它的价格提示有所改善,但算法本身并没有变得更好。

去年夏天,我们开始了一个项目,以解决这两个问题。在动态定价方面,我们的目标是为每个房主,针对他们的房子计划出租的日期,每天给出一个新的定价提示。动态定价其实并不新鲜。航空公司开始动态调整机票价格已经几十年了,而且常常是实时的,以试图确保最大的满座率,以及每个座位卖出最高的价格。酒店业也是这样,随着连锁的规模变得越来越大,酒店的业务数据量不断增长,酒店营销也被搬到网上,使得连锁每天可以多次变动价格。

因此,我们需要对动态定价进行投资,一旦我们有好几年的历史数据,我们就可以挖掘它们,尽管这需要大量的计算资源,但对我们来说具有非常大的意义。

让算法自身不断改进要更加困难,尤其是因为我们希望系统给出的价格提示具有高的可解释性。在某些情况下,我们希望算法能够有自己“思维过程”,能够从数据中学习而获得提高。机器学习系统通常具有一定的规模和复杂度,常常以一种神秘的方式工作。例如,谷歌大脑学习了在网络视频中找出猫脸的能力,通过一个多层模型对数据进行分类,然后得出一个视频是否包含猫脸的结果,而这个工作对于人类来说几乎是不可能复制的。

我们选择了一个分类机器学习模型。它使用房源的所有属性以及当前市场的需求,然后预测其是否将被预定。系统计算价格提示是基于数百个属性,如是否包含早餐、房间是否有一个私人浴室等。我们通过将价格提示与结果进行比较,对系统进行训练。考虑房源是否以一个特定的价格被预订,将帮助系统调整其价格提示以及评估一个价格被接受的概率。当然,房主可以选择比价格提示更高或者更低的价格,然后我们的系统也会对估计概率做相应地调整。系统之后会检查房源在市场上命运,并使用这些信息来调整未来的提示。

下面就是机器学习发挥作用的时候了。通过分析哪些价格提示获得了成功,我们的系统开始调整不同房源属性的权重。我们一开始也会做一些假设,例如地理位置非常重要,而是否有热水浴缸没有那么重要。我们保留了以前的定价系统中所考虑的某些房源属性,同时又添加了一些新的属性,如“预定日期之前的剩余天数”,这些信息对我们的动态定价产生影响。所有新的信息被考虑到模型中,都是通过我们对历史数据的分析,表明它们与我们的动态定价能力是相关的。

例如,某些照片更可能吸引预订。总的趋势可能会让你大吃一惊,时尚、明亮的客厅的照片,虽然易于得到专业摄影师的偏爱,但相比于用暖色调装饰的、舒适的卧室的照片,它们并没能吸引更多的潜在客人。

随着时间的推移,我们期待各种信息的权重能不断自动改进,以提高我们的价格提示。如果我们相信我们所了解到的一些东西,模型并没有刻画清楚,我们也可以通过其他方式参与和影响权重的设置。我们的系统能够为每个定价提示产生一个各种因素及相应权重的列表,提高工具的可解释性,这也是大家所希望看到的。如果我们觉得有些信息在模型中没有被很好地描述,我们会手动地将它们添加到模型中。

我们的系统也在不断地调整我们的地图以反映街区边界的变化。因此,系统并不是依赖于当地的地图,比方说,一个当地的地图可能告诉我们波特兰开拓者队的恩光街区在哪个地方结束,里士满街区从哪个地方开始,但这并不是我们所关心的,我们依靠一个城市中房源的预订和价格的分布数据来描绘各种曲线。这种做法也让我们发现了我们以前所没有意识到“微街区”。这些地区可能有大量的流行的房源,但它们并不一定与标准的街区边界相匹配,或者可能存在一些局部特征,依据它们将一个较大的传统街区分为一个个小的部分可能更加理想。下图给出的例子,是我们的工具所划分的伦敦的“微街区”分布。

今天,这些工具为来自于全球的Airbnb房源提供价格提示。但是,我们认为这些工具除了帮助潜在的房主为在线出租服务更好地设置合理的价格之外,事实上它还可以做得更多。这就是为什么我们将这些工具所基于的机器学习平台(Aerosolve)作为一个开源工具发布的原因。它将给那些还没有接触过机器学习的从业人员一个简单的切入点。通过弄清楚系统的功能,它会让更多人使用这些工具,这也是作者写作本文的目的。到目前为止,我们已经用它来构建了一个系统,能够以一种点彩画的风格进行绘画。我们渴望看到我们行业以外的有创造性的工程师开始使用这些工具,并期待他们最终的成果。

原文发布时间为:2015-10-20

时间: 2024-11-05 12:32:29

解密Airbnb的定价算法的相关文章

加解密与编解码算法

A).  Base64 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到2个0字节.并在最后编码完成后在结尾添加1到2个"=".例:将对ABC进行BASE

解密 Airbnb 的数据科学部门如何构建知识仓库

Airbnb的数据团队很重要的一个职责就是传播基于数据的决策方法.我们将数据的获取民主化,使得每一个Airbnb的成员都可以量化他们基于数据的决策影响力并且借此洞察用户偏好,提升数据产品的用户体验.最近,我们开始解决一个令人头疼的问题.随着组织的扩大,如何确保我们如何确保一个洞见有效地通过社交网络,这在我们内部称之为知识扩张. 当我们团队仅由几个乐于分享和发现研究技巧的人组成这不是什么难题.但是当我们团队开始快速扩张时,这个问题一下就被放大了.Jennifer是一位新来的数据科学家,她正在研究如

大数据入侵隐私:被卖还不算,钱袋也被掏空了

隐私,现代社会的一项基本价值,正在迅速退出大数据时代人们的生活. 没了隐私,如何生活?然而,日复一日,我们被告知:放弃一点隐私,完全值得.因为,换来的是领先国际的科学管理和高技术创新,一种市场空前繁荣.办事越来越方便的新生活!更何况,人不干坏事心不惊,干嘛害怕与大数据为伴? 如此看来,倒是那些执着于隐私意识的人心虚,不愿做贡献了.道理竟可以这样讲,人的尊严与自由得让位于所谓科学管理.创新和市场,这里面,一定有什么难言的隐情吧. 原来,新兴的电商资本有一种贪欲:依靠实时实地收集用户的隐私信息,由此

你的隐私被大数据掏走了多少?

我们都被"瞄准式广告"跟踪追逐过 新兴的电商资本有一种贪欲:依靠实时实地收集用户的隐私信息,由此全面掌握并准确预测消费者的行为,用于营销.开发各种产品.只不过,未经许可攫取用户的隐私,至少依照现行的法律是违法的.所以就需要一套冠冕堂皇的说辞,借用一些时髦的话语,然后才能否定,并最终让人们忘却隐私信息的初始产权;才能拿"洗过"的跟没"洗过"的数据,在交易所公开合法地买卖.今天,手机和电脑用户,谁没有被"瞄准式广告"(target

详解.NET下的加密解密算法(1) 哈希加密

.NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家 有所帮助. MD5 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace EncryptAndDecrypt { public class MD5 { public byte[] Hash(byte[]

JAVA加密解密之PBE算法

PBE(Password Based Encryption,基于口令加密)是一种基于口令的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数杂凑多重加密等方法保证数据的安全性.PBE算法在加密过程中并不是直接使用口令来加密,而是加密的密钥由口令生成,这个功能由PBE算法中的KDF函数完成.KDF函数的实现过程为:将用户输入的口令首先通过"盐"(salt)的扰乱产生准密钥,再将准密钥经过散列函数多次迭代后生成最终加密密钥,密钥生成后,PBE算法再选用对称加密算法对数据

Swift 使用RSA算法进行数据加密,解密以及数字签名

RSA算法是一种非对称加密算法,要了解RSA算法,首先要知道什么是对称加密算法,什么是非对称加密算法. 1,对称加密算法 密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密. 特点:算法公开.计算量小.加密速度快.加密效率高特点.但交易双方都使用同样钥匙,安全性得不到保证. 具体算法有:DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法. 2,非对称加密算法 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).

RSA加密解密及RSA签名和验证

加密|解密 此Demo包含两个文件,建立一个解决方案,然后建立两个文件,一个为Form,一个为Class,把代码分别复制进去即可 RSA正确的执行过程:加密解密:1.获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥2.加密3.解密签名和验证:签名:1.获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥2.获取待签名的Hash码3.签名其中,1和2的步骤无所谓,在本例中,我们将对txtSource里的内容进行签名,也可以对文件进行签名验证签名:1.获取密钥,这里是产生

spring、spring-boot配置文件属性内容加解密

实际项目开发过程中,我们的应用程序都有很多的配置文件(例如properties或者yml文件等),我们时常会遇到需要对配置文件敏感字段的参数内容进行加密处理(比如数据库连接密码.与第三方的通信密钥等). 如果采用一定采用传统的springMVC做系统集成,我们可以继承PropertyPlaceholderConfigurer类并复写其converProperty方法,在该方法内一般需要做两步处理: 1.根据参数名propertyName或者根据参数值propertyValue判断当前是否需要进行