科学数据管线:从实验数据到训练集的工程化
说明:本篇为综述/无第一手实验数据,采用公开实践与数据工程路线。
实验目标
AI for Science 的瓶颈常不在模型而在数据:实验数据格式五花八门(仪器厂商私有的 .csv/.h5/日志)、单位混乱、缺失值满天飞,还要和仿真数据对齐、打标注、做版本管理。本篇目标:建立一条科学数据管线的工程框架——接入解析 → 清洗对齐 → 特征化/标注 → 版本化数据集,覆盖"仪器数据、仿真输出、公共数据集"三类来源,并给出可落地的目录约定与质量门禁。
代码逐段拆解
第一段:异构数据接入与统一 Schema
python
# 目标:把三类来源统一成一个 parquet 表(按实验 ID 对齐)
import pandas as pd
from pathlib import Path
def ingest_experiment(src: Path) -> pd.DataFrame:
# 按扩展名分派解析器:仪器 csv / 厂商 h5 / 日志
if src.suffix == '.csv':
df = pd.read_csv(src, comment='#') # 跳过注释头
elif src.suffix == '.h5':
df = pd.read_hdf(src) # 厂商 HDF5 导出
else:
df = parse_log(src) # 自定义日志解析
# 统一列名与单位(关键!):原始列 → 标准 Schema
df = df.rename(columns={'Temp [C]': 'temperature_c', '时间': 't_s'})
return df.assign(source=src.stem) # 保留来源溯源要点:
- 扩展名分派是第一步:科学数据最常见的问题不是"没有数据",而是"数据在 N 种格式里"——先按文件类型路由解析器,再统一列名。
- 单位与列名标准化是数据管线的核心动作:
Temp [C]→temperature_c,时间→t_s——不统一单位,下游建模全是隐蔽 bug(华氏/摄氏、秒/毫秒)。 source列保留溯源:每个样本知道来自哪个原始文件,是回溯、去重、权限审计的基础。
第二段:清洗与质量门禁
python
def clean_and_gate(df: pd.DataFrame) -> pd.DataFrame:
n0 = len(df)
df = df.dropna(subset=['t_s', 'temperature_c']) # 关键列缺值即删
df = df[(df['temperature_c'] > -50) & (df['temperature_c'] < 200)] # 物理范围
df = df.drop_duplicates(subset=['t_s', 'source']) # 时间+来源去重
n1 = len(df)
print(f"[gate] {n0} -> {n1} rows ({n0-n1} dropped)")
assert (n1 / n0) > 0.8, "清洗率过高,检查源数据质量" # 质量门禁
return df要点:
- 门禁不是可选项:缺值、物理越界、重复记录三类清洗各有规则;
assert门禁保证"清洗率异常高(>20% 被删)时报警",防止脏数据在不知道的情况下把清洗当正常。 - 物理范围过滤是科学数据的特色:温度 -50~200°C、压力非负——用领域知识设物理约束,比统计离群点更可靠。
- 去重要带来源:两个实验可能同时刻同值,
['t_s','source']联合去重避免误删。
原理讲解
三类来源的对齐策略
| 来源 | 特征 | 对齐问题 | 处理 |
|---|---|---|---|
| 仪器/实验数据 | 格式私有、采样不定 | 时间戳对齐 | 重采样到统一网格 |
| 仿真输出 | 网格/步长由求解器定 | 与实验空间不一致 | 插值/映射到实验坐标 |
| 公共数据集 | 已整理但口径各异 | 单位、定义不一致 | 统一 Schema 重映射 |
核心方法:所有来源先转成"统一 Schema 的时空网格",再按实验 ID 对齐。不要试图保留每种格式的原生结构——统一网格 + 来源列是可回退的通用形式。
训练集/仿真输入的版本管理
科学数据集和代码一样要版本管理:dataset/ 目录按"版本号 + 变更说明"组织,配 checksum:
text
datasets/
v2026-10-baseline/ # 基线版:清洗规则 v1、含 10 万样本
v2026-10-pharma/ # 制药扩展:新增专有数据 2 万
MANIFEST.json # 版本清单:来源、清洗规则、样本数、checksum关键点:
- 版本与代码版本绑定:训练脚本记录用的数据集版本(
dataset_v=v2026-10-pharma),实验可复现的前提是"代码+数据版本都锁定"。 - 清洗规则也要版本化:清洗逻辑改一行,整个数据集语义就变了——把清洗脚本与数据集同版本管理,比只记数据文件更严谨。
- manifest 是可追溯性载体:每个版本声明"来源文件、清洗规则、样本数、checksum",审计与复现都靠它。
与 AI4S 各环节的衔接
科学数据管线是 AI4S 的地基:生成模型(AI 制药篇)要"干净+多样"的训练数据,代理模型(hpc-surrogate 篇)要"仿真-实验对齐"的配对数据,可复现工作流(14 章)要求"数据版本可锁定"。管线做不好,后面所有模型都建立在流沙上——数据管线的工程投入回报率在 AI4S 里最高。
实验结果
(估算口径,非实测)
| 管线阶段 | 耗时占比 | 常见失败 |
|---|---|---|
| 接入解析 | 30% | 格式五花八门、解析器逐个适配 |
| 清洗对齐 | 40% | 单位不一致、时间戳错位 |
| 特征化/标注 | 20% | 标注口径漂移、人工标注不统一 |
| 版本管理 | 10% | 忘记记录版本、清洗规则无版本 |
工程启示
- 先统一 Schema 再谈质量:单位/列名标准化是第一步,不做它后面全是隐性 bug。
- 质量门禁用 assert 而非口头承诺:清洗率、缺失率、物理范围三张门禁表自动化,超阈值就拦——"数据质量是跑出来的"不是"觉得出来的"。
- 来源列与 manifest 双保险:每行有 source、每版本有 manifest,数据事故(错数据进训练集)才能回溯到根。
- 数据管线优先于模型选型:AI4S 项目把 40% 精力给数据管线是合理的——模型可以换,脏数据无法靠换模型解决。
下一篇预告:数据地基补好后,AI4S 的工程链(JAX→制药→数据)在本章已形成小闭环——下一步可回到 14 章科学智能章继续深化,或转向站点 SEO 收尾。由你裁量。