最近整理了线性回归的原理及代码实现,想要用实际数据来测试模型,正好看到阿里云天池数据赛正在进行二手车交易价格预测算法赛,正好能用线性回归模型进行预测,就在这里分享一下代码。
一、赛题介绍
赛题以预测二手车的交易价格为任务,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。其中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B。
特征如下:
二、数据预处理
数据预处理是跑模型之前最重要的一步,做好预处理,模型也就成功了一半。
为了方便读取数据,我将原始数据中price(价格)字段移到最后一列。
在进行预处理之前,先做特征分析,看看各个特征的分布。
查看数据的特征字段名称:
查看该特征数据分布:
作特征数据分布图:
与Y值做散点图:
对所有特征数据做归一化,保持特征量纲统一。
将训练集按8:2比例分为组内训练集与测试集,测试模型训练效果。
三、线性回归模型代码实现
我尝试直接利用手写线性回归算法代码实现模型训练。
结果遇到报错"MemoryError: Unable to allocate 151. GiB for an array with shape (135000, 150000) and data type float64" ,意思就是待训练矩阵过大导致内存不足无法计算。
在尝试尽量缩小训练数据量后,发现计算机最多只能计算数千条数据,我转而求助sklearn包来实现线性回归。
四、sklearn代码实现
sklearn是目前python中十分流行的用来实现机器学习的第三方包,其中包含了多种常见算法如:决策树,逻辑回归、集成算法(如随机森林)等等。
用sklearn实现多元线性回归:
参数 fit_intercept,选择是否需要计算截距,默认为True;
参数 normalize,选择是否需要标准化(中心化),默认为false;
预测组内测试集,查看均方误差大小。
作图查看预测效果,数据集数据量太大,只取前100个预测结果查看拟合效果:
可以看到预测结果大体上还是和测试集相符的:
五、比赛得分
将训练的模型用于待预测数据集,输出结果提交到比赛中。
预测结果:
将结果输出到csv文件中:
以下为提交结果后获得的误差分数与排名,可以看到和其他人提交的结果还是有很大差距的。
六、模型优化
面对不佳的预测效果,我回头检查数据发现了一些数据缺失和数据移位的问题,进行数据补齐后重新训练模型,但预测分数没有得到显著提升。
于是我思考基于sklearn优化现有线性回归模型。
(1) 岭回归
岭回归在损失函数中增加了正则项,也叫L2范数,以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度。
提交比赛结果后,模型预测表现没有得到显著提升。
(2)LASSO回归
岭回归无法剔除变量,而LASSO回归模型,将惩罚项由L2范数变为L1范数,可以将一些不重要的回归系数缩减为0,达到剔除变量的目的。
提交比赛结果后,模型预测表现没有得到显著提升。
至此,线性回归模型在二手车交易价格预测赛中的代码如上。
小记:
1、线性回归在sklearn上实现即方便又快速。
2、我看到二手车交易价格预测赛论坛中,排名靠前的模型都是神经网络实现的,下一步我将用神经网络框架实现价格预测模型,对比现有模型效果。