二、数据预处理
1、缺失值处理:
通过上面数据重复度的统计,发现有缺失值的特征大多数值重复度都比较高,故使用众数填充的方法补充缺失值。
2、数值化非数值特征
非数值特征只有“notRepairedDamage”,它有‘-’,‘0.0’,‘1.0’三种值。将值‘-’用‘0.0’来代替,并把特征值转为浮点数类型。
3、异常值处理
功率特征power的范围在1 ~ 600之间,因此将超出范围的值截断在正常范围内。
发现匿名特征v_13、v_14的特征值集中分布在一定范围内,因此将超出范围的少数异常点进行截断。
三、特征工程
1、组合匿名特征:
一些匿名特征与价格的相关度比较高,说明匿名特征很重要。通过匿名特征之间的组合、匿名特征与其他特征的组合构造新特征,方便后续使用分析。
2、提取日期信息
日期信息有“regDate”、“creatDate”两个特征,通过定义日期解析函数date_tran(),将日期拆分为年、月、日。
3、特征的count编码
统计一些特征的值的数量,将特征与其值的数目构成新的特征。定义函数count_coding()统计特征值的数目。
4、日期的特征构造
基于注册日期和创建日期两个特征,构造更有意义的特征,如汽车的使用时长、注册日期与现在日期的天数、创建日期与现在日期的天数。由于得到的这些天数是离散值,需要对它们进行分桶处理。定义函数cut_group()进行分桶。
5、特征交叉
用数值特征对类别特征做统计刻画,这里选择了与价格相关度最高的几个匿名特征。定义函数cross_cat_num()进行一阶交叉。
6、特征编码
由于存在汽车名称、汽车品牌、区域编码等类别特征,而这些特征都是高基数定性的特征,因此需要对这些类别特征进行编码。常见的方法使用独热编码和标签编码的方法,但这两种方法过于简单,不易产生好的效果,而且容易消耗大量内存和训练时间,所以这里我使用了更加适合高基数定性特征的两种编码方式:平均数编码和目标编码。
①平均数编码
定义平均数编码的类,声明需要编码的特征,调用函数对训练集的特征和标签进行拟合,最后对测试集进行编码即可。
②目标编码
首先给出每种编码的默认值。这里选择了最大值、最小值、平均值这三种编码。通过与类别特征的组合进行目标编码。
③特征归一化
合并训练集和测试集,使用MinMaxScaler对数据进行归一化。
④特征降维
使用PCA对特征进行降维处理,最后将处理完的数据分配回给训练集和测试集。
四、预测模型
1、问题分析
本问题属于对二手车的交易价格的预测,属于典型的有监督回归问题,可以使用回归模型、集成方法等多种算法进行处理。
2、可用模型
针对本问题,可以使用lightgbm、catboost、neural network等模型进行训练预测。lightgbm和catboost都属于树模型,它们的优点是训练收敛速度很快,可以在训练过程中调整正则化系数和学习率,缺点是占用内存空间大、耗时比较长。本次实验我采用了neural network的方法进行训练预测,神经网络不仅在训练时可以使用小规模的数据,而且它的收敛速度的收益大,精度与树模型接近。另外加上Adam优化器等优化方案,可以降低内存消耗,提升计算效率,可以很好地处理特征。
3、训练模型与预测
①定义神经网络模型构造函数,这里我使用了六层神经网络结构
②定义学习率调整函数,每隔100个epoch,学习率减小为原来的1/10
③开始训练和预测。训练过程中使用正则化防止过拟合。同时对训练过程的误差进行分析,选择学习率下降的时机对学习率进行调整。另外使用六折交叉验证,减小过拟合。这里我还使用了Adam对梯度下降进行优化。并将loss比较小的保存为提交文件
五、调参并测试
本次预测的模型中含有epoch,batch,learnRate,以及网络层数等参数,为了获取更好的结果,我查阅资料,进行了多次调参。由于提交次数有限,我选择本地测试后loss比较小的几组进行提交,进行调优上分。
六、最终提交结果:
经过一系列的调整,发现当batch为2000,epoch为145,采用大小分别为300,64,32,8,1的五层神经网络模型时上分效果最好。从比赛网站中提交最后的预测结果,最终我的分数为400.3377分,排名为119名。
实验收获
本次实验中,我参加了阿里天池举办的《二手车价格预测比赛》,我学会了通过查阅资料与书籍,独立的进行数学分析,数据清洗并选择合适的模型进行预测。这使我对数据挖掘有了比较全面的认识,在此,我掌握了几种常见的数据分析,数据清洗的方法,学会,理解并实战了常用的预测模型。
此外,对于本次实验中所用的参数(学习率,batch,epcho等)没有一个比较合理的概念,我手动调参,并选择结果比较好的进行多次提交刷榜,最后取得了不错的成绩。