ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI赋能分析化学:从光谱预处理到深度学习建模

AI赋能分析化学:从光谱预处理到深度学习建模 简介面向分析化学专业师生与科研人员这份PPT课件系统梳理了人工智能在该领域的基本概念、主要学派与典型应用。内容从智能与人工智能的定义、人类智能的构成入手逐一介绍认知学派、逻辑学派、行为主义学派和连接主义学派的研究思路并重点展示专家系统在谱图解析、化合物结构阐明、分离条件选择、实验方案优化等分析化学实际问题中的具体用法帮助读者快速掌握AI技术如何辅助数据处理、模式识别和实验设计。全篇以单份PPT文件形式提供大小3.48MB页面编排完整涵盖智能分类、知识获取、专家系统组成等关键模块适合作为教学演示或自学入门。目前已有150人学习下载适合希望快速建立AI分析化学交叉领域知识框架的读者。1. 人工智能在分析化学中的落点把读图这件事变成可训练的函数分析化学现在不缺数据缺的是把图谱转成结论的时间。高分辨质谱一次全扫描能产生十几万个特征通道近红外光谱在产线上每秒都在累积新曲线液相色谱一天的峰列表足够一个熟练的分析人员看上好几天。过去靠化学计量学做主成分分析和偏最小二乘法能搞定线性问题遇到重叠峰、非线性响应和跨仪器数据传统方法就开始吃力。人工智能的思路很直接把“这个谱对应什么物质、浓度是多少、批次是否合格”这类问题从依赖个人经验变成可以训练的分类和回归任务。这篇文章按一套讲座课件的组织方式从数据预处理讲到建模、部署和验证每个环节给出可复现的参数和代码目标是让有分析化学背景的读者直接跑通第一个机器学习模型同时也让 5 年以上经验的人重新审视自己项目里的验证流程。2. 分析化学数据的预处理模型行不行的分水岭2.1 原始谱图直接进模型的三个翻车点从仪器导出的原始谱图本质上是一张二维表X 轴是波长、波数或质荷比Y 轴是响应强度。这张表直接送进机器学习模型通常会在三个地方翻车。第一是基线漂移。一台红外光谱仪从早上开机到晚上关机光源温度和检测器响应会缓慢变化同一个样品在不同时段采集的谱图基线可能一条斜向上、一条斜向下。模型如果只看绝对强度会把时间效应误当成样品差异分类器学到了“上午的样品和下午的样品不同”而不是“真药和假药不同”。第二是高维稀疏。高分辨质谱一次采集可能产生几万个特征通道但一个项目的样本量常常只有几十个。特征维度远超样本数量时模型很容易把噪声当信号学进去训练集准确率接近 100%一到测试集就崩。这个问题在人工智能方向的本科毕业设计里尤其常见很多人拿到公开光谱数据集直接跑深度学习表面效果不错换个采集条件就失效。第三是量纲不一致。不同批次、不同稀释倍数的样本响应强度的绝对数值差异很大。如果不做归一化梯度下降过程会被强度大的维度主导模型把精力集中在几个强峰上弱峰携带的信息就被忽略了。所以分析化学建模的第一件事不是选模型而是定预处理流程。常见的组合是基线校正、归一化和特征选择下面逐个讲参数怎么设。2.2 基线校正、归一化和特征选择的实用参数光谱数据基线校正最常用的不是减去最小值而是非对称最小二乘ALSAsymmetric Least Squares。ALS 的核心逻辑是给残差设置非对称权重落在基线上方的点真实峰的位置惩罚小落在基线下方的点惩罚大迭代几次后拟合出一条沿着信号下边缘走的平滑曲线。阶段常用方法关键参数适用场景基线校正非对称最小二乘 ALSlam1e51e7p0.0010.1红外、拉曼、荧光光谱的漂移基线基线校正多项式拟合阶数 13拟合点选峰间区域峰数量少、基线缓慢变化归一化SNV逐条光谱减去均值除以标准差固体粉末、散射较强的近红外归一化一阶导数 Savitzky-Golay窗口 715多项式阶数 23去除基线平移、增强峰分辨率特征选择方差过滤 Lasso方差阈值约 0.01alpha 用交叉验证高维稀疏的质谱和全波段光谱lam 控制基线的光滑程度lam 越大基线越接近一条直线p 控制非对称性的强弱p 越小基线越贴合下边缘。拉曼光谱上我习惯先用 lam1e6、p0.01 打底然后拿一段空白溶剂的光谱试跑一次肉眼确认基线确实落在峰底而不是切进峰里。归一化方面SNV 不依赖外部样本对每条光谱单独做标准化适合在线检测场景。导数处理常用 Savitzky-Golay 平滑配合一阶导数窗口太大会把相邻峰抹平窗口太小噪声上扬建议在同一数据集上用交叉验证扫一遍窗口再定。2.3 用 Python 搭一条光谱预处理管线Python 端最常用的组合是 SciPy 加 scikit-learn。下面的函数把基线校正、平滑、归一化串成一条管线输入是一条原始光谱的一维数组。import numpy as np from scipy import sparse from scipy.sparse.linalg import spsolve from scipy.signal import savgol_filter def als_baseline(y, lam1e6, p0.01, niter10): 非对称最小二乘基线校正 L len(y) D sparse.csc_matrix(np.diff(np.eye(L), 2)) w np.ones(L) for _ in range(niter): W sparse.spdiags(w, 0, L, L) Z W lam * D.T D z spsolve(Z, w * y) w p * (y z) (1.0 - p) * (y z) return z def preprocess_spectrum(raw): # 第一步减去估计的基线消除漂移 baseline als_baseline(raw, lam1e6, p0.01) corrected raw - baseline # 第二步Savitzky-Golay 平滑窗口 11 点、2 阶多项式 smoothed savgol_filter(corrected, window_length11, polyorder2) # 第三步SNV 归一化逐条光谱独立计算 return (smoothed - np.mean(smoothed)) / np.std(smoothed)这段代码解决前文提到的三个问题ALS 把基线漂移拉平Savitzky-Golay 压制高频噪声SNV 把每条光谱拉到同一量纲。注意 ALS 的 lam 要随光谱点数调整点数上万时 1e6 可能不够基线会跟着峰形走SNV 是逐条光谱独立计算不涉及样本间统计量放在这里不会引入数据泄漏。提示预处理参数一旦定稿建模阶段就不要回头反复调。预处理和模型参数的联动调整会让交叉验证结果虚高换新数据时必然翻车。3. 分类和回归不是同一套玩法光谱与色谱建模实操3.1 分析场景如何决定用分类还是回归分析化学里的机器学习任务基本可以归成两类。一类是定性判别比如用拉曼光谱区分原研药和仿制药、用近红外光谱判断食用油产地输出的是一个类别标签本质是分类问题。另一类是定量预测比如用紫外-可见光谱预测溶液中目标物浓度、用化合物结构预测色谱保留时间输出的是连续数值本质是回归问题。分类和回归的区别不只是输出形式不同整套建模策略都要分开设计。分类问题的主要矛盾是样本不平衡一个光谱库里合格批次有 2000 条、不合格批次只有 40 条模型把所有样本判成合格准确率照样能到 98%。回归问题的主要矛盾是样本覆盖率训练集浓度集中在 0.1~1 mg/L模型对 5 mg/L 的样本预测基本不靠谱。这决定了分类任务里要做类权重调整或重采样评估指标用 F1、混淆矩阵而不是 Accuracy回归任务里要做量程覆盖检查让每个验证折都包含完整的浓度区间否则模型只是在一段区间里做插值而已。3.2 用随机森林跑通一个光谱分类最小示例用 scikit-learn 的随机森林做光谱分类是最容易拿到基线结果组合。光谱预处理之后是一个 (n_samples, n_wavelengths) 的二维数组配合一维标签数组直接进模型。from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import classification_report # X: 预处理后的光谱矩阵, shape (样本数, 波长点数) # y: 类别标签, 例如原研药/仿制药 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, stratifyy, random_state42 ) clf RandomForestClassifier( n_estimators500, min_samples_leaf2, max_featuressqrt, class_weightbalanced, random_state42 ) cv_scores cross_val_score(clf, X_train, y_train, cv5, scoringf1_macro) print(f5折交叉验证 F1: {cv_scores.mean():.3f} ± {cv_scores.std():.3f}) clf.fit(X_train, y_train) y_pred clf.predict(X_test) print(classification_report(y_test, y_pred))代码里有三个关键参数值得解释。第一stratifyy让训练集和测试集的类别比例保持一致避免少数类样本恰好全落在测试集里导致评估结果失真。第二class_weightbalanced对少数类提高误分惩罚光谱数据集类别数量悬殊时比手动过采样更直接。第三max_featuressqrt限制每棵树的每次分裂只看部分特征在光谱这种高维特征空间里能有效降低树之间的相关性让随机森林真正“随机”起来。模型训练完不要急着满意。交叉验证分数高、留出集分数明显低说明训练集和测试集分布存在差异或者预处理过程中泄露了测试信息两个分数都高才说明模型有真正的判别能力。3.3 色谱保留时间预测的回归建模与分组验证色谱保留时间预测是典型的回归任务输入是化合物的结构描述符输出是保留时间或保留指数。它和光谱分类最大的不同在于输入特征是人工构造的特征质量直接决定模型上限。from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import r2_score from sklearn.model_selection import GroupKFold # X_desc: 化合物结构描述符矩阵 # y_rt: 实测保留时间 # groups: 化合物所属的结构骨架编号用于分组验证 gkf GroupKFold(n_splits5) model GradientBoostingRegressor( n_estimators300, max_depth4, learning_rate0.05, subsample0.8, random_state42 ) for train_idx, val_idx in gkf.split(X_desc, y_rt, groups): model.fit(X_desc[train_idx], y_rt[train_idx]) pred model.predict(X_desc[val_idx]) print(fR² {r2_score(y_rt[val_idx], pred):.3f})这里用 GroupKFold 而不是普通 KFold原因在于相似结构的化合物如果同时出现在训练集和验证集模型会直接“背”出保留时间而不是学会从结构预测时间。按结构骨架分组才能评估模型对新结构类型的泛化能力。GBDT 的参数组合里max_depth4 在描述符维度不高时足够learning_rate 调小配合加大 n_estimators通常比大步长更稳。保留时间预测的另一个坑在于标签本身。不同实验室对保留时间的定义不完全一致有的用扣除死时间后的容量因子 k有的直接用绝对保留时间。数据入库时如果混用这两种定义模型训练得越好错误越一致——它只是把两个不同定义下的规律硬揉在一起。4. 深度学习是质谱注释的新工具嵌入空间与库匹配边界4.1 质谱数据的稀疏性和异构性决定了模型结构质谱数据和色谱、光谱数据有一个显著区别稀疏性。一次 MS/MS 扫描产生的峰列表通常只有几十到几百个有效峰但排列在几万到十几万个可能的质荷比通道上。用完整的一维向量表示绝大部分位置是零。这种输入恰好适合神经网络因为经过 ReLU 激活函数后梯度计算只涉及非零通道计算效率高。另一个特点是异构性。同一个代谢物在不同碰撞能量下产生的二级谱图差异很大传统数据库匹配需要为每个化合物存储多张不同能量下的参考谱图才能有效匹配。深度学习的方法则不同把不同能量下的谱图映射到同一个嵌入空间让同一化合物的谱图在空间中彼此靠近然后通过近邻距离完成注释。嵌入空间的思路在代谢组学里尤其有价值。因为代谢物数据库的覆盖有限很多真实谱图在库里找不到参考嵌入模型至少可以给出候选排名帮助分析人员定位到结构类似物而不是直接放弃注释。4.2 用 PyTorch 搭建谱图嵌入模型的最小结构谱图嵌入模型的目标是把输入谱图映射到一个低维向量训练方式按对比学习思路走。import torch import torch.nn as nn import torch.nn.functional as F class SpectralEmbeddingNet(nn.Module): def __init__(self, input_dim, embed_dim128): super().__init__() self.fc1 nn.Linear(input_dim, 512) self.bn1 nn.BatchNorm1d(512) self.fc2 nn.Linear(512, embed_dim) def forward(self, x): h F.relu(self.bn1(self.fc1(x))) return F.normalize(self.fc2(h), p2, dim1) model SpectralEmbeddingNet(input_dim15000) def contrastive_loss(anchor, positive, margin1.0): anchor 和 positive 是同化合物的两张谱图距离应尽量小 dist ((anchor - positive) ** 2).sum(dim1) return dist.mean()BatchNorm1d 放在 ReLU 之前因为质谱特征的值域范围差异极大标准化可以稳定前几层的梯度。输出层做 L2 归一化让嵌入向量落在单位球面上之后用余弦距离做检索时语义更清晰。样本量只有几百条时建议在 fc1 之后再加一层 Dropout(0.3)防止嵌入空间过拟合到训练集。训练时用 Triplet Loss 或 InfoNCE 都可以关键在样本对构造同一个化合物、不同碰撞能量的谱图对要尽量多嵌入空间才能学出对碰撞能量的不变性。数据增强可以做强度扰动但质荷比的绝对位置不能改变否则化学信息就错了。4.3 深度模型和传统库匹配的分工深度学习做质谱注释的优势是自动特征学习但劣势同样明显训练集依赖性强跨仪器平台、跨实验室的泛化能力普遍弱于人工整理的经验规则。实际项目里我建议的分工是先跑 GNPS 或本地数据库的余弦打分分数高的直接接受分数中等或匹配不上的子集再送进嵌入模型做候选排序。嵌入模型输出必须伴随不确定度。如果一张谱图在嵌入空间里找不到近距离邻居应该标记为“库外”而不是硬给一个低置信度的注释。实现上可以设一个距离阈值超过阈值的检索结果直接过滤掉。这套分工守住了一个底线传统库匹配结果始终保有可解释性深度学习模型只负责扩展覆盖范围不负责推翻成熟结论。5. 生成式 AI 和智能体进入分析流程的稳妥姿势5.1 用大语言模型批量抽取文献中的迁移参数分析化学的研发流程里文献调研和实验方案设计占到的时间比实际跑实验还要多。一篇方法学论文里色谱柱型号、流动相比例、流速、梯度程序这些关键参数分散在正文、表格和补充材料里人工阅读一篇需要十几分钟几十篇论文就是大半天。常见做法是把 PDF 批量转成文本用固定格式的 prompt 抽取元素输出 JSON 结构化参数表再做一轮人工校验。关键约束是任务范围要限定为抽取不要开放成“帮我设计一个方法”。同时要求模型返回原文位置证据任何参数的出处都能回溯。实际操作中我会在 prompt 末尾加一句“只抽取作者明确描述的实验条件讨论部分的建议不纳入”。5.2 智能体负责例行筛查不负责下结论最近常说的智能体在分析化学实验室里能落地的场景反而比较枯燥。比如设定一个夜间任务自动读取当天新出的质控数据判断每个样品是否超出 ±3σ 控制限把异常样本抽取出来附上原始谱图路径和批次信息推送给当班分析人员。这类任务不需要太强的推理能力但能省掉大量重复劳动。需要守住的原则是智能体可以提供线索和证据链但不能直接下“合格/不合格”的最终结论。分析化学的结论影响报告放行和批次释放涉及方法验证和质量管理体系必须有人工审核环节。自动化系统的价值在于把证据链整理清楚而不是替代分析人员做决定。5.3 从图谱直接出结论的三个硬条件想让模型从图谱直接给结果落地需要同时满足三个硬条件。第一训练集分布要覆盖实际样本范围模型只能识别它见过的模式换一种基质的样品预测结果就不该被采信。第二必须输出不确定度不能只给一个标签要同时给出概率或置信区间低置信度的结果要能自动拦截。第三数据可溯源每个预测结果都必须记录预处理参数、模型版本、训练数据版本和原始谱图路径否则出了问题无法回溯。现阶段我依然建议把模型输出定位为初筛关键样本用经典方法复核。这不是保守而是分析化学对错误成本的敏感度远高于互联网场景。一次误判的成本可能是一次重新进样也可能是一批产品被错误放行或错误拦截。6. 上线前最后一步把验证做对把数据泄漏堵死6.1 两种隐蔽的数据泄漏形态第一种是全局预处理泄漏。把 200 条谱图先一起做标准化再切训练测试集测试集的均值和标准差已经在标准化计算中混了进去模型在测试集上的表现被系统性放大。修复方式是用 scikit-learn 的 Pipeline 把预处理和模型包在一起交叉验证时每次只在训练折内部拟合标准化参数。第二种是相似样本串扰。同一个样品重复进样得到的多条谱图如果一部分落在训练集、一部分落在验证集模型相当于提前见过答案。修复方式是引入依赖样品来源编号的分组交叉验证。一个可复现实验模板是from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier pipeline Pipeline([ (prep, StandardScaler()), (clf, RandomForestClassifier(random_state42)) ])这个 Pipeline 保证所有预处理参数都在训练折内拟合验证集不参与任何统计量计算。数据进模型之前先按样品批次分组用 GroupKFold 验证。6.2 用时间维度检查批次效应和仪器漂移仪器漂移是分析化学里最常见的模型偏见来源。检查方法很简单把验证集换成另一个日期采集的样本。如果模型在训练采集日期的数据上性能很好换个日期就掉下来说明模型学到的是仪器状态而不是化学信号。具体操作上我会把数据集按采集日期排序用前 80% 天数做训练、后 20% 天数做验证看性能下降幅度。这个检查没有成本但能提前暴露大部分部署问题。6.3 一个最小可复现实验记录格式最终提交模型或写入实验报告时建议至少记录以下内容数据预处理管线的代码版本、模型超参数、训练样本量、特征维度、分组验证方式以及每个预测结果对应的原始谱图路径。把这些信息按结构化作成 CSV放在模型文件同目录下。分析化学的模型结果是要进报告和档案的没法复现的模型结果等于没有做过实验。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进