背景

近年来随着国内二手车市场交易量逐年攀升,线上交易越来越受到二手车商与个人的关注,随着58二手车帖子量跨越式增长,更需要严格的线上发帖审核机制来防止低价帖吸引正常用户的流量,那么一车一况的精准估价成为重要问题。58估车价是58集团二手车技术部自主研发车型价格预测系统。可用于信息审核、提供用户更透明的价格区间、车型保值率排行等多种业务场景,并提供58估车价APP方便用户扫车、识车、估价、撮合成交。估价系统的核心是提取车辆信息组合特征,输出该车对应的保值率(取值范围0到1)。

估价系统总体架构

整个估价系统结构分为四个部分:

a)数据来源于58自有数据金融成交数据,人工审核数据等,另外增补很多第三方合作平台数据,丰富不同场景的交易价格数据,通过自有的车型匹配系统映射到58车型库,定期同步到HDFS中。

b)利用spark进行车型数据补全及业务去噪,生成待训练的标准格式数据。

c)使用标准数据进行算法去噪及特征处理,进行反复的模型训练,此处需要反复验证特征、超参、模型的合理性及准确性。最终生成模型,对模型进行线上数据评估。

d)将模型部署到58自研的RPC服务框架,组合业务规则,提供稳定估价服务。

估价系统架构图

数据处理

**•** 获取样本

进行模型训练,首先大量准确的样本是必不可少的,我们与其他平台合作,手中掌握市场上大量的成交数据与市面上大部分平台的展示数据。针对这些数据我们会进行的初步去噪并匹配车型库数据丰富特征。最后进行业务去噪处理,例如将一些雷同或均值类似的帖子进行去重,过滤一些价格里程上牌时间明显不合理的样本。

•去噪、预处理

在样本处理的过程中比较头痛的就是样本本身的准确性与波动性,原始样本整体平滑度较差,需要对其进行多步去噪以及预处理。

a)规则去噪:主要是针对上牌时间与车型上市时间和下市时间的过滤规则

b)统计去噪:这里采用箱线图去噪,估值这个场景的目标就是找到最常规的保值率,偏离整体的样本越少越对能提升模型的准确率,忽视异常值会严重影响模型效果。如下图五条线从上至下依次为上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,上边缘与下边缘分别定义为Q3与Q1在Q3-Q1的基础上增加与减少的上限与下限,在外线以外的极端值视为异常值处理。

箱线图去噪

c)规则去重:在对样本统计分析,根据其特点制定的规则,例如对相同车型、里程、价格的,取上牌时间更早的样本等。

d)重置成本排序:根据重置成本法得到估价,按照这个估价对每个车型排序。

e)滤波:对排好序的每个车型,将原始的rate做滤波,假设原始的rate顺序应该与排好序的一致,滤波的大小为s,那么以当前点为中心的s个点区域内,如果当前点不是极值就跳过,是极值就取平均值。滤波大小和次数可以调。

f)调整顺序序:根据重置成本法得到估价,按照该估价对每个车型排序。

利用滤波函数平滑样本

**•** 获取样本特征处理

二手车最明显的特点是一车一况,不同工况、不同地区、不同的使用环境、经营性质甚至颜色都会影响一辆车的价格。在确定了目标之后,我们需要确定使用哪些数据来达到目标。需要先梳理哪些特征数据可能影响二手车的保值率。我们可以借鉴一些业务经验,另外可以采用一些特征选择、特征分析等方法来辅助挑选。

首先基于业务逻辑可以选取车型相关配置参数、里程、车龄、上市时间这些明显数据特征,再结合车型库基础信息(例如车型类别、国别、动力形式、变速箱、座椅数、厢数等)可以组合出几十个特征的样本数据。

这里首先可以观察到,车型这个维度对结果应该明显车型之间差异巨大,但车型根据现有车型库会有40000多个种类,所以我们将车型映射到了国别、价格、类别、动力方式等几个维度较低的属性上。再之后将各车型的上市时间年龄通过离散化映射到5个区间;对有无对应配置的属性进行二值化等。

之后可以尝试用一批样本测试信息增益率,其它维度还可以考虑如过滤覆盖率低的特征、利用单个特征训练模型得到AUC值作比较等方法进行特征选择。

这里要说一下为什么不保留所有特征或者组合的高维特征:1.特征维度越高越容易产生过拟合;2.随着特征或维度越来越多,可能会降低性能和精度,达到相同效果可能越需要更多的训练样本;3.样本如果越多也会造成更大的训练时间与人力,并且特征不容易分析,需要权衡成本;

但是特征工程不是到此为止的,根据统计分析与业务规则,往往能得出一些在定量样本下模型无法学习到的特性。举个例子,车龄理论上讲是上牌时间到现在的时间,但在实际市场交易中上市时间与实际上牌时间可能会差距比较大,有延后上牌的情况,但交易中该车的出厂时间被定在买卖双方的潜意识里面,例如一辆2014年上市,2016年上牌的奔驰C级,按交易时间2019年算车龄为3年,但实际上双方认为它的车龄应该在4-5年来评估最终的价格,所以我们将车龄与上市时间进行换算,如上例将车龄定义为x=上牌车龄+(上牌时间-上市时间)*i,i为调整延迟上牌系数,得出一个新的关于车龄的参数x来代替原本的车龄,这样产生的新模型可以明显改善这种case的预测准确性。

再例如二手车在其他条件相同的情况下,总里程数对保值率的影响不是线性增长的,新车影响比较大,但随着里程数越来越高,对最终的价格影响越来越小,而且会发现,车龄越高的车影响会更小,但这样的样本其实市场上并不多,模型也很难学到,所以我们需要对特征进行处理,我们对里程进行取对数,利用斜率随x增大而减小的特性进行系数λ调整,得到一个效果更好的新特征。

mile_future = ln ( λ / use_year * mile_per_year + 1)

利用对数函数导数特性

模型训练

**•** 算法选择

估价问题是一个回归问题,从最初的折算建模到现在的机器学习模型,我们的目标都是不断的提升输出结果的准确率,直观的评估标准是与测试集相比的偏差率=(实际值-理论值)/理论值x100%,以及方差。

在多种回归算法中,例如LR,随机森林,GBDT,xgboost等,经过理论筛选与实际训练评测结果中我们选取了基于决策树的xgboost与lightGBM作为模型进行尝试。xgboost所用的算法就是gradient boosting decision tree既可以用于分类也可以用于回归。其优点有很多,例如:xgboost对代价函数进行了二阶泰勒展开,同时用到一阶和二阶导数;xgboost在代价函数里加入了正则项,控制模型复杂度;对于特征的值有缺失的样本,可以自动学习出它的分裂方向,方便对样本进行特征处理;并且xgboost由于对数据进行预排序,支持在节点分裂计算特征信息增益时使�