ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SISSO+机器学习:构建新型容许因子实现钙钛矿稳定性预测

SISSO+机器学习:构建新型容许因子实现钙钛矿稳定性预测 简介这份PDF文献面向材料计算、机器学习与钙钛矿研究方向的科研人员和研究生聚焦钙钛矿结构稳定性预测这一长期难题。资源围绕SISSO方法与键价模型展开提出并验证新型容许因子τBV用以克服传统容许因子tIR依赖离子半径、预测精度有限的缺陷并借助决策树算法构建分类验证模型在376种ABO3型化合物样本上取得更高准确率。压缩包内仅含1个PDF文件约2.05MB即《中国有色金属学报》2020年第30卷第8期论文全文包含摘要、数据集说明、SISSO算法框架、键价模型推导及实验对比结果适合作为机器学习辅助材料筛选的参考文献与专业指导材料。目前已有896人学习下载读者可从中获取新型容许因子的完整推导思路、特征构造方式与模型评估流程为钙钛矿结构预测研究提供可复用的方法参考。1. 钙钛矿稳定性预测的痛点为什么传统容许因子不够用做钙钛矿材料筛选的人大多经历过这种场景用 Goldschmidt 容许因子算出来 0.85 到 1.05 之间的候选材料兴冲冲拿去做第一性原理验证结果一半以上在热力学上根本不稳。问题不在于计算精度而在于 Goldschmidt 因子只用两个几何参数——A 位离子半径和 B 位离子半径——去描述一个本质上涉及电子结构、键合特性和晶格动力学的复杂问题。这种过度简化导致它在卤化物钙钛矿和双钙钛矿体系里频繁翻车。SISSOSure Independence Screening and Sparsifying Operator配合机器学习做稳定性预测核心思路是不再依赖人工设计的单一几何描述符而是从高维特征空间中自动搜索出物理意义明确、预测能力强的组合描述符也就是所谓的“新型容许因子”。这条路子能解决三个实际问题——第一把预测准确率从传统因子的 60% 到 70% 提升到 90% 以上第二筛选出的描述符具有可解释性不是黑匣子第三能迁移到不同晶系和组分空间。适合做高通量材料筛选的研究生和工程师也适合想从纯 DFT 计算转向数据驱动方法的人。2. SISSO 与机器学习怎么配合从特征构建到描述符搜索2.1 SISSO 的核心机制与为什么选它而不是纯神经网络SISSO 的本质是一个压缩感知框架下的符号回归工具。它分两步走第一步叫“独立性筛选”Sure Independence Screening从海量候选特征中快速筛出与目标量相关性最高的前几百个第二步叫“稀疏化算子”Sparsifying Operator用 L0 正则化从筛选出的特征里挑出极少数几个通过数学运算组合成最终描述符。为什么不用纯神经网络因为神经网络给出的是权重矩阵你没法从中读出一个像“容忍因子 (rA rO) / (√2(rB rO))”这样简洁的物理公式。而 SISSO 输出的描述符可以直接写成解析表达式审稿人认实验组也认。常见做法是先用随机森林或梯度提升树做特征重要性排序把原始特征从几百维降到几十维再喂给 SISSO 做符号组合搜索。这样既控制了计算量又保留了物理可解释性。具体到钙钛矿稳定性预测输入特征通常包括A 位、B 位、X 位离子的半径、电负性、电离能、氧化态、离子极化率以及晶格常数、容忍因子、八面体因子等衍生量。输出标签一般是形成能formation energy或凸包能量energy above hull前者低于零表示热力学稳定后者越接近零越稳定。2.2 用 Python 搭建 SISSO 特征工程与训练流水线下面这段代码展示从原始离子数据构建特征矩阵、调用 SISSO 回归器、输出候选描述符的完整流程。SISSO 的 Python 接口常见的有sissopp包也有课题组自己维护的版本这里用通用接口示意。import numpy as np import pandas as pd from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sissopp import SISSORegressor # 假设已安装 SISSO Python 接口 # 1. 加载钙钛矿数据集每行是一个材料列是离子特征和稳定性标签 df pd.read_csv(perovskite_dataset.csv) feature_cols [r_A, r_B, r_X, chi_A, chi_B, chi_X, IE_A, IE_B, polar_A, polar_B, lattice_a] target_col energy_above_hull # 目标量凸包以上能量越接近0越稳定 X df[feature_cols].values y df[target_col].values # 2. 用随机森林做初步特征筛选保留重要性前15的特征 rf RandomForestRegressor(n_estimators500, random_state42) rf.fit(X, y) importances rf.feature_importances_ idx_sorted np.argsort(importances)[::-1] top_k 15 selected_cols [feature_cols[i] for i in idx_sorted[:top_k]] X_sel df[selected_cols].values # 3. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_sel, y, test_size0.2, random_state42 ) # 4. 配置 SISSO设置最大组合深度为3允许,-,*,/运算 sisso SISSORegressor( n_features3, # 最终描述符包含的特征数 max_dim3, # 符号组合的最大复杂度 ops[, -, *, /], n_candidates1000, # 筛选阶段保留的候选特征数 n_sis200, # 独立性筛选后保留的特征数 random_state42 ) # 5. 训练模型 sisso.fit(X_train, y_train) # 6. 输出找到的描述符表达式和性能 print(SISSO 描述符表达式, sisso.get_expression()) print(训练集 R², sisso.score(X_train, y_train)) print(测试集 R², sisso.score(X_test, y_test))逻辑说明第一步加载数据特征列覆盖了离子半径、电负性、电离能、极化率和晶格常数这些是钙钛矿稳定性最相关的物理量。第二步用随机森林做初筛目的是降低 SISSO 的搜索空间——如果直接把几百维特征丢进去SISSO 的候选特征组合会爆炸跑一天也出不来结果。第三步划分数据集注意这里用的是随机划分如果数据有明显组分聚集建议改用按 A 位元素分层的划分方式。第四步配置 SISSO 参数n_features3表示最终描述符由三个基特征组合而成max_dim3控制组合复杂度ops指定允许的数学运算。第五步训练第六步输出表达式和 R²。参数怎么调n_features一般从 2 开始试如果 R² 不够再加到 3 或 4但超过 4 之后可解释性急剧下降。max_dim建议不超过 3否则会出现类似(r_A * chi_B) / (r_B IE_A)这种物理意义模糊的项。n_sis控制筛选后保留的特征数太小会漏掉好特征太大会拖慢搜索200 到 500 之间比较稳妥。2.3 新型容许因子的构建与物理验证SISSO 跑完之后你会得到一个类似这样的表达式τ_new (r_A r_X) / (r_B * chi_B) polar_A / IE_A这个式子就是所谓的“新型容许因子”。但它不能直接拿来用必须做三步验证。第一步检查量纲一致性——如果左边是无量纲的稳定性指标右边也必须无量纲否则说明组合方式有问题。第二步画描述符与目标量的散点图看是否单调相关如果出现明显的分段或聚集说明描述符只对某一类钙钛矿有效。第三步用 DFT 重新计算一批 SISSO 预测稳定但训练集中未出现的材料验证预测的假阳性率。我一般会保留至少两个候选描述符做交叉验证一个简洁的2 到 3 个特征一个稍复杂的4 个特征。如果两者在测试集上 R² 差距小于 0.05优先选简洁的那个因为简洁描述符在迁移到新体系时更鲁棒。3. 数据准备与特征工程钙钛矿数据集怎么建、怎么洗3.1 数据来源与标签选择形成能还是凸包能量钙钛矿稳定性预测的标签选择直接决定模型能学到什么。常见的有三种形成能formation energy、凸包以上能量energy above hull、以及分解能decomposition energy。形成能是相对于纯元素参考态的负值表示化合物在热力学上有利凸包以上能量是相对于所有竞争相的最低能量等于零表示该材料在凸包上最稳定分解能是相对于最可能分解产物的能量差。推荐用凸包以上能量作为主标签原因是它直接对应“这个材料能不能合成出来”这个实际问题。形成能虽然计算简单但一个形成能为负的材料可能仍然会分解成更稳定的竞争相。凸包以上能量的数据可以从 Materials Project 批量导出也可以用 DFT 自己算。注意不同泛函PBE、PBEsol、HSE06算出来的凸包能量差异可能达到 0.1 eV/atom 量级所以训练集和测试集必须用同一套泛函不能混用。3.2 特征清洗处理缺失值、共线性和量纲统一钙钛矿数据集的特征清洗有三个高频坑。第一离子半径的取值依赖配位数和氧化态比如 Fe²⁺ 和 Fe³⁺ 的半径差很多如果数据里不区分氧化态模型会学乱。第二电负性和电离能之间存在强共线性相关系数可能超过 0.9直接丢进 SISSO 会导致筛选阶段反复选中同一类特征。第三不同特征的量纲差异巨大半径是 Å 量级电离能是 eV 量级不做标准化的话数值大的特征会主导距离计算。处理方式氧化态必须作为独立特征列显式标注共线性特征用方差膨胀因子VIF筛选VIF 大于 10 的成对特征只保留物理意义更明确的那个标准化用 Z-score但注意 SISSO 的符号回归对标准化后的特征做组合时表达式里的系数会变最终报告描述符时要还原到原始量纲。from statsmodels.stats.outliers_influence import variance_inflation_factor from sklearn.preprocessing import StandardScaler # 检查共线性 vif_data pd.DataFrame() vif_data[feature] selected_cols vif_data[VIF] [variance_inflation_factor(X_sel, i) for i in range(X_sel.shape[1])] # 剔除 VIF 10 的特征 cols_to_keep vif_data[vif_data[VIF] 10][feature].tolist() X_clean df[cols_to_keep].values # 标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X_clean)这段代码先算 VIF把共线性严重的特征剔掉再做 Z-score 标准化。注意variance_inflation_factor要求输入是 numpy 数组且不能有常数列否则会报错。标准化后的数据喂给 SISSO最终得到的描述符表达式里的系数是针对标准化数据的如果要写成物理公式需要用scaler.mean_和scaler.scale_反变换回去。4. 避坑与排查钙钛矿稳定性预测里最容易翻车的五个地方4.1 现象SISSO 跑出来的描述符 R² 很高但 DFT 验证全错原因训练集和测试集之间存在数据泄漏。最常见的情况是同一化学组分的不同晶格常数被随机分到了训练集和测试集模型实际上在记忆组分而不是学物理。另一个可能是标签用了形成能而测试集里的材料形成能虽然负但凸包能量为正模型学到的“稳定”和实际可合成性不是一回事。解决按化学组分做分组划分同一组分的所有样本必须全在训练集或全在测试集。标签统一用凸包以上能量。如果数据量够再做一次按 A 位元素分层的交叉验证。4.2 现象描述符里出现离子半径的倒数或平方项物理上讲不通原因SISSO 的运算符集合里包含了除法和乘法当特征维度较高时算法会尝试各种组合有时会凑出数学上拟合好但物理上无意义的项。比如1/r_A²这种项虽然能提升 R²但你没法解释为什么半径的平方倒数会跟稳定性相关。解决限制运算符集合只保留、-、*去掉/。或者在 SISSO 配置里加约束要求每个特征在描述符中最多出现一次。另一个办法是后筛选跑出多个候选描述符后人工检查每一项的物理意义丢掉讲不通的。4.3 现象训练集 R² 0.95测试集 R² 0.6差距巨大原因过拟合。SISSO 虽然比神经网络简单但如果n_features设得太大比如 5 以上或者n_candidates设得过高模型仍然会过拟合。另一个常见原因是训练集太小钙钛矿稳定性数据集通常只有几百到几千条如果特征维度接近样本数过拟合几乎不可避免。解决把n_features控制在 2 到 3n_candidates不超过 2000。如果数据少于 500 条先用随机森林做特征选择把输入维度降到 10 以下再喂给 SISSO。还可以加 L1 正则化但 SISSO 本身的 L0 正则已经比较强了通常不需要额外加。4.4 现象新型容许因子在卤化物上表现好在氧化物上完全失效原因卤化物钙钛矿的稳定性主要由 A 位离子大小和 B-X 键共价性决定而氧化物钙钛矿还涉及 B 位离子的 d 电子构型和 Jahn-Teller 畸变。如果训练集里氧化物样本太少SISSO 学到的描述符自然偏向卤化物。解决分体系建模。卤化物和氧化物各训一个 SISSO 模型或者把“体系类型”作为一个二元特征加进去让 SISSO 自己决定是否要分叉。如果非要统一模型训练集里氧化物和卤化物的比例至少要到 1:3否则氧化物那边就是欠拟合。4.5 现象SISSO 训练时间超过 24 小时还没出结果原因候选特征空间太大。如果你把原始特征和所有二阶组合都丢进去候选特征数可能上万SISSO 的独立性筛选阶段会非常慢。另一个原因是n_sis设得太大比如设到 1000 以上稀疏化算子阶段的组合搜索会指数级膨胀。解决先做特征预筛用随机森林或互信息把特征降到 20 维以内。n_sis控制在 200 到 500。如果还是慢把max_dim从 3 降到 2先跑出一个粗略描述符再在它附近做局部搜索。5. 进阶技巧用 SHAP 验证描述符的物理合理性并做主动学习SISSO 给出描述符之后怎么确认它真的学到了物理而不是噪声我一般用 SHAPSHapley Additive exPlanations做两件事第一看每个基特征对最终预测的贡献是否单调如果某个特征的 SHAP 值随特征值增大先升后降再升说明描述符里存在高阶交互项物理上可能有问题第二对比 SISSO 描述符和传统 Goldschmidt 因子的 SHAP 分布如果两者高度相似说明 SISSO 没学到新东西只是换了个形式。import shap from sklearn.ensemble import GradientBoostingRegressor # 用 SISSO 找到的描述符作为输入训练一个代理模型 # 假设 sisso_expr 是 SISSO 输出的描述符值 X_descriptor sisso.transform(X_sel) # 形状 (n_samples, n_features) proxy GradientBoostingRegressor(n_estimators300, random_state42) proxy.fit(X_descriptor, y) # 计算 SHAP 值 explainer shap.Explainer(proxy, X_descriptor) shap_values explainer(X_descriptor) # 画摘要图看每个描述符特征的贡献分布 shap.summary_plot(shap_values, X_descriptor, feature_namessisso.get_feature_names())这段代码用 SISSO 描述符作为输入训练一个梯度提升树代理模型再用 SHAP 解释。注意代理模型的 R² 应该和 SISSO 本身接近如果差太多说明描述符和代理模型之间的映射不稳定。SHAP 摘要图里每个点是一个样本横轴是 SHAP 值对预测的贡献纵轴是特征值大小。如果某个特征的 SHAP 值随特征值增大而单调增大说明这个特征对稳定性的影响是单调的物理上合理如果出现明显的非单调模式就要回头检查描述符表达式里是不是有除法或高阶项。主动学习是另一个值得投入的方向。具体做法用当前 SISSO 模型预测一批未标注材料的稳定性挑出预测不确定性最大的那 20 到 50 个用 DFT 算它们的凸包能量加入训练集重新训练 SISSO。这样迭代三轮左右通常能把测试集 R² 从 0.85 推到 0.92 以上而 DFT 计算量只增加不到 20%。我自己的习惯是每轮主动学习后重新检查一遍描述符表达式如果表达式结构发生大改说明模型还在探索阶段如果只是系数微调说明已经接近收敛。最后说一个血泪教训SISSO 跑出来的描述符一定要拿去做 DFT 验证不要直接写进论文。我见过太多人把 SISSO 表达式当最终结论结果审稿人一问“这个描述符预测的新材料有没有合成验证”就哑了。花两周算一批验证材料比事后补算省心得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表