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。标准化参数(均值、标准差、最大最小值)必须从训练集或基准数据集计算,不能对全量数据计算后再拆分,否则会造成信息泄漏。

多源实验数据采集与预处理链路 原始数据只读归档 → 清洗 → 缺失值归因 → 单位统一 → 标准化 → 质量评估 采集层(三类源头) 传感器:10 Hz 时序流 · 时钟漂移 仪器:单文件导出 · 元数据缺失 人工:日志/表格 · 格式不统一 清洗层(四类问题) 重复记录:来源优先级去重 异常值:量程 + 变化率双约束 格式错误:小数/单位显式化 缺失值归因与处理 完全随机:短缺口线性插值 随机缺失:结合工况判断 非随机:保留缺失状态与原因 单位统一(基准单位) 温度 → K(保留 ℃ 原值) 压力 → Pa(保留 MPa 原值) 质量 → kg(保留 g 原值) 时间 → ISO 8601 统一时区 标准化(按用途选择) z-score:保留量纲关系 min-max:限定 [0,1] 可视化 参数仅从基准集计算,避免信息泄漏 数据质量评估:完整性 · 一致性 · 准确性 · 时效性 · 可追溯性 每项指标对应可计算字段,未达标数据打 quality_flag,不进入知识图谱主链

五、数据质量评估:用指标说话

预处理完成后,需要对数据质量做量化评估,而不是凭感觉判断"数据还行"。建议从五个维度建立指标:

维度含义可计算字段示例
完整性应有数据是否齐全缺失率 = 缺失点数 / 应有总点数
一致性同一对象在不同来源是否冲突冲突记录数 / 总记录数
准确性与基准或物理约束的偏差越界点数、标定残差
时效性数据时间戳是否在有效窗口内延迟 = 入库时间 − 采样时间
可追溯性能否回溯到原始文件与操作人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 回溯,判断问题出在采集、清洗还是填补环节。预处理不是一次性动作,而是为整个知识图谱建立可信基座的过程。