3. 食品品质数据集构建与探索性分析

在食品品质指标预测任务中,模型的上限往往在数据准备阶段就已经被决定。无论后续选用偏最小二乘回归、随机森林还是深度网络,如果原始数据集中混入了量纲错乱、缺失成片、异常离群或类别严重失衡的样本,模型学到的将是噪声而非规律。本节围绕“把一份原始检测数据整理成可建模数据集”这一目标,依次处理数据清洗、缺失值与异常值、特征分布可视化,以及类别不平衡的识别与初步应对。

一、数据清洗:先统一口径,再谈建模

食品品质数据通常来自多条链路:理化检测(水分、蛋白质、脂肪、酸价、过氧化值)、仪器检测(近红外光谱、色差、质构)、感官评分以及批次与工艺记录。这些数据在合并前必须完成口径统一,否则后续所有统计都会失真。

清洗的第一步是字段与单位对齐。例如水分含量有的记录为百分数(如 12.5),有的记录为小数(0.125);酸价有的用 mg KOH/g,有的用 mg/g;温度可能同时存在摄氏与华氏。建议在合并前建立一张字段字典,明确每个字段的含义、单位、量纲和合法取值范围。第二步是主键与重复样本处理:以“批次号 + 采样时间 + 检测项目”作为联合主键,检查是否存在重复录入;对完全重复的行直接去重,对同一批次多次检测的记录,按检测目的决定取均值还是保留全部(若用于建模时间趋势则应保留)。第三步是类型规范化:把“合格/不合格”“优/良/中/差”等文本标签映射为有序整数或独热编码,把日期统一为 ISO 格式,把混入的空格、全角字符、单位后缀(如“12.5%”)剥离为纯数值。

一个常见的坑是“隐性缺失”:空字符串、"-"、"NA"、"未检出"、0 都可能代表缺失或低于检出限。必须逐列核查,把“未检出”与真正的 0 区分开——前者往往应作为左删失数据处理,而不是简单填 0,否则会系统性低估指标水平。

二、缺失值与异常值:判断机制,再选策略

缺失值处理的关键不是“填什么”,而是先判断“为什么缺”。若缺失完全随机(如仪器偶发故障),删除缺失比例极低的样本或均值/中位数填充是可接受的;若缺失与某个分组相关(如某条产线从不检测过氧化值),则应按分组填充或引入缺失指示变量;若缺失比例过高(例如某特征缺失超过 40%),更稳妥的做法是评估该特征是否值得保留。

对数值型特征,中位数填充比均值更稳健;对偏态明显的指标(如酸价、菌落总数),可先做对数变换再填充。对时间序列性质的检测数据,可用前向填充或按批次插值,但必须记录填充来源,避免把插值结果当作实测值参与结论。

异常值识别建议“统计规则 + 业务规则”双轨并行。统计侧常用四分位距法:低于 Q1 − 1.5×IQR 或高于 Q3 + 1.5×IQR 视为可疑;对近似正态的特征也可用 |z| > 3。业务侧则依据理化常识设定硬边界,例如水分含量不可能为负、蛋白质含量不可能超过 100%、感官评分应在量表范围内。两类规则冲突时,优先相信业务边界,因为统计规则会把“真实但罕见的高品质样本”误判为异常。

处理方式上,不要一律删除。可先标记异常、回查原始记录;确认是录入错误则修正,确认是真实极端值则保留(尤其当预测目标本身关注极端品质时),仅在异常明显由测量故障导致时才剔除。下面的示意图概括了从原始表到可建模数据集的处理链路与判断分支。

食品品质数据集构建与探索性分析链路 原始检测数据 理化 / 光谱 / 感官 多来源、多单位 数据清洗 单位/量纲统一 去重、类型规范化 缺失值处理 判断缺失机制 中位数/分组填充 异常值识别 IQR / z 分数 + 理化业务边界 回查原始记录 录入错误→修正;真实极端→保留 特征分布可视化 直方图 / 箱线图 / 相关性热图 / 散点 类别不平衡识别 统计各类占比,检查少数类样本量 阈值:少数类 < 10% 需重点关注 初步应对策略 重采样 / 类别权重 / 分层划分 评估改用 F1、召回率、AUC 可建模数据集 特征矩阵 + 标签 + 数据字典

三、特征分布可视化:用图发现文字看不出的问题

可视化不是“画着好看”,而是用来暴露数据问题。建议至少完成四类图:直方图或核密度图看单特征分布形态(是否偏态、是否双峰、是否存在截断);箱线图按类别分组看组间差异与离群点;相关性热图看特征间共线性(例如水分与水分活度高度相关时,建模需考虑剔除其一);散点图或成对图看特征与目标的关系是否单调、是否存在分群。

以近红外光谱为例,原始光谱常存在基线漂移和散射效应,直接画分布会看到大量重叠;此时应先做标准正态变换(SNV)或一阶导数预处理,再观察分布是否收敛。又如感官评分常集中在 7~9 分区间,呈明显负偏,若直接用于回归,模型会偏向预测中间值,可考虑对目标做变换或改用有序分类思路。

四、类别不平衡:识别与初步应对

当预测目标是“合格/不合格”“是否超标”这类分类标签时,不平衡几乎必然出现。识别方法很直接:统计各类样本数与占比,若少数类占比低于 10%,或少数类绝对样本量不足数百,就应视为需要处理。同时要检查不平衡是否与特征分布耦合——例如不合格样本恰好集中在某几个批次,这提示可能存在批次级泄漏,划分训练集与测试集时必须按批次分组,而不能随机划分。

初步应对可从三个层面入手。数据层面:对少数类过采样(SMOTE 或简单随机过采样)、对多数类欠采样,注意过采样只能在训练集内进行,绝不能先过采样再划分,否则测试集会被污染。算法层面:为类别设置 class_weight='balanced' 或自定义权重,让损失函数更关注少数类。评估层面:放弃准确率,改用召回率、F1、AUC-PR 等指标,并配合分层交叉验证保证每折中类别比例一致。

实践建议:把清洗规则、缺失填充方式、异常判定阈值、重采样参数全部写入一份数据处理配置或脚本,保证训练与推理阶段使用完全相同的变换。任何在测试集上“临时调整”的预处理,都会让评估结果虚高。

完成上述步骤后,应产出一份可复用的数据集说明:字段含义与单位、样本量与类别分布、缺失与异常处理记录、特征变换方式、训练/验证/测试划分策略。这份说明既是建模的输入契约,也是后续复盘模型误差时追溯数据根源的依据。