资讯详情

汽车燃油效率与碳排放数据集:从清洗到建模的完整实践

📅 2026/10/8 20:20:59 | 华诺云谱 👁 阅读
汽车燃油效率与碳排放数据集:从清洗到建模的完整实践
我不知道你有没有遇到过这种情况明明手头有一张列得很清楚的表——车型、年份、发动机排量、气缸数、城市油耗、公路油耗、综合油耗最后还有一列二氧化碳排放值看起来什么都能做但真正动手跑数据的时候却总觉得哪里不对。我第一次拿到这份汽车燃油效率与二氧化碳排放数据集时以为拿它练个回归模型、画几张相关性热力图就结束了。结果在清洗、分析和建模的过程中反复被各种细节绊倒有的行看起来是车其实是同一款车的不同配置有的油耗单位是“升每百公里”有的是“英里每加仑”混在一起差点让我做出完全相反的结论还有排放数据的版本差异导致同一款车在不同年份之间出现断崖式变化。这篇文章不打算给这个数据集做宣传也不打算把代码一股脑堆出来。我想换个角度把我把这份数据集从“能打开”做到“能解释、能预测、能落地”的全过程拆开讲一遍。其中包括数据集到底适合回答什么问题、字段清洗时最容易翻车的点、建模前的观察方法以及最后把模型用于现实决策时的边界。无论你是刚接触数据分析的学生还是已经在做车辆能耗相关业务的从业者这套思路应该都能帮你少走不少弯路。1. 这个数据集到底在回答什么问题拿到数据的第一个动作不是写代码而是先问一句这份数据最擅长回答什么问题又不擅长回答什么问题很多人上来就把所有字段扔进模型然后发现预测精度上去了但业务上一个问题都解释不了就是因为没想清楚数据集的“能力边界”。1.1 数据能直接回答的问题以这份汽车燃油效率与二氧化碳排放数据集来说它至少能比较可靠地回答下面几类问题发动机排量、气缸数和CO₂排放之间的数量关系到底是强相关还是弱相关在控制住车型和年份之后城市油耗和公路油耗哪一个对综合排放的影响更明显不同品牌、不同车辆类型轿车、SUV、皮卡在油耗和排放上的分布差异同一款车跨越多个年份时油耗和排放的变化趋势是怎样的通过特征组合建立回归模型用已知参数预测未知车型的排放水平。这些问题的共同特点是都可以用表格里已有的字段回答不需要额外采集外部数据。1.2 数据回答不了的问题但这个数据集也有明显的盲区。最典型的是它只记录了车辆本身的参数没有记录驾驶行为。你从这份数据里看到的“城市油耗”是在标准测试工况下测出来的而不是在北京二环堵车两小时的真实油耗。如果你是做出行服务的想通过驾驶行为优化油耗这份数据就不够用必须要叠加GPS轨迹、加速踏板开度、发动机转速这类时序数据。另一个盲区是温度和环境因素。冬天开暖风、夏天开空调对油耗的影响可以差到10%到15%以上但标准测试工况通常是在固定温度下完成的。所以当我后来尝试用时序预测模型去匹配某辆车在真实路线上的油耗时发现用这份数据集训练出来的模型系统性偏低原因就是训练数据里根本没有温度维度。1.3 想清楚使用场景再动手我自己的习惯是在开始建模前先用一两段话把事情描述清楚。比如“我想用车辆参数预测综合工况油耗误差要控制在10%以内应用场景是新车上市前的快速估算”。描述清楚之后很多决策就变得很自然要不要做分类先看目标变量分布要不要归一化看特征的量纲差异要不要做分层采样看数据集里是否存在年份不平衡。这一节看起来像是废话但我见过太多人在同一个数据集上反反复复重做几十版模型最后发现不是模型不行而是从一开始就没想清楚要回答什么问题。2. 从原始数据到干净表格字段拆分与清洗的坑搞清楚目标之后我接下来做的是把原始表格真正“吃透”。网上能下载到的这份数据集不同渠道的版本字段会有些出入但核心字段大概包括下面这些字段含义典型类型车型名称品牌 车型 年份或配置字符串年份车型对应年份整数发动机排量单位通常是升L浮点数气缸数发动机气缸数量整数变速器类型自动、手动、CVT等字符串市区油耗城市工况油耗L/100km 或 MPG浮点数公路油耗公路工况油耗L/100km 或 MPG浮点数综合油耗综合工况油耗L/100km 或 MPG浮点数二氧化碳排放量通常单位是 g/km也有版本用 g/mile浮点数字段看起来不多但每个字段都有石头要搬。2.1 车型名称里藏着“复合记录”我把这份数据集导进 pandas 之后第一眼看到的是车型名称这列非常混乱。既有“Ford F150 Pickup 4WD”这种把品牌、车型、驱动方式揉在一起的写法也有“Chevrolet Silverado 3500 HD 4WD”这种更长的组合。如果直接把整列当作一个分类变量去做特征编码分类数量会爆炸而且很多类只有一两条记录。我的做法是先做名称解析把品牌、车系、驱动方式拆开。这里不需要复杂的自然语言处理因为常见数据集的名称结构通常比较规整你只需要定义几组关键词比如“4WD”“AWD”“2WD”对应驱动方式再用品牌清单把品牌字段拆出来即可。如果名称里有“Pickup”“SUV”“Van”这类词还可以生成一个粗糙的车辆类型字段。虽然粗糙但在分析中非常有用。2.2 单位不统一往往会让人摔得很惨这个坑我印象最深刻。同一份数据里如果你是从不同来源合并的很可能一部分记录的市区油耗用的是“升每百公里”另一部分用的是“英里每加仑”。两者方向刚好相反升每百公里数值越小越省油英里每加仑数值越大越省油。如果我们没做单位检查相关性分析方向都会是反的。建议在清洗阶段写一个检查函数专门扫描数值列的范围。比如 L/100km 的城市油耗一般落在 5 到 20 之间MPG 一般落在 15 到 50 之间。如果发现同一列里有的值在 5 到 20、有的在 15 到 50基本可以断定单位混了。此时可以先统一成 L/100km再用公式完成换算MPG 235.215 / (L/100km)反过来也一样。我后来还专门在脚本里留了单位断言一旦未来有新数据进来数值范围不对就会被拦下来。这种防御性编程看起来多写了几行但能在合并数据时省下大量返工时间。2.3 缺失值和重复值的处理策略这份数据集的缺失值不算夸张但分布很不均匀。有的字段缺失率很低比如排量和气缸数可能只有几十行有的字段比如变速器类型缺失比例会高不少。关于缺失值处理我不建议直接删掉有缺失的行。因为缺失比例一旦超过5%删除之后样本量虽然还够但样本代表性可能被破坏。更稳妥的做法是分情况讨论如果是数值型特征且缺失率在2%以下可以用中位数或同车型组的均值填充如果缺失率高不如把这个字段当作“有值/缺失”二值特征加入模型让模型自己去学缺失模式如果是变速器这种类别特征缺失的部分单独分一个“unk”类。重复值方面则要留意一点排放数据集里经常出现同一年份、同一品牌、同一车型的多条记录区别只是发动机排量和气缸数不同。这是合理记录不是重复数据。真正的重复是所有字段完全一致。所以去重时要先定义到底按哪些列判断重复不要按整行硬去重否则会把不同配置的车型误删。3. 建模前的观察一些反直觉的关系曲线数据清洗完之后我习惯先做一轮探索性数据分析再谈建模。这个过程里最让我惊讶的是一些听起来顺理成章的关系在真实数据里往往带拐点甚至会出现与直觉相反的区域。3.1 排量越大排放越高但不是一条直线几乎所有拿到这份数据集的人第一件事都是画一张发动机排量和 CO₂ 排放的散点图。数据乍看确实正相关排量小的车排放低排量大的车排放高。但如果你把这个关系放大到具体区间会发现它不是一条贯穿始终的直线。在1.0升到2.0升这个区间排量每增加0.5升CO₂ 排放量大致增加 20 到 30 g/km但在2.0升到3.5升这个区间斜率变得平缓因为很多大排量车开始使用混动技术或者为了降低排放特意调校了发动机压缩比与变速箱齿比等到3.5升以上排放又开始快速上升而且样本点之间的方差明显变大。这意味着什么如果我们在全量数据上拟合一根直线模型在中间区间的预测会系统性偏高或偏低。你可能会画出漂亮的 R²但残差会在排量轴的不同位置呈现出有规律的模式。这种“局部线性全局非线性”的结构正好是树模型比较擅长处理的场景。3.2 城市油耗和公路油耗到底哪个更影响排放大多数人会本能地认为“城市油耗高说明车在低速状态下费油那排放也会高”。但我在分析中却发现在单变量相关性上城市油耗、公路油耗和综合油耗的关系非常微妙。这份数据集的综合油耗并不是简单的城区和公路油耗算术平均而是按照一定加权比例算出来的具体系数在不同数据版本里并不完全一致。如果你直接用“城市公路”除以2来构造特征很可能会引入噪声。我在建模前特意计算了三个油耗字段和排放的相关系数结果是综合油耗的相关性最高、公路油耗次之、城市油耗相对弱一点。原因也不难理解CO₂ 排放和燃油消耗量本质上呈线性关系因为燃烧同等质量的汽油产生的CO₂是基本固定的。综合油耗是对整车全工况油耗的概括指标自然相关性最高。3.3 品牌差异比想象中大得多另一个很明显的观察是排量、油耗和排放的关系在品牌维度上会发生平移。比如同样排量2.0升的两款车一款运动型轿车可能调校偏向高转速综合油耗偏高另一款家用轿车偏爱低转速巡航综合油耗能低不少。这提醒了我一个建模要点品牌和车型这两个分类特征必须进入模型不加这些信息的模型会明显损失预测能力。我在这一阶段的结论是这个数据集不是那种“三行代码就能得到完美线性模型”的玩具它天然需要特征工程和对关系结构的观察。真正的建模工作从EDA阶段就已经开始了。4. 用回归还是用树模型我的实战建模记录观察做得差不多了接下来进入建模环节。我这里选择的任务是根据车辆参数预测综合油耗和 CO₂ 排放。这个任务看起来简单但不同建模策略之间的差距还是很大的。4.1 确定目标和数据切分方式首先我确定的预测目标是 CO₂ 排放量单位是 g/km。这是个连续变量预测它属于回归问题。对于数据切分我没有简单使用随机切分而是按照年份做了时间切分。原因很简单这个数据集本身带时间属性未来的车型大概率更符合近几年的规律如果用随机切分会把年份信息泄露进训练过程造成偏乐观的评估结果。我用早期年份做训练集后期年份做验证集。这样训练好的模型更接近“用过去预测未来”的真实场景评估结果更有说服力。4.2 线性回归的基线表现我先跑了一个普通的最小二乘线性回归作为基线。特征包括发动机排量、气缸数、市区油耗、公路油耗、综合油耗、车龄、品牌和车辆类型。分类变量做 Label Encoding 或 One-Hot Encoding 都行我在这份数据上选择了 One-Hot 以避免给品牌强行加上顺序关系。结果很有意思。当特征里包含综合油耗时线性回归的 R² 能到 0.91 左右看起来已经不错了。但只要我删掉综合油耗只保留排量、气缸数和油耗字段R² 会掉到 0.80 以下。这说明这个数据集里的“油耗”字段是CO₂预测的核心中间变量。不过线性回归的残差图在数据边界处是有问题的大排量车型的预测值系统偏低混动车和高性能车的残差波动很大。原因就是前面说的局部非线性关系。4.3 树模型和梯度提升带来的提升接着我跑了随机森林和梯度提升树模型。在这个数据集上梯度提升树的优势非常明显模型R²MAE (g/km)是否使用类别特征线性回归含综合油耗0.918.2部分线性回归不含综合油耗0.7911.6部分随机森林含综合油耗0.937.4是梯度提升树含综合油耗0.946.8是梯度提升树在特征重要性上给出来的排序也很合理综合油耗排在第一位排量第二气缸数和车龄紧随其后。品牌的重要性虽然中等但当它被排除后模型的 MAE 会上升 5% 左右说明在数据中找到的可解释性信息确实存在。4.4 调参与防止过拟合我在训练梯度提升树时核心调参思路不是单纯追求训练集分数而是盯着验证集 MAE。因为时间切分之后训练集和验证集的分布天然存在差异模型稍有不慎就会过拟合早期数据。我的调参范围大致如下树数量在 300 到 800 之间树深度控制在 4 到 6 层学习率设置为 0.05 左右。树数量太多会带来过拟合而深度超过6之后验证集分数基本不再提升但训练时间明显增加。最后我选了一组参数学习率0.05树深度5树数量500。验证集MAE稳定在 6.8 g/km 左右。这里还有一个细节类别特征的处理。在梯度提升树里如果你用的是自带类别特征支持的版本可以直接声明类别列省去 One-Hot 带来的维度膨胀。我自己用的时候发现直接声明类别特征不仅训练速度更快某些情况下验证集分数也更稳定。5. 从连续预测到“环保等级”分类的实践回归模型做好之后很多业务场景其实并不需要精确到个位数的排放值。比如有的系统界面只需要把车型分为低排放、中等排放、高排放三档这时我们需要把回归问题重构为分类问题。5.1 标签怎么切最合理我遇到的一个需求是给车队里的车打“环保等级”。CO₂ 排放量的完整分布存在长尾绝大多数车集中在 110 g/km 到 220 g/km 之间。如果直接用三分位数切分低中高三档比如 143 g/km、143-199 g/km、199 g/km分类会非常机械因为处于分位数边界附近的车辆差异可能只有 2 g/km却被分到不同档位。后来我采用了一个更稳的切法结合业务含义来设定阈值。比如低于 120 g/km 可以看成高效车高于 200 g/km 可以看成高排放车中间那段再按分位数分成两档。这样做的坏处是类别不平衡会比较明显但有业务解释性。实际建模时我用的是多分类问题把原来的回归模型输出的连续值映射到对应区间同时保留回归模型的中间结果方便后续校准。5.2 类别不平衡与评估指标如果你真的把这个分类任务做起来会发现“中间档”的样本占了大多数“高效车”和“高排放车”相对较少。在评估时不能用准确率当唯一指标因为哪怕你全都预测成“中间档”准确率也有 50% 以上。我建议看多类别版本的 F1-score再加上混淆矩阵。具体到业务上混淆矩阵能告诉你哪些高效车被误判成了中等哪些中等车被误判成了高排放。如果能容忍少量误报那就去调模型的分类阈值而不是直接改标签切法。5.3 回归模型和分类模型的关系我还做了一个小实验先用回归模型输出连续值然后对回归结果排序再按阈值打分类标签。这个流程的结果比直接训练分类模型略好因为回归模型利用了数值目标的顺序信息不会把相邻档位完全割裂开。这也符合我的经验当目标在本质上是连续变量时先用回归做底再离散化往往比直接分类更稳。这个思路在不少行业落地场景里都有效。6. 实际使用这套模型时要盯住哪些坑模型训练完成只是第一步真正放到业务里去用的时候至少还有三个坑值得认真对待。6.1 年份外推能力有限如果这个数据集的车型年份范围是 1995 到 2021 年那么对 2025 年新车型的预测本质上是外推不是内插。近些年混动技术大量普及某些品牌的同排量车型排放明显下降如果你的模型训练集里混合动力车数量很少它学到的“排量-排放”关系就会把新款混动车高估很多。我自己的检验方法是分年份做测试。比如用 2020 年之前的车训练专门预测 2020 年之后新出现的车型看误差分布。如果误差有系统性偏移意味着该更新训练数据了而不是继续调参。6.2 车型类别变化导致特征失效这份数据的车型名称包含了很多时过境迁的信息。十年前“SUV”和现在的“SUV”差别巨大如果直接用独热编码或者简单的类别映射去建特征时间一变特征和排放的关系就变了。我在实际落地中倾向于把“车龄”作为连续特征把“车型”当作粗糙的类别而不是把同一车型在不同年份的上千个完全不同的型号全部当成独立特征。对类别做粗粒度处理会让模型更稳定。6.3 预测值不能直接当“真实排放”这点我必须强调一下。模型预测的是标准测试工况下的排放量不是真实道路排放。真实排放还受载重、坡度、空调、胎压、天气和驾驶习惯影响。模型在高层次决策上能用但如果你拿它去做某个城市路段级别的碳排放计算误差会非常大。我在测试过程中发现如果给模型输入一段模拟的城市行驶工况用“行驶距离”乘以“预测排放”算出来的总量可能比 GPS 记录仪实测结果低 10% 以上。因为这种模拟忽略了很多在低速、怠速时的真实燃烧状态。结论是模型适合做车型间的横向对比和趋势预估不适合当精准的实时排放测量工具。7. 复盘与扩展这套数据还能怎么玩数据建模做完之后很多人就停下来了。但其实带着“残差分析”和“场景联想”再去挖一遍数据往往能发现更有价值的结论。7.1 用残差找“隐藏好车”我当时做了一件事把训练好的模型对每辆车的预测残差保存下来专门看那些实际排放比预测值低很多的车。结果发现一个很明显的规律混合动力车占据了残差分布的最低端紧随其后的是某些采用高效涡轮增压的小排量车型。这让我想到如果公司里的任务是找“低排放但高动力”的车与其直接对比排量和排放两个指标不如直接看“预测值和实际值的差”。残差分析在这里充当了一个去混淆工具把排量和尺寸的影响减掉之后剩下的部分更多反映的是发动机技术和调校水平。7.2 把油耗、排放和价格数据拼起来我后来做的一个扩展是把这份排放数据关联价格数据。方法是找到同一品牌、同一车型、同一年的价格信息合并到排放表里再算一个“每万元排放水平”之类的粗指标。这样的分析可以用来回答“预算有限的情况下到底买哪款车环境效益最高”这类问题。合并时要注意名称匹配的问题。排放数据集里的车型名称通常不带年份价格数据集里可能带要么先解析名称要么用年份车型一起匹配。我强烈建议不要只用名称做模糊匹配因为同一款车不同年份的价格差异可以很大不匹配年份会让“性价比”计算失真。7.3 后续可以引入的扩展数据这份数据集还有很多扩展空间比如接入真实道路油耗数据、发动机热效率数据、维修保养记录、保险数据等。其中最有价值的是真实油耗数据因为它能弥补标准测试工况和真实使用之间的鸿沟。只要你能拿到足够多辆同一车型的真实油耗样本就可以建立一个“测试工况到真实工况”的修正模型相当于给原来的预测结果做一次校准。如果你有GPS轨迹和海拔数据还可以做更细的能耗分析比如坡度对油耗的短期影响。这些都是同一份基础数据在不同领域开花结果的方向完全不用把思维局限在“预测排放值”这一件事上。回到我自己的经验这套数据集最适合的工作并不是拿去刷一个非常高的分数而是在一遍遍数据清洗、特征工程和模型迭代中建立起对“车、能源、排放”三者关系的直觉。你最终得到的那个模型参数反而不太重要重要的是你能清楚地说出这辆车排放高的原因是什么哪个因素可以优化优化之后预期能降低多少。明白这些手里的数据就不仅仅是模型素材而成了一本可以反复使用的“车辆能耗关系图谱”。我到现在还会不时回看这份数据的建模代码并不是为了改模型而是每次回看都能提醒自己数据集的边界是真实存在的但只要你愿意把问题问得足够具体边界之外的新数据、新场景总会给你下一轮探索的入口。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑