3. 代理模型选型与构建
在材料主动学习中,代理模型(surrogate model)承担着“用少量实验数据近似真实材料响应面”的角色。它既要预测性能,又要给出可信度,才能指导下一轮实验该去哪里做。本节围绕三类主流模型——高斯过程回归(GPR)、随机森林(RF)、神经网络(NN)——讨论它们在材料性能预测中的适用边界、评估指标、不确定性量化方式,以及小样本条件下的选型策略。
三类代理模型的适用性画像
高斯过程回归把目标性能视为随机过程的一次采样,用核函数刻画成分/工艺与性能之间的相似性。它的优势在于:小样本(几十到几百条)下表现稳健,且天然输出预测均值与方差,不确定性量化几乎“免费”。缺点是计算复杂度随样本数呈三次方增长,特征维度高时核函数选择敏感,对离散、类别型工艺参数需要额外编码。它适合连续成分、连续工艺参数、数据量有限且需要不确定性指导采样的场景,例如合金成分—硬度、烧结温度—致密度。
随机森林通过多棵决策树集成,对非线性、特征交互和噪声有较强容忍度,能处理混合类型特征,训练与预测速度快,还能输出特征重要性。它的不确定性通常来自树间预测方差或分位数回归森林,但这类不确定性反映的是“模型分歧”,而非严格的贝叶斯后验,外推区域容易给出过度自信的预测。它适合特征维度中等、样本量几百到几千、含类别变量、需要快速筛选重要工艺因子的任务,例如多组元陶瓷配方筛选。
神经网络在样本充足(数千条以上)、特征与目标关系高度非线性且平滑时优势明显,可拟合复杂映射并支持多任务输出。但小样本下极易过拟合,且标准网络不直接给出可靠不确定性,需要借助蒙特卡洛 Dropout、深度集成或贝叶斯神经网络来近似。它更适合已有高通量计算或文献数据库支撑、需要跨体系迁移的场景。
模型评估指标:别只看 R²
材料数据常带噪声、样本少、分布不均,单一指标容易误导。回归任务建议同时观察:决定系数 R² 反映整体拟合优度,但在小样本下对异常点敏感;均方根误差 RMSE 与目标同量纲,便于判断“预测误差是否小于实验波动”;平均绝对误差 MAE 对离群点更稳健;若关注高价值区间,可看最大误差或分区间误差。更关键的是采用留一法或 K 折交叉验证,并尽量按成分体系或工艺批次分组划分,避免同体系数据同时进入训练与验证造成“信息泄漏”而虚高。对分类任务(如是否形成目标相),则用准确率、召回率、F1 与 ROC-AUC,并注意类别不平衡。
不确定性量化:从“给个数”到“给区间”
主动学习的核心是“用不确定性换信息”。GPR 直接给出预测方差,可据此构造期望改进 EI、置信上界 UCB 等采集函数。RF 可用树间方差或分位数回归森林给出预测区间,但需用留出集检验区间覆盖率是否接近名义水平(如 90% 区间实际覆盖约 90%)。NN 常用蒙特卡洛 Dropout:推理时保持 Dropout 开启,多次前向得到均值与标准差;或训练多个独立网络做深度集成。无论哪种,都应做校准检查——把预测区间覆盖率与名义置信度对比,若明显偏低说明不确定性被低估,需要温度缩放或集成规模调整。
小样本下的模型选择策略
小样本时,优先选择归纳偏置强、参数少的模型。GPR 配合 Matern 核通常是首选;若特征含类别变量或关系突变,可先用 RF 建立基线并查看特征重要性,再决定是否用 GPR 精修。神经网络在小样本下应谨慎,若必须使用,可采用迁移学习:先在大规模计算/文献数据上预训练,再用少量实验数据微调,并配合强正则化与早停。实践中建议并行训练 2~3 个候选模型,用同一交叉验证划分比较 RMSE 与区间覆盖率,选择“预测准且不确定性可信”的模型进入主动学习循环。
可执行示例:候选模型对比记录表
下面给出一份可直接填写的模型对比记录表,用于同一数据划分下比较 GPR、RF、NN 的表现。示例数值为教学假设,实际应以你的交叉验证结果为准。
| 模型 | 关键配置 | CV-RMSE | CV-MAE | 90%区间覆盖率 | 结论 |
|---|---|---|---|---|---|
| GPR | Matern ν=2.5,长度尺度初值1.0 | 0.42 | 0.31 | 0.88 | 首选,不确定性可信 |
| RF | 500棵树,max_depth=12 | 0.55 | 0.40 | 0.72 | 基线,区间偏窄 |
| NN | 2×64,MC Dropout p=0.1,50次采样 | 0.61 | 0.47 | 0.65 | 样本不足,暂缓 |
# 示例:GPR 交叉验证与区间覆盖率检查(伪代码)
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern
from sklearn.model_selection import KFold
kernel = Matern(length_scale=1.0, nu=2.5)
gp = GaussianProcessRegressor(kernel=kernel, alpha=1e-6, normalize_y=True)
for train_idx, test_idx in KFold(n_splits=5, shuffle=True, random_state=0).split(X):
gp.fit(X[train_idx], y[train_idx])
mu, sigma = gp.predict(X[test_idx], return_std=True)
# 90% 区间:mu ± 1.645*sigma,统计真实值落入比例
covered = ((y[test_idx] >= mu - 1.645*sigma) &
(y[test_idx] <= mu + 1.645*sigma)).mean()
print("RMSE:", ((mu - y[test_idx])**2).mean()**0.5, "覆盖率:", covered)
运行后若覆盖率显著低于 0.90,说明方差被低估,可增大 alpha 或改用更平滑核;若 RMSE 远大于实验重复性误差,则需检查特征是否遗漏关键工艺变量。只有预测精度与不确定性校准同时达标,代理模型才适合进入下一轮主动学习采样。