2. 科学数据基础与预处理实战
科学机器学习与一般机器学习最显著的差别,往往不在模型结构,而在数据。科学数据来自数值模拟、实验测量、遥感观测或仪器采集,通常带有物理量纲、网格结构、时间坐标和不确定性。若在进入模型之前没有把数据格式、缺失、噪声、尺度和划分方式处理好,后续再精细的网络设计也难以得到可信结果。本节围绕一条可执行的数据处理链展开:先读懂数据容器,再清洗与变换,最后用合理的划分策略保证评估可信。
一、三种常见科学数据格式的定位
CSV 是纯文本表格,适合存放行列表格型实验记录,例如每行一个样本、每列一个测量量。它通用、易读,但不保存数据类型、单位、多维结构和元数据,文件体积也大。HDF5 是层次化二进制容器,内部像文件系统一样用“组—数据集”组织,支持分块存储、压缩、部分读取和属性元数据,适合大规模数组与多组实验数据。NetCDF 面向地球科学等网格化数据,自带维度名(如 time、lat、lon、level)、坐标变量和单位属性,是气候、海洋、遥感领域的常用格式,其底层常基于 HDF5 实现。
选择格式的判断依据是:数据是否多维、是否需要保留坐标与单位、是否需要按切片读取。若只是几百行实验记录,CSV 足够;若是 TB 级三维场随时间演化的数据,应使用 HDF5 或 NetCDF,并利用分块与压缩避免一次性载入内存。
import h5py, xarray as xr, pandas as pd
# HDF5:按需读取某个数据集的一个切片
with h5py.File("sim_run.h5", "r") as f:
print(list(f.keys())) # 查看组结构
u = f["fields/u"][0, :, :] # 只读第 0 帧,避免全量载入
# NetCDF:带维度名与坐标读取
ds = xr.open_dataset("era5_sample.nc")
t2m = ds["t2m"].sel(time="2020-01-01", method="nearest")
# CSV:显式指定缺失标记与类型
df = pd.read_csv("experiment.csv", na_values=["NA", "-9999"], dtype={"temp": "float32"})
实操中要特别警惕“哨兵值”:不少观测数据用 -9999 或 1e20 表示无效,若不显式声明,它们会被当作真实数值参与统计,直接污染均值和方差。读取后应先检查各列的取值范围与异常极值。
二、缺失值与噪声处理
缺失分三类:完全随机缺失、与观测条件相关的随机缺失、以及由物理原因造成的结构性缺失(如传感器饱和、云遮挡)。处理前应先统计缺失比例与分布位置。缺失率很低且随机时,可删除对应样本;时间序列或网格数据更适合插值;缺失比例高且集中在某些变量时,应考虑剔除该变量或引入缺失指示特征。
插值要尊重数据物理性质。对一维时间序列可用线性或样条插值;对空间场可用最近邻或反距离加权;对规则网格可用 xarray 的插值接口。需要强调的是,插值只能填补“可推断”的空洞,长时间连续缺失不应靠插值伪造。
噪声处理的核心是区分“测量噪声”和“真实高频信号”。常用手段包括滑动平均、Savitzky–Golay 滤波(在平滑的同时保留峰形)、小波去噪以及基于物理约束的异常检测。判断依据不能只看曲线是否光滑,而应结合信噪比、残差分布和下游任务效果。例如对光谱数据,过度平滑会削平吸收峰,反而降低模型对成分的判别能力。
三、归一化与特征工程
科学数据的各变量量纲差异极大,例如压力可达 1e5 Pa,而应变可能只有 1e-4。若直接输入神经网络,梯度会被大量纲变量主导。常见做法是对每个特征做标准化(减均值除标准差)或归一化到 [0,1]。但要注意:标准化参数必须只用训练集统计量计算,再应用到验证集和测试集,否则会造成信息泄漏。
对具有明确物理意义的量,优先考虑物理归一化,例如用临界温度、参考长度或雷诺数进行无量纲化,这比纯统计标准化更利于跨工况泛化。对周期性变量(如时间、角度),应使用正弦—余弦编码避免 23 点与 0 点之间的虚假跳变。
特征工程方面,科学问题常可从领域知识中构造高价值特征:由速度场计算涡量、由温度梯度计算热流方向、由时序数据提取频谱能量或统计矩。这些特征往往比让模型从原始像素或网格中自行学习更高效,也更具可解释性。
四、数据集划分策略
科学数据常存在相关性:同一实验的连续采样、同一模拟的相邻时间步、同一地点的邻近网格点高度相似。若随机划分,训练集和测试集会“共享”这些相关性,导致评估指标虚高。因此划分必须按独立单元进行,例如按实验批次、按工况、按时间段或按空间区域划分。
典型策略包括:随机划分适用于样本独立同分布的场景;时间序列应按时间先后切分,训练用早期数据、测试用后期数据,严禁用未来预测过去;空间数据可按区域留出法,检验模型对未见过区域的泛化;小样本科学数据常采用 k 折交叉验证,且折的划分同样要按独立单元分组。划分完成后应检查各子集的分布是否一致,若测试集明显偏离训练分布,应明确说明这是分布外评估。
上图把格式读取、清洗、变换与划分串成一条链,并列出最容易被忽视的泄漏点。实际项目中,建议在划分之后再做标准化拟合,并把清洗与变换参数固化为可复用的预处理对象,使训练、验证、推理三个阶段使用完全一致的变换逻辑。
把上述环节落实为固定流程后,科学数据才真正具备进入模型的条件:格式读取保证结构与元数据不丢失,清洗保证数值可信,变换保证尺度可比,划分保证评估诚实。这四步的质量,往往比模型选择更能决定最终结论是否站得住脚。