机器学习在58二手车估价系统实践
近年来随着国内二手车市场交易量逐年攀升,线上交易越来越受到二手车商与个人的关注,随着58二手车帖子量跨越式增长,更需要严格的线上发帖审核机制来防止低价帖吸引正常用户的流量,那么一车一况的精准估价成为重要问题。58估车价是58集团二手车技术部自主研发车型价格预测系统。可用于信息审核、提供用户更透明的价格区间、车型保值率排行等多种业务场景,并提供58估车价APP方便用户扫车、识车、估价、撮合成交。估价系统的核心是提取车辆信息组合特征,输出该车对应的保值率(取值范围0到1)。
整个估价系统结构分为四个部分:
估价系统架构图
箱线图去噪
c)规则去重:在对样本统计分析,根据其特点制定的规则,例如对相同车型、里程、价格的,取上牌时间更早的样本等。
d)重置成本排序:根据重置成本法得到估价,按照这个估价对每个车型排序。
e)滤波:对排好序的每个车型,将原始的rate做滤波,假设原始的rate顺序应该与排好序的一致,滤波的大小为s,那么以当前点为中心的s个点区域内,如果当前点不是极值就跳过,是极值就取平均值。滤波大小和次数可以调。
f)调整顺序序:根据重置成本法得到估价,按照该估价对每个车型排序。
利用滤波函数平滑样本
二手车最明显的特点是一车一况,不同工况、不同地区、不同的使用环境、经营性质甚至颜色都会影响一辆车的价格。在确定了目标之后,我们需要确定使用哪些数据来达到目标。需要先梳理哪些特征数据可能影响二手车的保值率。我们可以借鉴一些业务经验,另外可以采用一些特征选择、特征分析等方法来辅助挑选。
但是特征工程不是到此为止的,根据统计分析与业务规则,往往能得出一些在定量样本下模型无法学习到的特性。举个例子,车龄理论上讲是上牌时间到现在的时间,但在实际市场交易中上市时间与实际上牌时间可能会差距比较大,有延后上牌的情况,但交易中该车的出厂时间被定在买卖双方的潜意识里面,例如一辆2014年上市,2016年上牌的奔驰C级,按交易时间2019年算车龄为3年,但实际上双方认为它的车龄应该在4-5年来评估最终的价格,所以我们将车龄与上市时间进行换算,如上例将车龄定义为x=上牌车龄+(上牌时间-上市时间)*i,i为调整延迟上牌系数,得出一个新的关于车龄的参数x来代替原本的车龄,这样产生的新模型可以明显改善这种case的预测准确性。
再例如二手车在其他条件相同的情况下,总里程数对保值率的影响不是线性增长的,新车影响比较大,但随着里程数越来越高,对最终的价格影响越来越小,而且会发现,车龄越高的车影响会更小,但这样的样本其实市场上并不多,模型也很难学到,所以我们需要对特征进行处理,我们对里程进行取对数,利用斜率随x增大而减小的特性进行系数λ调整,得到一个效果更好的新特征。
mile_future = ln ( λ / use_year * mile_per_year + 1)
•算法选择
lightGBM在效率上有优势
•模型调参
最后是进行训练调参,基于决策树模型参数调整一般需要如下步骤:
a)首先选择较高的学习率learning_rate,加快收敛的速度;
b)对决策树基本参数调参,这里比较重要的是max_depth :设置树深度,深度越大可能过拟合;num_leaves:因为leaf-wise 的算法,因此在调节树的复杂程度时,使用的是 num_leaves 而不是 max_depth。换算关系一般为num_leaves = 2^(max_depth),但是它的值的设置应该小于 2^(max_depth),否则可能会导致过拟合。
c)正则化参数调参,reg_alpha与reg_lambda,降低过拟合的,两者分别对应l1正则化和l2正则化。最简单的方式可以通过sklearn里的GridSearchCV()函数进行搜索穷举,找到合适的组合;
d)最后降低学习率,提高准确率。这里还尝试了对n_estimators参数进行调整,
一般来说n_estimators太小容易欠拟合,n_estimators太大又容易过拟合,增加n_estimators可以降低mae,但是预测时间也会成倍增加,权衡mae的减少程度和预测时间的增加程度可知,单独增加n_estimators不再是一个有效的迭代方式。
lgb_big_params = {}
lgb_big_params['learning_rate'] = 0.3
lgb_big_params['max_depth'] = 11
lgb_big_params['n_estimators'] = 300
lgb_big_params['boosting_type'] = 'gbdt'
lgb_big_params['reg_lambda'] = 10.
lgb_big_params['reg_alpha'] = 1.
lgb_big_params['colsample_bytree'] = 0.8
lgb_big_params['num_leaves'] = 255
lgb_big_params['max_bin'] = 127
lgb_big_params['min_child_samples'] = 20
lgb_model = LGBMRegressor(**lgb_big_params)
调参结果
不同的项目不同样本参数调整都有可能不同,需要多加尝试权衡找到最适合的参数值。
58估价总体效果最佳
我们将继续丰富样本量与特征维度,并深入挖掘各种模型的潜力以及样本特征间的关系,持续提升效果精准估算B2C、C2B等交易环节中涉及到的多种价格,将58估车价打造成为二手车行业内准确度的标杆,同时在语义和图像等深度学习方面发力,用技术持续为业务赋能。
关鹏 58同城ABG资深研发工程师,负责58估车价项目及深度学习相关项目在二手车业务中的实践与应用。
赏宇 58同城ABG 高级开发工程师,负责估车价项目及深度学习项目的开发和工程化等工作。