Fork me on GitHub

58 同城 | 周彤:房价预估,房产价格体系中的算法实践

图片

分享嘉宾:周彤 58同城 资深算法工程师
编辑整理:王华村 SMG
出品平台:DataFunTalk

导读: 本次分享中来自58同城的算法工程师周彤,主要介绍如何利用58平台已有的房源价格等特征信息,完成估价等环节。主要包括以下几方面:

  • 房产价格体系
  • 均价计算
  • 房源估价

01 房产价格体系

1. 平台介绍

58同城和安居客是国内第一大房产信息平台,信息涉及到新房、二手房、租房、商业地产等业务,通过这些信息帮助找房客户挑选的合适的房源。

我们的信息来源主要包括:

  • 运营团队:负责各种房产信息的维护;
  • 经纪人:负责房源信息的发布,小区点评,用户问题回答等;
  • 新房置业顾问:发布新房认筹、开盘等信息;
  • KOL:发布房产相关资讯、文章;
  • 数据计算:在现有数据基础上,通过模型的汇总计算出一些加工后的数据。

2. 房价相关业务

在房产交易中有一句名言:没有卖不出去的房子,只有卖不出去的价格。可见房价信息处于一个非常重要的地位。我们的房价相关服务包括:查房价、房价报告、房价地图、查成交、估价等等。

图片

3. 房价体系

在业务层面上房价体系各个部分的组成汇总如下图所示,主要包括五大部分:均价计算,成交信息,房源估价,经纪人估价和磐石价格。

图片

在技术层面上房价体系的框架如下:

图片

02 均价计算

58同城的价格体系中各种粒度的均价计算都是一个核心问题。在本部分我们会介绍均价的计算过程。

1. 均价计算方式

小区均价的计算方式有以下四种,简单比较如下:

图片

  • 商品房均价,真实性最高,但是销售价格在政府核验后就是一个定值,因此时效性最差,整体可用性比较低;
  • 成交均价,顾名思义是拿近期成交的数据取平均值或中位数,时效性比商品房均价稍好,但也有一定的滞后性;
  • 挂牌均价,逼近当前真实价格,时效性较好,但是挂牌价中也包含一定的非理性因素,所以真实性相比前两种有所降低,但可以在后期通过异常值检测等数据处理手段解决;
  • 政府挂牌均价,虽然在各个维度都有不错的表现,但目前只在深圳有挂牌均价,其他地区没有。

综合起来采用挂牌均价更能反应当前的市场行情。

2. 挂牌价格问题

但挂牌价格存在下面两个问题:

  • 首先,经纪人为了吸引顾客常常使得挂牌价偏低,为此,在实际处理中我们一般不直接使用中位数作为挂牌均价,而是选择高于50的分位作为挂牌均价。
  • 同时,由于房源差异,同一小区可能出现价格偏离较大的情况,在计算均值时需要剔除。

图片

3. 异常值检查方法

由于小区内的异常价格不能代表小区房价,所以在计算均价时首先要进行异常值检测,通常有以下三种方法。

(1) Z-Score

可以理解样本与均值偏离了几个标准差,以下图中的红色样本为例,其偏离均值超过了2个标准差,那么它是异常值的概率就比较大。

图片

(2) DBSCAN密度聚类算法

该算法要求输入距离半径e,以及半径内样本点的最少数目MinPts。核心思想就是对任意样本点进行计算,当它附近的其它样本点数达到一个阈值要求时,就代表这个样本点有足够多的投票证明它是一个正常样本。以下图为例,红色的点附件更为稀疏,因此异常值的概率比较大。

图片

(3) 孤立森林(Isolation Forest)

是一种高效的异常检测算法,和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择。在建树过程中,能很快达到叶子节点的样本就很有可能是异常点。仍然以下图为例,如果红点被孤立出来,只需要划分点位于红点和橙点之间的任何一个值即可,但相比之下要把蓝色点中的某个孤立出来,可能就需要多次划分。因此红点到根节点的距离就比较短。

图片

4. 模型效果评估

为了比较各种异常值检测方法的效果,在均价计算的特殊场景下,我们引入“稳”(短期房价的离散程度)指标衡量模型效果。下图可以看出,在我们进行了异常值处理之后,均价会变得比较平稳。

图片

该指标的计算方法是用变异系数衡量小区均价的离散程度 ,各种方法的对比如下:

图片

横轴为根据挂牌量进行的分组,纵轴即为评价指标。可以看到在500组以下iForest的表现更为稳定,而大于500组我们就选用了效果类似同时更为简单的ZScore。

03 房源估价

1. 市场比较法

传统的房源估价一般是使用市场比较法。

图片

首先选取待估价房源的相似成交房源,然后进行实例修正,包括交易状况、交易日期、区域、剩余使用年限等,修正后得到参考实例,再取其算数平均值,作为评估价格。这种方法只适用于热门的房源市场及主力户型,需要有足够多的相似实例才能够得到一个比较准确的价格评估,并且需要大量的人工修正,因此我们这里引入了机器学习的方法。

2. 机器学习模型

使用线上实时挂牌房源的数据,拟合成交价格,以达到自动批量估算房源价格的目的。

图片

我们根据挂牌价格和磐石价格计算出某小区的房型均价。房源基本特征的不同,决定了价格的差异。所以模型的输入就是房源的基本特征。拟合的目标就是成交价格和户型均价的比值。为了模型拟合,我们对成交价格和户型均价进行了log处理,预测logError。这样更能体现数值波动的相对比例,捕捉更小范围的误差,同时可以将初始偏差在一定范围内转换成标准正态分布。

值得注意的是很多房源特征都是类别型的,比如房源所在城市、区域,楼层,户型几室几厅等等。这就需要模型对类别特征有比较好的处理能力,为此我们选用了CatBoost进行模型训练。CatBoost是由Yandex的研究人员和工程师开发的基于梯度提升决策树的机器学习方法,现已开源。CatBoost在Yandex公司内广泛使用,用于排列任务、预测和提出建议。CatBoost有以下优点:

  • 可以处理类别型、数值型特征,支持特征自动组合;
  • 支持自定义损失函数;
  • 减少了对大量超参数调优的需求,并降低了过拟合的可能性,模型更加具有通用性;
  • 支持多GPU,加快了模型训练的速度。

图片

对于类别型特征如果使用one-hot编码进行处理一般都会产生维度灾难。树模型(比如LightGBM)会根据梯度统计(GS)的方式处理类别特征:对类别型特征会按照类别频率划分直方图,然后按每个类别的均值进行排序,按照均值的结果依次枚举最优分割点。

这种处理的缺点是:

  • 在迭代的每一步,都需要对GS进行计算,增加计算时间
  • 需要存储每一次分离每个节点的类别,增加存储需求
  • 长尾类别被归为一类,部分信息损失。

与GS相对的是目标变量统计法(TS):用训练样本当中相同类别的平均值拟合目标变量,其公式表示如下:

image.png

其中分母为该类别的数量,而分子为该类别的样本中正样本的数量,二者的比值就是该训练集中该类别中正样本的占比。这种方式容易产生过拟合,因为训练集与测试集的样本分布往往不完全一致。为此引入一个先验概率p,以此减小过拟合,具体公式如下:
image.png

在CatBoost中除了使用TS之外,每次迭代都进行多次随机排列,即Ordered TS:随机选取一组排列进行变量统计。这样能够使用所有的训练样本,进一步减小目标值与真值的方差。

下面两个表就展示了将朝向这一类别特征进行编码的过程:

  • 由于原来的预测目标是连续值,这里根据每一个样本的logerror是否大于均值生成新的一列label(取值0/1);
  • 对第一个样本其朝向为南,那么遇到该样本前,totalCount=0,南在label=1下也出现了0次,带入公式得到其编码为:

image.png

对于第5个样本,totalCount=1,南在label=1下也出现了1次,带入公式得到其编码为:
image.png

对于第7个样本其朝向为南北,那么遇到该样本前,totalCount=2,南北在label=0下出现了1次,带入公式得到其编码为:

image.png

  • 其他样本可依此类推。

图片

通过上面过程可以发现,该编码是有顺序的,这也是CatBoost排序思想的体现。

同其他树模型一样,CatBoost同样可以在特征分裂及树的构建过程中实现特征的自动组合,这里不再赘述。

图片

值得一提的是,不同于其他Boost算法(相当于下图的左边),CatBoost在特征分裂时使用了对称树(下图右边):第二层中由于>90m2,相对于汤臣一品有更高的分裂收益,所以对称树选择在第二层全部使用>90m2这一分裂策略,可以理解为一种“赢者通吃”。可以在一定程度上防止过拟合。

图片

上图是对称树的工作原理,首先根据信息增益,计算出是否3室作为根节点,第二层分别计算对应的信息增益,选择信息增益最大的条件作为分裂点。这种拟合方式相对简单,每一层都是一个判断条件,能够有较高的预测速度。另外,由于结构比普通决策树自由度小,可以看作是加入了正则项,提高了模型的泛化能力。

对称树降低模型的复杂度,可以防止过拟合。

对于树算法,尤其是GBDT这种集成学习中的树算法,使用上一轮的树计算得到的负梯度作为标签继续训练下一轮的树;如果上一轮的树计算产生了偏差,这个偏差会继续在下一轮累计;如果训练集和测试集的分布差异较大,则偏差会一直累计,从而使得整个模型过度拟合训练集。为此XGboost提出的解决方案是:引入行列采样;引入树的正则化等策略。CatBoost则主要通过类似于在线学习的Ordered Boosting方法来提高模型的泛化能力。

图片

该策略生成训练数据集的s个随机排列;并针对当前样本Xi,利用之前样本训练一棵树;用这棵树预测出的预测值,和真实值之间的损失算出负梯度,作为下一轮的标签。该过程可以用下图来表示:

图片

但上面这个过程存在一个问题:对于n个样本,需要建立n棵树,或训练n个模型。为避免计算量过大,CatBoost做了如下改进:保持预测集和训练集数量一致,同时每次都将上一棵树的训练集和预测集都作为下一棵树训练的数据集,对比该过程如下:

图片

这样训练的模型就从n个降低到log n个。

04 总结

我们对XGBoost与CatBoost两者的结果做了如下对比:

图片

图片

在均价计算中,我们从业务角度出发,使用变异系数来衡量异常值检测模型的效果,不仅减少了人工打标的时间成本,而且结果更加适合房价业务场景。

房源估价是一个复杂的问题,首先房源特征与成交价之间并不是近似的线性关系,其次需要丰富的特征组合来衡量房价差异,最后估价中的可解释性也是要考虑的问题。基于这些原因,我们选择树模型来做估价。在业务中,选取合适的模型,可以起到事半功倍的效果。

CatBoost算法能够对大量类别型特征进行编码和组合,训练时参考了在线学习的方式,进一步降低过拟合的同时提高了算法的准确度,有非常高的工程应用价值。

05 精彩问答

Q:房产价格受政府调控的影响很大,怎样将政府政策的因素作为特征加入模型预测?

A:58暂时还没将政策因素加入到模型中,主要还是作为专家逻辑,进行人工干预。

Q:特征组合考虑过FM模型吗?

A:我们之前用过FM模型,但是最终的效果没有CatBoost好。

Q:请问区域特征如何量化,比如一线二线城市,以及同一城市的不同商圈。

A:这些区域都作为一个ID传入模型,只要有成交就可以量化该ID。

Q:请问有与商业、物业有关的模型吗?

A:暂时没有,目前主要用于二手房领域。

Q:特征提取以人工为主吗?

A:我们有一个特征池,模型会从特征池中提取一个最优的组合。

Q:请问特征选择是怎么做的?

A:我们这边是把可能影响到房价的一些因素都纳入进来,然后让模型自动组合、自动选取。

Q:房价模型会考虑小区物业服务特征吗?

A:这个特征是没有的,但是物业这个信息在户型均价上已经体现出来了,比如物业比较好的话它的挂牌价格就会比较高。

Q:请问冷启动问题是怎么解决的?

A:这些没有成交的小区会统一被归入无成交小区,虽然这些小区的ID不能提供过多的信息,但是这个小区的房源的户型、楼层会提供一些信息,来大致判断该小区的房价。

Q:最后选用了多少特征呢?

A:大概20个左右。

Q:房价模型对模型的更新频率有要求吗?1天或者1周不更新准确率会下降的大吗?

A:对模型更新频次要求并不会太高,一般每周更新一次。

Q:请问在预测房价时什么特征的重要性最高,您如何解释这种重要性?

A:城市ID的影响比较大,这个也容易理解,一线城市的房价与二线的差别确实很大。另外在一线城市面积比较小的房子可能比较受欢迎。而在三四线城市那种大户型更受欢迎。

Q:如何做数据处理,比如如何处理缺失值?

A:一般来说我们就是用众数或者平均数来补充的。

Q:为何选择对数误差进行预测?

A:这个上面已经讲了,这样做可以更好地体现预测结果与真实值之间的差异,比如二者的比值为0.1,做完log变换之后变得更大,模型会更好地拟合这个误差。

Q:请问如何筛选掉不必要的特征?

A:这个我们没有刻意去处理,我们只是把特征都放进去,让特征自动组合。如果去做的话可以把不重要的模型去掉,看看预测的效果。

Q:房价中学区很重要,这个也作为一个特征吗?

A:没有单独的这个特征,其主要反映在小区、均价这些特征上面。

Q:样本的数量级大概有多少?

A:我们这边是百万级的。

Q:户型的标准化有提前处理吗?

A:没有处理,用的就是3室、2室,几厅这样的。

Q:最后衡量异常值的方法是用变异系数,而不是用Z-score、DBSCAN、孤立森林这三种方法吗?

A:Z-score、DBSCAN、孤立森林是三种检测异常值的方法,而变异系数是评估上面三种方法对异常值的检测效果的,前后两者不冲突。

Q:是一个城市建一个模型吗?

A:不是分城市建模型,而是把城市ID当成一个参数。

分享嘉宾:

图片


本文地址:https://www.6aiq.com/article/1648080896778
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出