二手车价格预测实战:从特征处理到模型评估的完整流程

编程狮(w3cschool.cn) 2026-09-08 14:43:29 浏览数 (19)
反馈

二手车价格预测属于监督学习中的回归任务。完整流程不是把表格直接交给模型,而是先确定预测时可用的字段,划分训练集与测试集,再分别处理数值和类别特征,最后用 MAE、RMSE 和基线模型共同判断效果。

二手车价格预测机器学习流程封面图

你下载了一份二手车数据,调用模型后很快得到一个看似不错的分数,但换一批车辆就明显失准。问题往往不在算法不够高级,而在数据泄漏、字段处理或评估方式。本文基于 Python、pandas 与 scikit-learn,搭建一个可复用的二手车价格预测流程。今天这篇文章,编程狮带你从业务问题走到可解释的模型结果。

一、把二手车价格预测定义成回归问题

回归是预测连续数值的监督学习任务。二手车价格预测的目标 y 是成交价或挂牌价,输入特征 X 可以包括车龄、里程、品牌、燃料类型、变速箱和排量等。

开始前必须明确预测时点。假设用户刚提交车辆信息,你能使用的只能是提交当时已经知道的字段。成交后的维修费用、最终议价幅度或平台人工估价如果混入训练数据,就会形成数据泄漏,让离线分数虚高。

可以先把字段分为三组:预测时可用、预测后才产生、可能包含目标信息。第二和第三组默认排除,再和业务人员逐项确认。机器学习基础概念不熟悉时,AI 人工智能教程 能帮助你先理解特征、标签、训练和推理。

⚠️ 注意:模型预测的是数据分布中的统计关系,不是车辆真实价值。样本来源、地区和时间变化都会影响结论。

二、先检查数据质量与目标分布

一份二手车表格至少要检查缺失值、重复记录、异常值、单位和时间字段。里程可能同时出现公里和英里,价格可能混入货币符号,年份也可能写成首次上牌日期。没有统一含义的数字,模型学得再快也没有价值。

import pandas as pd

cars = pd.DataFrame({
    "age": [2, 5, 3, 8, 4, 6, 1, 7],
    "mileage_km": [18000, 76000, 42000, 130000, 55000, 98000, 9000, 115000],
    "brand": ["A", "B", "A", "C", "B", "C", "A", "B"],
    "fuel": ["petrol", "diesel", "hybrid", "petrol", "diesel", "petrol", "hybrid", "diesel"],
    "price": [128000, 72000, 116000, 39000, 81000, 52000, 158000, 47000],
})

print(cars.info())
print(cars.describe(include="all"))

真实数据中还应画出价格分布,并按品牌、车龄和里程分组观察。价格通常右偏,少量豪华车型可能拉高均值。异常值不能见到就删除:一辆高价车可能是真实样本,也可能是单位错误,需要结合原始记录判断。

如果 pandas 操作还不熟,可以先看 Python3 基础教程,确保你理解列表、字典、函数和模块后再推进模型训练。

三、先划分数据,再处理特征

训练集用来学习参数,测试集只用于最后评估。预处理器也必须只在训练集上拟合,否则测试集的统计信息会提前泄漏到训练过程。

数值特征可以用中位数填补缺失,类别特征用最常见值填补后做 OneHotEncoder。把处理步骤与模型放进 Pipeline,可以保证训练和预测执行完全相同的转换。

from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler

X = cars.drop(columns="price")
y = cars["price"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

numeric_features = ["age", "mileage_km"]
category_features = ["brand", "fuel"]

numeric_pipe = Pipeline([
    ("fill", SimpleImputer(strategy="median")),
    ("scale", StandardScaler()),
])

category_pipe = Pipeline([
    ("fill", SimpleImputer(strategy="most_frequent")),
    ("onehot", OneHotEncoder(handle_unknown="ignore")),
])

preprocess = ColumnTransformer([
    ("number", numeric_pipe, numeric_features),
    ("category", category_pipe, category_features),
])

model = Pipeline([
    ("preprocess", preprocess),
    ("regressor", Ridge(alpha=1.0)),
])

model.fit(X_train, y_train)

handle_unknown="ignore" 很重要。线上出现训练集中没有的新品牌或燃料类别时,编码器不会直接报错,而是按未知类别处理。示例数据很小,只用于演示结构,不能据此评价实际模型效果。

四、用基线、MAE 与 RMSE 评估模型

任何机器学习模型都要和简单基线比较。回归任务可以先用训练集价格中位数预测所有测试样本。如果复杂模型连这个基线都赢不了,就没有上线价值。

import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

prediction = model.predict(X_test)
baseline = np.full(len(y_test), y_train.median(), dtype=float)

model_mae = mean_absolute_error(y_test, prediction)
base_mae = mean_absolute_error(y_test, baseline)
model_rmse = mean_squared_error(y_test, prediction) ** 0.5

print("model MAE:", round(model_mae, 2))
print("baseline MAE:", round(base_mae, 2))
print("model RMSE:", round(model_rmse, 2))

MAE 表示平均绝对误差,单位与价格相同,业务人员容易理解;RMSE 会更重地惩罚大误差,适合关注严重错估的场景。两者都应报告,不能只挑更好看的一个。

还要计算模型相对基线改善了多少,并按品牌、价格区间、车龄区间分别评估。总体 MAE 尚可,可能掩盖某些品牌始终被高估的问题。

五、通过交叉验证和误差分析改进

单次训练集划分可能带来偶然性。数据量允许时,使用 K 折交叉验证,让不同样本轮流充当验证集,可以获得更稳定的效果估计。时间跨度较长的数据则不应随机打乱,应按时间切分,用过去训练、未来验证。

误差分析比盲目换模型更重要。给测试结果增加绝对误差列,查看误差最大的二十辆车,再寻找共同特征:是否来自稀有品牌、极端里程、事故车、缺失配置或特殊地区。发现规律后,优先补数据和修字段。

可以依次尝试三类改进:

  1. 增加预测时真实可获得的配置与地区特征;
  2. 对价格和里程使用合理变换,并保留原始单位说明;
  3. 比较树模型、梯度提升和线性模型,但保持同一数据切分;
  4. 用交叉验证选择参数,不接触最终测试集;
  5. 记录实验配置、随机种子和结果,保证可复现。

关于回归模型思路,可以继续阅读 Python 逻辑回归笔记。逻辑回归主要用于分类,不直接预测价格,但文章能帮助你理解特征、损失函数和模型评估之间的关系。

5.1 上线前检查漂移、解释与边界

二手车市场会随时间变化。新车型上市、政策变化、地区供需和季节因素都可能让训练分布过时。上线后要监控输入缺失率、未知类别比例、预测分布和拿到真实价格后的误差。

模型输出最好给出适用范围,而不是伪装成精确报价。例如告诉用户“基于同地区、相近车龄与里程样本的估计”,并在样本不足时降低置信度或转人工复核。对高价、稀有和信息缺失车辆设置明确边界,比强行给出数字更负责。

生产代码还要保存完整 Pipeline,而不是只保存回归器。否则线上缺少同样的编码与缩放步骤,输入维度和含义都会错位。模型版本、训练数据时间范围和评估报告应一并留档。

二手车价格预测建模流程决策树

总结

二手车价格预测是回归任务,决定效果的核心是数据定义和评估流程,而不是先挑最复杂的算法。你要先排除预测后字段,再划分数据,用 Pipeline 处理数值与类别特征,最后同时比较基线、MAE、RMSE 和分组误差。

记住三个重点:预处理只能在训练集拟合;测试集不能参与调参;上线后必须监控市场变化。下一步可以替换示例数据为经过授权的真实数据,并先建立中位数基线,再逐步增加特征和模型复杂度。

延伸学习

想继续完成端到端项目,可以按这个顺序:

  1. 先跟着 二手车价格预测实战课程 完成数据到模型的完整练习;
  2. 再读 Python 机器学习工具笔记,了解 scikit-learn 与其他工具的定位;
  3. 最后使用 Python 代码格式化工具 整理实验脚本,便于复现实验。

常见问题

Q:二手车价格预测应该用分类还是回归?

直接预测连续价格通常用回归。如果业务只需要判断高、中、低价格区间,可以转成分类,但会损失具体数值信息,评估指标也需要随之调整。

Q:R² 很高就代表模型能上线吗?

不代表。R² 可能被数据泄漏、异常分布或随机切分放大。还要检查 MAE、RMSE、时间外数据、不同品牌分组和线上输入质量,并确认模型优于简单基线。

Q:缺失值全部填 0 可以吗?

通常不建议。0 可能是合法数值,也可能改变字段含义。数值可考虑中位数,类别可使用众数或明确的“未知”,并把缺失比例作为监控指标。

Q:为什么线上误差比离线大?

常见原因包括数据分布变化、预处理不一致、线上出现未知类别,以及离线切分泄漏未来信息。应对比线上线下输入、保存完整 Pipeline,并使用按时间切分的验证集。

0 人点赞