二手车价格预测

1.1 问题阐述

二手车的剩余价值是二手车交易流通中的一个重要环节,传统的剩余价值评估方法主要依靠二手车评估人员的经验判断,评估过程主观人为因素多,没有根据客观影响因素来综合全面评估二手车的剩余价值。本次研究针对二手车的交易价格,通过影响二手车评估价格的客观因素为基础,建立客观评估二手车价格的预测模型。

1.2 前沿进展

二手车的价格会受到车辆使用强度、养护情况、使用区域、品牌溢价、消费心理等多方面的影响,交易价格也会有很大的波动。在实际操作中,常采用资产评估的方法来进行二手车价格评估的研究,主要是重置成本法、现行市价法和收益现值法。然而这些方法受主观因素的影响较深,也不够精确,更多的依赖经验判断,使得定价的主动权较高的掌握在二手车贩子的手里,消费者更处于信息不对称的被动地位。

国外学者尝试采用多元线性回归、SVM、时间序列等传统统计分析方法进行二手车价格预测模型的构建。Richardson,et al利用多元回归分析方法,从车龄、行驶里程、品牌和油耗等方面评估二手车价格,证明了混合动力汽车比传统燃油汽车具有更好的保值率。Listiani,et al通过建立支持向量机(SVM)模型估算二手车价格,精度高于多元回归分析建立的模型。SVM模型能够较好的处理高维数据,避免过度拟合。值得一提的是,Listiani,et al使用了遗传算法来优化SVM的参数,使SVM模型可以更快收敛。通用汽车对其保值租购(Leasing)业务进行长期分析之后,运用系统动力学(System Dynamics)建立了一套名为Dialogue Decision Pro-cess的系统。在考虑了行驶里程、车龄、车型等因素的基础上,利用了系统动力学原理去模拟了二手车价格形成的过程。

国内的二手车行业仍处于起步阶段,各方面的研究工作均不完善,有较为明显的碎片化特点。李爽楠使用Bootstrap方法建立了二手车价格回归模型,但其样本比较少,又只选取了一种品牌的数据,具有较大局限性。贺焕利等借助Labview虚拟仪器平台基于重置成本法开发了商用的二手车鉴定估价平台。林腾飞基于田口函数和层次分析法对二手车进行评估。刘森采用人工神经网络方法建立针对二手车价格的预测模型。

1.3 研究内容

在本次研究中,我们编写的代码主要包括数据预处理、特征工程和模型训练和融合。在数据预处理部分,我们新添加了地区邮编信息所挖掘出来的省市信息作为特征量,对预测值进行对数变换处理,解决其长尾分布的问题,并对所有特征进行了常规的异常值和缺失值的处理。在特征工程部分,我们对连续型特征进行分桶处理,并特征交叉,产生更多有价值的特征,而对于匿名特征,我们采用了加和乘的方式两两组合生产新的特征,并运用sklearn的自动特征选择功能和删除相关度高的特征方式进行最终的特征筛选。在模型训练和融合部分,我们巧妙地联想到了之前学习的论文的相关知识内容,将树模型和神经网络模型融合,在树模型部分导入所有特征工程部分特征,在神经网络模型部分,导入原始特征和刻画的几个明显特征。最终将两个模型的训练结果加权平均,得到我们最终模型预测结果。最终我们的模型的测试集的MAE最优值稳定在400左右,模型预测性能得到了较好的优化。


二、数据处理

2.1 数据格式

本次研究所使用数据来自阿里天池大赛所提供的,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。抽取其中15万条记录作为训练集,5万条记录作为测试集。其数据特征如表2-1所示。

表2-1 数据特征

变量描述

SaleID交易ID,唯一编码

name汽车交易名称

regDate汽车注册日期,例如20160101,2016年01月01日

model车型编码

brand汽车品牌

bodyType车身类型---豪华轿车:0,微型车:1,厢型车:2,大巴车:3,敞篷车:4,双门汽车:5,商务车:6,搅拌车:7

fuelType燃油类型---汽油:0,柴油:1,液化石油气:2,天然气:3,混合动力:4,其他:5,电动:6

gearbox变速箱---手动:0,自动:1

power发动机功率,范围[ 0, 600 ]

kilometer汽车已行驶公里,单位/万km

notRepairedDamage汽车有尚未修复的损坏---是:0,否:1

regionCode地区编码

seller销售方---个体:0,非个体:1

offerType报价类型---提供:0,请求:1

creatDate汽车上线时间,即开始售卖时间

price二手车交易价格

v系列特征匿名特征,包含v0-14在内15个匿名特征

2.2 数据探索性分析(EDA)

EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用,当了解了数据集之后下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系,从而引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠,最终完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结。

2.2.1 数据总览

在开始解决问题时,首先需要对现有的数据进行浏览,了解其数据的构造及类型,从而能更好的对数据进行操作,进行问题的探究。利用head和shape函数观察数据集,数据集显示如图2-1所示。


图2-1 数据集内容

2.2.2 数据统计

在初步了解数据集构造后,需要进一步探究数据集的统计量,以便于后续观察统计量与所需要预测的目标值之间的关系。利用Describe函数统计数据集每列的统计量,个数count、平均值mean、方差std、最小值min、中位数(25%、50%、75%)、以及最大值max;而利用Info函数能够用来了解数据每列的数据类型,从而确定后续针对具体类型的数据进行针对处理。其统计量及类型如图2-2、2-3所示。

图2-2 数据集统计量

图2-3 数据集各特征类型

2.2.3 特殊值观察

通常情况下原始数据集并不是完美的,需要对其特殊值进行观察,主要包括无用值、无变化值、缺失值、异常值、长尾分布等等,针对数据集中存在的特殊值进行观察。在本次研究中主要涉及以下几点。

(1)缺失值统计

观察数据集中的缺失值的分布并对其进行可视化,结果如图2-4所示。

图2-4 缺失值的情况

(2)异常值统计

观察数据集中的异常值的分布并利用代码反馈统计情况,结果如图2-5所示。

图2-5 异常值反馈

(3)预测值分布

对预测值“price”进行观察,发现其服从长尾分布,所以分别利用无界约翰逊分布和对数分布函数拟合输出其分布图,结果表明变换效果服从正态分布,可以进行下一步计算,结果如图2-6、2-7所示。

图2-6 无界约翰逊分布预测值分布图


图2-7 对数分布预测值分布图

2.2.4 特征分析

在本次研究中的特征分析时,主要探究了各数字特征与“price”的相关性,其相关性可视化如图2-8所示。通过观察可以看到,匿名特征v_0,v_3,v_8,v_12与“price”的相关性很高。

图2-8相关性分析图


三、特征工程

特征工程是机器学习,甚至是深度学习中最为重要的一部分,其目的是最大限度地从原始数据中提取特征以供算法和模型使用,简而言之,特征工程就是通过已有的特征,创造新的特征。基本的操作包括,衍生(升维),筛选(降维)。实际中,衍生和筛选并不简单,甚至需要非常专业的专家知识。

3.1 针对树模型的特征工程

在此介绍针对树模型的特征工程。

3.1.1 长尾分布处理

通过前期的EDA,观察到“price”的分布是一种长尾分布,针对长尾分布的数据,为了将其映射到服从正态分布的情况,利用box-cox变换目标值“price”来解决“price”的长尾分布。“price”的初始分布如图2-7所示。经过box-cox变换后得到的分布如图3-1所示。


图3-1 box-cox变换后的“price”

3.1.2 特殊值处理

根据EDA中的观察,原始数据集并不是完美的,需要对其特殊值进行处理,主要包括无用值、无变化值、缺失值、异常值、长尾分布等等,针对数据集中存在的特殊值进行分别处理。在本次研究中主要涉及以下几点。

(1)针对无用值和无变化值,由于与所需要预测的目标值“price”无关,直接采用删除操作,例如“SaleID”,“name”。

(2)针对缺失值,根据特征类型的不同采取不同的填充方式,即分类特征填充众数,连续特征填充平均值。

(3)针对异常值,通过对比训练集和测试集的数据特点采取针对措施,例如删除训练集特有的数据,即“seller”=1的值;把“power”>600的值截断至 600。

3.1.3 特征构造

特征构造是指从原始数据中人工的找出一些具有物理意义的特征。属性分割和结合是特征构造时常使用的方法。结构性的表格数据,可以尝试组合二个、三个不同的属性构造新的特征。

(1)时间地区类

首先针对时间类数据,从“regDate”,“creatDate”可以获得年、月、日等一系列的新特征,然后做差可以获得使用年长和使用天数这些新特征。

其次针对地区类数据,经过查阅大量资料,我们了解到五位数的“regionCode”是德国的地区邮编,且前两位代表省,后三位代表市,截取前两位“省”的信息作为特征信息

(2)数据分桶

分桶是将连续型特征离散化的常用方法,其主要包括等距分桶,等频分桶和模型分桶。当数值特征跨越不同的数量级的时候,模型可能会只对大的特征值敏感,这种情况可以考虑分桶操作,分桶的优点包括:分桶后得到的稀疏向量,内积乘法运算速度更快,计算结果更方便存储;对异常数据有很强的鲁棒性。

在本次研究中,对可分类的连续特征进行分桶,对“kilometer”“power”和“model”等特征进行了分桶。

(3)分类特征

在本次研究中,针对分类特征“brand”、“model”、“kilometer”、“bodyType”、“fuelType”与“price”、“days”、“power”进行特征交叉。交叉主要获得的是在不同分类特征的情况下“price”、“days”、“power”的总数、方差、最大值、最小值、平均数、众数、峰度等等。挑选的时候直接使用LightGBM模型去选择特征,一组组的放进去,最终保留了以下特征,同时使用1/4的训练集进行挑选可以更快的锁定真正有用的特征。

保留特征为:

'model_power_sum','model_power_std','model_power_median','model_power_max',

'brand_price_max','brand_price_median','brand_price_sum', 'brand_price_std',

'model_days_sum','model_days_std','model_days_median','model_days_max',

'model_amount','model_price_max','model_price_median','model_price_min',

'model_price_sum','model_price_std','model_price_mean'

(4)连续特征

本次研究的数据集中,匿名变量均为连续特征,使用置信度排名靠前的匿名特征“v_0”、“v_3”与“price”进行交叉,测试方法与分类特征一样,但是效果并不理想。因为都是匿名特征,比较训练集和测试集分布基本相同,并且它们在LightGBM的输出的重要性都是非常高的,所以先全部保留,后期对14个匿名特征使用乘法处理得到14*14个特征,使用sklearn的自动特征选择帮我们去筛选。

保留特征为:

'new3*3','new12*14', 'new2*14','new14*14'

3.2 针对神经网络的特征工程

由于 NN的不可解释性,可以生成大量的我们所不清楚的特征,因此对于NN的数据预处理只要简单处理异常值以及缺失值。大部分的方法都与之前针对树模型数据处理方法相似,不同点在于:

(1)在对于“notRepairedDamage”的编码处理,对于二分类的缺失值,往往取其中间值。

(2)在对于其他缺失值的填充,在测试了效果后,发现填充众数的效果比平均数更好,因此均填充众数。

(3)由于NN会生成大量的特征,我们只需要保留原始特征和刻画几个明显特征,所以这里的特征只有28个。


四、模型构建

一般来说,梯度提升方法适用于异质化数据。全部由图片数据构成或者全部由视频数据构成的数据集,称为同质化数据,这时使用神经网络往往会有更好的表现。但对于异质化数据,比如说数据集中有user gender,user age,也有content data等等的情况,梯度提升方法的表现往往更好。梯度提升方法比神经网络的入门门槛更低,使用起来也更简单。

神经网络和梯度提升方法可以结合起来使用,并常常有很好的表现。为解决本问题,使用神经网络方法学习嵌套特征,并且和其他一些特征结合起来,再运用梯度提升决策树。

4.1 树模型的构建

常用的集成学习的基分类器大都采用决策树算法,如图4-1所示。基于树的学习算法被认为是非监督学习方法中最好的并且是最常用的方法之一。基于树的方法使得模型的精确率很高,很稳定和容易解释。与线性模型不同,基于树的模型能够很好地表达非线性关系,适于解决各类分类和回归问题。为融合各树模型的优点,本文最初选取XGBoost、LightGBM和CatBoost算法进行树模型的构建。

图4-1 集成学习常用方法

4.1.1 XGBoost

在树模型的构建中,首先选取了XGBoost算法。XGBoost是一个优化的分布式梯度增强库,它在 Gradient Boosting 框架下实现机器学习算法,将K(树的个数)个树的结果进行求和,作为最终的预测值。

XGBoost算法采用Level-wise的树生长策略,如图4-2所示,能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层叶子,带来了很多没必要的开销,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。实际运行中,发现在解决该问题上XGBoost算法耗时长,效率低。

图4-2 Level-wise树生长策略

4.1.2 LightGBM

LightGBM是一个梯度提升框架,使用基于学习算法的决策树。它是分布式的,高效的,基于直方图,通过将连续特征(属性)值分段为离散的bins来加快训练的速度并减少内存的使用,如图4-3所示。为了解决one-hot编码处理类别特征的不足,LightGBM采用了Many vs many的切分方式,实现了类别特征的最优切分。用LightGBM可以直接输入类别特征,在1个k维的类别特征中寻找最优切分,朴素的枚举算法的复杂度是O(k),而LightGBM实现了O(klogk)的算法。

LightGBM算法可以减少分割增益的计算量,其通过直方图的相减来进行进一步的加速,在二叉树中可以通过利用叶节点的父节点和相邻节点的直方图的相减来获得该叶节点的直方图。所以仅仅需要为一个叶节点建立直方图就可以通过直方图的相减来获得相邻节点的直方图,而这花费的代价很小。同时还可减少并行学习的通信代价。

图4-3 基于直方图的决策树算法

LightGBM通过leaf-wise(best-first)策略来生长树,如图4-4所示,它是一种更为高效的策略。每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

图4-4 Leaf-wise树生长策略

对比这两种算法,XGBoost目前已经实现了LightGBM之前不同的一些方法比如直方图算法,LightGBM在以下方面更具优势:LightGBM直接支持类别特征,可以不必预先进行独热编码,提高效率;通过特征并行、数据并行等策略优化通信代价;使用多项评价指标同时评价时两者的早停止策略不同,XGBoost是根据评价指标列表中的最后一项来作为停止标准,而LightGBM则受到所有评价指标的影响。因而在树模型构建中,选取了LightGBM算法作为其中之一。

在建立适用于LightGBM的数据集之前,需要将分类变量转化为整型变量;此算法不允许将字符串数据传给分类变量参数。首先统计该特征下每一种离散值出现的次数,并从高到低排序,过滤掉出现次数较少的特征值,然后为每一个特征值,建立一个bin容器,对于在bin容器内出现次数较少的特征值直接过滤掉,不建立bin容器。采用简易LightGBM模型输出的特征重要度较高的几个连续数值特征对price进行刻画。

4.1.3 CatBoost

CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Gradient Boosting(梯度提升) + Categorical Features(类别型特征),也是基于梯度提升决策树的机器学习框架。

CatBoost 算法的设计初衷是为了更好的处理梯度提升树的分类特征。在处理梯度提升树的分类特征时,最简单的方法是用分类特征对应的标签的平均值来替换。在决策树中,标签平均值将作为节点分裂的标准。这种方法被称为Greedy Target-based Statistics,简称Greedy TBS。这种方法有一个显而易见的缺陷,就是通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候会出问题(条件偏移问题)。

为当前树构造新的分割点时,CatBoost会采用贪婪的策略考虑组合。对于树的第一次分割,不考虑任何组合。对于下一个分割,CatBoost将当前树的所有组合、类别型特征与数据集中的所有类别型特征相结合。组合被动态地转换为数字。CatBoost还通过以下方式生成数值型特征和类别型特征的组合:树选择的所有分割点都被视为具有两个值的类别型特征,并且组合方式和类别型特征一样。

CatBoost和所有标准梯度提升算法一样,都是通过构建新树来拟合当前模型的梯度。然而,所有经典的提升算法都存在由有偏的点态梯度估计引起的过拟合问题。在每个步骤中使用的梯度都使用当前模型中的相同的数据点来估计,这导致估计梯度在特征空间的任何域中的分布与该域中梯度的真实分布相比发生了偏移,从而导致过拟合。CatBoost第一阶段采用梯度步长的无偏估计,第二阶段使用传统的梯度提升树方案执行。

4.1.4 树模型调参

针对LightGBM和CatBoost的特征,主要通过以下方式提高算法效率。

(1)调整正则化系数,均使用正则化,防止过拟合。

(2)降低学习率,获得更小MAE的验证集预测输出。

(3)调整早停轮数,防止陷入过拟合或欠拟合。

(4)均使用交叉验证,使用五折交叉验证,减小过拟合。

4.2 神经网络的构建

针对本问题,设计如图4-5所示的五层神经网络,进行嵌套特征学习,能达到与树模型相差无几的精度,是之后模型融合的重要组成。

图4-5 神经网络的搭建

全连接层的结点个数设置如图4-6所示,具体实现可参考代码。

图4-6 全连接层的结点个数设置

对神经网络的调参优化主要从以下方面进行:

(1)训练模型使用小batchsize,512,虽然在下降方向上可能会出现小偏差,但是对收敛速度的收益大,2000代以内可以收敛。

(2)调整正则化系数,使用正则化,防止过拟合。

(3)调整学习率,对训练过程的误差进行分析,选择学习率下降的时机进行调整。

(4)使用交叉验证,使用五折交叉验证,减小过拟合。

(5)选择梯度下降的优化器为Adam,它是目前综合能力较好的优化器,具备计算高效,对内存需求少等等优点。

4.3 组合模型架构

针对不同的数据特征,综合上述各模型的优势,最终选择LightGBM、CatBoost和Neural Network组合模型架构进行训练和测试,如图4-7所示。

图4-7 组合模型架构


五、模型融合

本部分对于多种调参后完成的模型进行模型融合,融合的关键在于待融合的模型有比较相似的评价得分,差异性的结果,其基于之前的模型和特征,即基于几个很好的单模型。

5.1 树模型的集成

集成方法指使用一组具有预测能力的模型达到更好的准确度和模型稳定性。集成方法是已知的能最大限度提升树为基础的模型的方法。好的模型应该在偏差和方差两者之间保持平衡。这就是所谓的偏差-方差权衡管理。集成学习是一种执行这种权衡分析的方法。一些常用的集成方法包括:Bagging、Boosting和Stacking。由于两个树模型的训练数据一样且结构相似,这里两个树模型进行Stacking操作,如图5-1所示。

Stacking操作过程中为防止过拟合,采用以下两种方式:(1)次级模型尽量选择简单的线性模型,这里选用贝叶斯回归模型;(2)利用K折交叉验证,这里进行五折交叉验证。

图5-1 树模型的融合

5.2 神经网络与树模型的融合

由于树模型和神经网络是完全不同的架构,它们得到的分数输出相近,预测值差异较大,适于模型融合,将二者进行简单加权融合便可取到一个更好的结果。加权平均选择系数选择0.5,虽然神经网络的分数略高于树模型,但是所取的最高分是多组最优输出的结合,因此可以实现优势互补。模型的正态融合架构如图5-2所示。

图5-2 神经网络与树模型的融合

最终,我们的测试集的MAE结果稳定在400左右,模型性能得到了较好的优化。


六、总结及心得体会

在本次研究中,我们根据之前所研究学习掌握的内容,将模型融合技术巧妙地运用到二手车交际记录中,创新点主要有以下几点:

(1)数据预处理部分采用无界约翰逊变换将长尾分布的数据拟合为正态分布,效果比对数变换更好;

(2)深入挖掘地区邮编的信息,作为特征量,丰富了特征的选取;

(3)将树模型和神经网络模型融合,使得二者的结果在偏差方面互为补充,预测结果指标更加完美;

(4)采用LightBGM树模型替代XGBoost模型,在特征选择和运行速度方面更加完善。




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容