/Sec_cars

Primary LanguageJupyter Notebook

Sec_cars

线性回归预测二手车售价

本项目的基本框架:

  1. 定义问题
  2. 收集数据
  3. 数据清洗
  4. 数据分析及可视化
  5. 训练线性回归模型

1. 二手车市场是非常庞大且活跃的,每天都有很多成功的交易达成.不仅如此,二手车信息也受到很多购车人士的重视.

本次项目,主要讨论以下两个问题:

  • 二手车的定价和哪些因素有关?
  • 如何在二手车数据集上训练线性回归模型.

2. 使用爬虫从淘车网采集广州地区的二手车交易信息

囿于篇幅,这里仅提供爬虫的基本思路:

  • 设置Agent等头部信息,防止被反爬虫机制拦截
  • 抓取二手车品牌名称及对应的链接
  • 在元素检查模式下找到剩余所需信息的链接
  • 拼接完整链接,对所有链接发送请求
  • 发送抓取链接的请求并解析数据
  • 导出并储存数据

3. 数据清洗

3.1 处理缺失值

  • 对于驾驶里程,"百公里内"的数据直接替换成100公里,这是比较合理的选择
  • 对于上牌时间和新车价格缺失的,直接从数据集中删除,因为即使用其他值填补,也很难保证是一个好的估计,反而会影响后续的模型训练准确性

3.2 处理含有中文的数据

3.3 验证数据的正确性

  • 如果New_price < Sec_price,则数据肯定是错误的.试问,二手车价格比新车还贵,谁还买二手车呢?

3.4 对分类型数据作标签编码处理

3.5 处理中文型日期

3.6 创建新特征

根据上牌日期,创建一个新特征,例如以2002-01-01作为基准,计算中间的日期数,则对于各款车来说,这个日期数越大,说明车越新,相应地,其价格应该越高.

3.7 删除无效的特征

  • Brand,Name 这样的品牌名称对后续的分析无用,可以删除
  • Boarding_time,day_base已经被压缩为Board_days,可以删除

通过观察,我们看到上面的各个特征,New_price的量级是106,而Discharge的量级是100,这种数据训练出来的线性模型具有非常大的误差,且各系数大小差距非常大.需要做归一化处理,这里我们采用(0-1)处理.

3.8 对数据作归一化处理,压缩到[0,1]

到此数据清洗部分结束

4. 数据可视化

上面是一个简单的数据可视化,可以看出:

  • New_price,Discharge,Board_days这三个特征和Sec_price是一种正相关
  • Km和Sec_price是一种负相关

由于数据的可用特征较少,数据分析部分就不再展开详细讨论,给出下面的相关性热图作为参考:

5. 训练线性回归模型

我们将使用4个特征: New_price, Km, Discharge, Board_days

模型的方程为: Sec_price = W0*New_price + W1*Km + W2*Discharge + W3*Board_days

由于我们的手写代码中,没分配b这项,因此求得的回归系数和sklearn算法求得的系数有所不同.

下面使用测试集验证模型的准确率

模型效果:

  • 在训练集上的准确率为86.76%,三个标准差置信区间浮动在+/-9.35%,最差准确率为77.41%
  • 在测试集上的准确率为82.61%,三个标准差置信区间浮动在+/-24.55%,最差准确率为58.06%

可见,我们的模型有点偏向过拟合,对于过拟合,原本需要减少特征(参数)个数,降低模型复杂度.但是由于我们的数据本来只有4个特征可用,因此不宜再缩减特征.可以考虑使用局部加权线性回归,针对各特征赋予恰当的权重,平衡模型在训练集和测试集上的表现.具体实现不在此处展开.