3. 成本数据清洗与特征工程

成本预测模型的上限,往往在数据进入算法之前就已经被决定了。原始成本数据来自合同台账、物资领用单、劳务结算、机械台班记录、财务凭证等多个系统,字段口径不一、时间粒度不同、缺失与异常并存。如果直接把这些数据喂给模型,再复杂的算法也只能学到噪声。本节围绕五个关键环节展开:缺失值处理、异常值检测、时间序列对齐、成本动因特征构造、特征选择方法。

一、缺失值处理:先判断机制,再选择策略

缺失值处理的第一步不是填补,而是判断缺失机制。工程成本数据中常见的缺失有三类:完全随机缺失(如某张领料单录入时漏填单价)、随机缺失(如低价值零星材料常被合并登记)、非随机缺失(如停工期间的成本记录整体缺失)。机制不同,处理方式完全不同。

对于完全随机缺失,若缺失比例低于5%,可直接删除对应记录;5%~20%之间,数值型字段建议用中位数填补,类别型字段用众数填补。对于随机缺失,应引入辅助变量做条件填补,例如用“同项目同类材料均价×数量”推算缺失金额。对于非随机缺失,删除或简单填补都会引入偏差,正确做法是增加一个“是否缺失”的指示特征,让模型自行学习缺失本身携带的信息。

需要特别提醒:成本数据中的缺失往往具有业务含义。例如“实际成本”字段为空,可能意味着该分项尚未结算,而不是数据错误。此时用均值填补会严重低估成本,更合理的做法是按“已发生未结算”单独标记,并在特征中保留“结算状态”字段。

二、异常值检测:区分错误值与真实极端值

异常值不等于错误值。工程成本中,赶工期的夜间加班费、大体积混凝土连续浇筑的集中材料消耗,都是真实的极端值,删除它们会丢失关键信息。因此异常值检测的目标是识别“可疑点”,再由业务判断其性质。

常用方法有三类。第一类是统计法:对近似正态的字段使用3σ原则,对偏态明显的成本字段使用四分位距IQR法,将超出Q1−1.5×IQR或Q3+1.5×IQR的点标记为可疑。第二类是业务规则法:例如“单方混凝土成本”超出历史区间±40%、“人工单价”低于当地最低工资标准,直接触发规则告警。第三类是模型法:用孤立森林或局部离群因子对多维成本特征联合检测,适合发现“单看每个字段都正常、组合起来不合理”的异常。

检测出可疑点后,处理方式包括:核对原始凭证后修正、按业务规则截断(Winsorize)、或保留但增加异常标记特征。切忌不加判断地批量删除。

三、时间序列对齐:统一时间粒度与口径

成本数据的时间粒度差异极大:财务凭证按月,领料单按天,机械台班按小时,而进度数据可能按周。时间序列对齐要解决三个问题:统一时间粒度、统一时间基准、处理时间窗口错位。

统一粒度时,通常将高频数据聚合到低频。例如把每日领料金额按周汇总,与周进度数据对齐。聚合方式要匹配成本性质:材料费、人工费用求和,单价类字段用加权平均,比率类字段用重新计算而非简单平均。

统一时间基准要求所有数据使用同一套日历,明确工作日、节假日、停工日的定义。对于跨月结算的费用,应按实际发生时间分摊,而不是全部记在结算月。时间窗口错位常见于“进度先报、成本后录”,可通过设置滞后窗口(如成本滞后进度1~2周)来对齐,并在特征中显式加入滞后项。

成本数据清洗与特征工程处理链 原始数据源 合同台账 物资领用单 劳务结算 机械台班 财务凭证 进度记录 ① 缺失值处理 • 判断缺失机制(随机/非随机) • 中位数/众数/条件填补 • 增加“是否缺失”指示特征 ② 异常值检测 • IQR / 3σ 统计检测 • 业务规则告警(单方成本等) • 孤立森林多维联合检测 ③ 时间序列对齐 • 统一时间粒度(日→周→月) • 统一日历基准与停工日定义 • 滞后窗口对齐进度与成本 ④ 成本动因特征构造 工程量类:混凝土方量 钢筋吨数、模板面积 资源类:人工工时 机械台班、材料单价 时间类:施工天数 季节因子、工期压缩率 组合类:单方成本 成本偏差率、资源强度 ⑤ 特征选择方法 过滤法:相关系数、互信息 → 快速初筛 包裹法:递归特征消除RFE → 精度优先 嵌入法:Lasso、树模型重要性 → 平衡效率

四、成本动因特征构造:从原始字段到预测信号

原始字段本身往往不是好的预测特征。例如“本月材料费”这个字段,既受工程量影响,也受价格波动影响,还受结算节奏影响,直接使用会让模型难以区分真正的成本驱动因素。特征构造的核心思路是:把成本拆解为“量×价×效率”的组合,并显式构造比率、偏差和趋势类特征。

以混凝土成本为例,可构造以下特征:混凝土方量(工程量动因)、混凝土单价(价格动因)、单方混凝土人工工时(效率动因)、单方混凝土成本(综合动因)、混凝土成本偏差率(实际单方成本/预算单方成本−1)。再如时间维度,可构造“施工天数”“工期压缩率”“季节因子”等特征,用于捕捉赶工和季节性对成本的影响。

此外,滞后特征和滚动统计量在成本预测中非常有效。例如“前3周平均周成本”“成本环比增长率”“累计成本偏差”等,能够帮助模型捕捉成本变化的惯性和趋势。构造这些特征时要注意避免数据泄漏:只能用预测时点之前的信息,不能把未来数据引入特征。

五、特征选择:在信息量与复杂度之间取舍

特征不是越多越好。冗余特征会增加过拟合风险,也会让模型难以解释。特征选择通常分三步走:先过滤、再包裹、后嵌入。

过滤法用统计指标快速初筛,例如计算每个特征与成本目标的皮尔逊相关系数或互信息,剔除相关性极低(如|r|<0.05)的特征。包裹法以模型性能为准则,如递归特征消除(RFE),反复训练模型并剔除最不重要特征,适合特征数量在20~50个之间的场景。嵌入法在模型训练过程中自动完成选择,如Lasso回归的L1正则化会将不重要特征的系数压缩为零,树模型的特征重要性也可直接排序。

实际操作中,建议先用过滤法把特征从上百个压缩到30个以内,再用嵌入法或包裹法精选到10~15个。最终保留的特征应同时满足三点:与成本目标有稳定相关性、业务上可解释、在验证集上能带来性能提升。如果某个特征在业务上说不通,即使统计指标好看,也应谨慎保留。

实操建议:清洗与特征工程不是一次性工作。建议把每一步处理逻辑固化为可复用的脚本或流水线,并记录每个字段的处理方式(删除、填补、截断、构造),这样当新项目数据接入时,可以快速复用同一套处理规则,保证训练集与预测集的特征口径一致。
常见陷阱:在时间序列对齐时,若把未来才结算的成本分摊到当前周,会造成数据泄漏,使模型在训练集上表现优异但上线后失效。务必确保每个特征在预测时点都是已知的。

总结来看,成本数据清洗与特征工程是一条从“脏数据”到“可用特征”的完整链路:缺失值处理解决“有没有”的问题,异常值检测解决“对不对”的问题,时间序列对齐解决“齐不齐”的问题,特征构造解决“有没有用”的问题,特征选择解决“多不多”的问题。五个环节环环相扣,任何一步偷懒,都会在模型精度上付出代价。