3. 实验数据采集与预处理
实验数据知识图谱的质量,首先取决于进入图谱之前的原始数据是否可靠、一致、可追溯。实验场景中的数据往往来自三类源头:传感器(温度、压力、振动、电流等连续时序信号)、仪器(示波器、光谱仪、电子天平、数据采集卡等导出的结构化文件)、人工记录(实验日志、纸质表格、口头记录后补录)。这三类数据在采样频率、时间基准、量纲、精度、命名习惯上差异极大,若直接汇入知识图谱,会形成大量语义冲突与错误关联。因此,采集与预处理不是"清洗一下数据"这么简单,而是一条从物理信号到可信数据对象的工程链路。
一、多源采集方式与各自的"坑"
传感器数据通常通过采集卡或边缘网关以固定周期采样,例如某温度实验以 10 Hz 采样,输出形如 timestamp, channel_id, value, unit 的时序流。它的主要问题是时钟漂移与通道标定:不同采集卡的晶振存在偏差,长时间实验后时间戳会错位;传感器未标定时,原始电压值不能直接当作物理量。
仪器数据多为"一次实验一个文件",如光谱仪导出的 CSV 含波长与强度两列,电子天平输出单点质量值。这类数据的坑在于元数据缺失:文件名可能只写"实验1",量程、分辨率、环境条件都未记录,事后无法判断数据是否可用。
人工记录则面临主观性与格式不统一:同一温度可能被记为"25℃""25度""室温",同一时间可能写成"上午10点"或"10:00"。人工记录必须尽快结构化,否则会随时间推移丢失上下文。
采集阶段应遵循一个原则:原始数据只读保存,任何清洗都在副本上进行。原始文件按 实验ID/设备ID/日期/原始文件 的目录结构归档,并记录采集配置(采样率、量程、标定系数、操作人)。这一步决定了后续所有处理是否可追溯。
二、数据清洗:从"脏"到"可用"
清洗的目标是识别并处理四类问题:重复记录、异常值、格式错误、逻辑矛盾。
重复记录常见于人工补录与自动采集叠加。判断依据可以是"同一设备、同一时间戳、同一物理量"的三元组重复。处理时保留采集来源优先级更高的那条(一般传感器 > 仪器 > 人工),并记录被丢弃记录的来源。
异常值检测不能只靠"3σ 法则"。对于传感器时序,更稳妥的是结合物理量程约束与变化率约束:例如某压力传感器量程 0–1 MPa,出现 -0.2 MPa 或 1.5 MPa 直接判为越界;相邻两点变化超过 0.3 MPa/s 且无对应操作记录,判为可疑跳变。可疑值不直接删除,而是打上 quality_flag = suspect,保留原始值供后续判断。
格式错误包括单位混写、编码错误、小数点与千分位混淆。例如 "1,234.5" 在不同区域设置下可能表示 1234.5 或 1.2345。清洗时应统一为无千分位的点号小数,并显式记录单位字段。
逻辑矛盾指同一实验内相互冲突的记录,如"开始时间晚于结束时间""同一时刻两个不同温度值"。这类问题必须回到原始记录核对,不能靠算法自动"修正"。
三、缺失值处理:先判断"为什么缺"
缺失值处理的第一步不是填补,而是归因。缺失通常分三类:
- 完全随机缺失:如网络抖动导致个别点丢失,可用线性插值或前后均值填补。
- 随机缺失:与某些已观测变量相关,如高温时段传感器过热保护停机,需结合工况判断是否可插值。
- 非随机缺失:缺失本身携带信息,如操作人员故意未记录失败实验。这类缺失不能简单填补,应保留"缺失"状态并标注原因。
对于时序数据,短缺口(如连续缺失少于 3 个采样点)可用线性插值;长缺口应分段处理,并在数据对象上记录 gap_start、gap_end、gap_reason。对于人工记录缺失,优先回溯原始日志或询问操作人,而不是用统计方法"猜"。
imputed = true 与填补方法标记,否则后续分析会把填补值当作实测值,导致结论偏差。四、单位统一与标准化
单位统一是知识图谱关联的前提。同一物理量在不同来源中可能使用不同单位:温度有 ℃、K、℉;压力有 Pa、kPa、MPa、bar;质量有 g、kg、mg。统一策略是:为每个物理量定义一个基准单位(如温度用 K,压力用 Pa,质量用 kg),所有数据在入库前转换为基准单位,同时保留原始值与原始单位。
标准化则针对数值范围差异过大的问题。例如同一张表中,温度在 300 左右,压力在 0.001 量级,直接做距离计算会被大数值主导。常用方法有 min-max 归一化与 z-score 标准化。选择依据是后续用途:若需要保留物理量纲关系,用 z-score;若需要限定到 [0,1] 区间用于可视化,用 min-max。标准化参数(均值、标准差、最大最小值)必须从训练集或基准数据集计算,不能对全量数据计算后再拆分,否则会造成信息泄漏。
五、数据质量评估:用指标说话
预处理完成后,需要对数据质量做量化评估,而不是凭感觉判断"数据还行"。建议从五个维度建立指标:
| 维度 | 含义 | 可计算字段示例 |
|---|---|---|
| 完整性 | 应有数据是否齐全 | 缺失率 = 缺失点数 / 应有总点数 |
| 一致性 | 同一对象在不同来源是否冲突 | 冲突记录数 / 总记录数 |
| 准确性 | 与基准或物理约束的偏差 | 越界点数、标定残差 |
| 时效性 | 数据时间戳是否在有效窗口内 | 延迟 = 入库时间 − 采样时间 |
| 可追溯性 | 能否回溯到原始文件与操作人 | source_file、operator、采集配置是否齐全 |
以某温度实验为例:应有 36000 个采样点,实际有效 35420 个,缺失率约 1.6%;其中 12 个点被标记为 suspect,3 条人工记录与传感器记录冲突。若设定完整性阈值 98%、一致性阈值 99%,则该数据集完整性不达标,需要回到采集环节检查丢点原因,而不是直接进入图谱。
quality_score、quality_flags、source_trace。这样后续查询可以按质量过滤,避免低质量数据污染关联推理。六、一个可复用的预处理记录模板
为了让每一步处理都可追溯,建议为每个实验数据集维护一份预处理记录。字段不必多,但必须覆盖关键决策点:
dataset_id: EXP-2024-0317-T01
source_type: sensor | instrument | manual
raw_file: /raw/EXP-2024-0317/T01/sensor_10Hz.csv
sampling_rate: 10 Hz
calibration: K=0.998, offset=0.12
cleaning:
duplicates_removed: 24
outliers_flagged: 12
format_fixes: 3
missing:
total_points: 36000
missing_points: 580
imputed_points: 420
impute_method: linear
gap_reason: "传感器过热保护停机 58s"
unit:
temperature: K (raw: ℃)
pressure: Pa (raw: MPa)
normalization:
method: z-score
params_source: baseline_set_B12
quality:
completeness: 0.984
consistency: 0.997
accuracy_flags: 12
traceable: true
quality_score: 0.91
这份记录本身就是知识图谱中的"数据血缘"节点。当后续分析发现某条结论异常时,可以沿 dataset_id → raw_file → cleaning → imputation 回溯,判断问题出在采集、清洗还是填补环节。预处理不是一次性动作,而是为整个知识图谱建立可信基座的过程。