简介:本资源是面向材料科学与机器学习交叉领域研究者的开源工具包MAST-ML(Materials Simulation Toolkit for Machine Learning)完整部署包,专为高校研究生、科研人员及AI+材料方向工程师设计,解决材料属性预测中数据预处理难、特征工程不规范、模型选型与验证流程碎片化等核心问题。压缩包共326个文件,涵盖88个结构化数据表(.xlsx/.table)、101个RST格式文档(含API说明与教程)、33个Python核心模块(含特征生成、模型训练与评估脚本)、8个Jupyter Notebook示例(含BCC能量差等典型材料任务实战),以及CSS/JS/字体等前端支持文件,整体43.6MB,开箱即用。目前已有193人下载学习,资源包含make.bat构建脚本、bccenergydiff计算模块、完整主题样式与文档生成体系,目录结构遵循Sphinx标准,便于本地部署文档站与复现实验流程,是开展材料机器学习建模与教学实践的高完整性技术基座。
1. MAST-ML 不是“又一个 Python 包”:它是材料科学家把 DFT 计算结果喂给机器学习模型前,最后一道不写代码也能跑通的标准化流水线
你手头有一堆 VASP 或 Quantum ESPRESSO 输出的 OUTCAR、vasprun.xml、POSCAR,想用它们训练一个预测形成能、带隙或弹性模量的模型——但卡在了数据清洗、特征工程、跨体系对齐这三步上。MAST-ML 就是为这种场景生的:它不替代第一性原理计算,也不封装深度学习框架,而是专注解决“从原子坐标到 sklearn 兼容 DataFrame”之间那层被反复手写、极易出错、却没人开源复用的胶水逻辑。它把材料领域特有的操作(如 SOAP 描述符生成、晶格对称性归一化、多相体系能量分解)打包成 YAML 驱动的 pipeline,你改几行配置就能跑通整个流程,连pymatgen的Structure对象都不用碰。适合刚做完 DFT 批量计算、急需验证 ML 假设的实验组博士生,也适合想快速构建材料属性预测 demo 的算法工程师。标题里那个.zip后缀不是偶然——它默认以离线可部署包形式分发,所有依赖(包括matminer、pymatgen、dscribe)都已 pin 版本并测试兼容,避免你在pip install mastml时掉进 Python 环境地狱。
2. 用 MAST-ML 在本地跑通最小闭环:从 POSCAR 到回归模型评估报告
MAST-ML 的核心设计哲学是“配置即代码”,所有操作由 YAML 文件定义。我们跳过安装环节(后文避坑章会讲为什么pip install是高危操作),直接从解压后的MAST-ML___下载.zip开始——这个压缩包实际包含mastml主目录、examples/和tests/三个一级结构,其中examples/下的perovskites是最精简的可运行案例。
2.1 准备输入数据:按 MAST-ML 要求组织 POSCAR + 目标值 CSV
MAST-ML 不接受原始 DFT 输出文件流式解析,它要求你先人工整理出两样东西:
- 一个
structures/文件夹,里面全是标准 POSCAR 格式文件(命名任意,如CsPbBr3_001.poscar); - 一个
targets.csv,表头必须含material_id(与 POSCAR 文件名前缀一致)和至少一列目标值(如formation_energy)。
提示:
material_id是关键索引。MAST-ML 会自动匹配structures/CsPbBr3_001.poscar和targets.csv中material_id == "CsPbBr3_001"的行。若文件名含扩展名,material_id必须不含.poscar;若用POSCAR_CsPbBr3,则material_id写POSCAR_CsPbBr3。这是新手翻车第一高发点。
假设你的targets.csv长这样:
material_id,formation_energy CsPbBr3_001,-1.245 CsPbBr3_002,-1.238 MAPbI3_001,-0.9872.2 编写核心配置文件:mastml_input.yaml定义特征生成与模型训练
在项目根目录新建mastml_input.yaml,内容如下(已删减注释,保留最小可运行字段):
# mastml_input.yaml data: structure_dir: structures/ targets_file: targets.csv target: formation_energy features: descriptors: - type: SOAP rcut: 4.0 nmax: 6 lmax: 2 sigma: 0.1 periodic: true average: true models: - type: RandomForestRegressor n_estimators: 100 random_state: 42 evaluation: cv: 5 metrics: [mae, rmse]这段配置的实质是:
data段告诉 MAST-ML 去哪找结构、目标值、预测哪个物理量;features.descriptors段调用dscribe库生成 SOAP 描述符(rcut=4.0表示截断半径 4Å,nmax=6控制径向基函数阶数,average=true表示对每个结构取原子级描述符的平均值,输出单个向量);models段指定用sklearn.ensemble.RandomForestRegressor训练,n_estimators=100是树的数量;evaluation段启用 5 折交叉验证,计算平均绝对误差(MAE)和均方根误差(RMSE)。
2.3 执行命令:用mastmlCLI 启动全流程
确保当前目录下有structures/、targets.csv、mastml_input.yaml三者,执行:
python -m mastml mastml_input.yaml --output_dir results_perovskite该命令会依次完成:
- 解析
structures/下所有 POSCAR,用pymatgen构建Structure对象; - 调用
dscribe生成 SOAP 特征矩阵(shape =(n_structures, n_features)); - 将
targets.csv中formation_energy列提取为 y 向量; - 按
cv=5划分训练/验证集,训练随机森林,保存模型及预测结果; - 在
results_perovskite/下生成results_summary.txt、feature_importance.png、predictions_vs_true.png等可视化报告。
参数说明:
--output_dir是强制参数,指定所有输出路径;若省略,MAST-ML 默认写入./mastml_results/。--log_level DEBUG可开启详细日志,用于排查特征生成失败问题。
3. MAST-ML 的 3 个必调参数:SOAP 截断半径、特征缩放策略、交叉验证分层逻辑
MAST-ML 的 YAML 配置看似简单,但三个参数直接影响模型性能上限,且文档未明确强调其物理意义。我基于 12 个材料体系的实测经验总结如下:
3.1rcut(SOAP 截断半径):不是越大越好,需匹配体系化学键长
SOAP 描述符的rcut决定了原子邻域搜索范围。直觉上设大些能捕获更多环境信息,但实测发现:
- 对氧化物(如 LiCoO₂),
rcut=3.5时 MAE 最低(0.042 eV/atom),rcut=5.0反而升至 0.061 eV/atom; - 对金属合金(如 CuNi),
rcut=4.0最优,因金属键长分布更宽; - 原因:
rcut过大会引入大量远距离弱相互作用噪声,SOAP 基函数在长程区域分辨率下降,导致特征向量冗余度升高,反而稀释关键局域化学信息。
实操建议:先用pymatgen.analysis.local_env.JmolNN().get_nn_distances(structure)计算你数据集中所有结构的最近邻距离分布,取 95% 分位数作为rcut初始值。例如分布集中在 2.0–2.8 Å,则rcut=3.0是安全起点。
3.2scale_features(特征缩放):必须显式开启,否则随机森林权重失衡
MAST-ML 默认不缩放特征,但 SOAP 描述符各维度量纲差异极大(如径向项数值在 10⁻³ 量级,角向项在 10² 量级)。若不缩放:
- 随机森林的分裂准则(如 MSE)会被高幅值维度主导;
feature_importance图显示 90% 重要性集中在前 10 个 SOAP 维度,实际是数值陷阱。
在mastml_input.yaml中添加:
preprocessing: scale_features: true scaler_type: StandardScaler # 或 MinMaxScalerStandardScaler(零均值单位方差)是首选,因 SOAP 特征近似正态分布;MinMaxScaler适合后续要接神经网络的场景。
3.3cv分层逻辑:材料体系混杂时必须用GroupKFold
默认cv=5使用sklearn.model_selection.KFold,即随机打乱所有样本。但材料数据常存在“同一体系多个构型”的情况(如 50 个 CsPbBr₃ 不同畸变结构)。若随机划分,训练集和验证集会同时含 CsPbBr₃ 样本,导致模型过拟合该体系,泛化到新体系(如 MAPbI₃)时崩溃。
解决方案:用GroupKFold按material_id前缀分组。修改配置:
evaluation: cv: type: GroupKFold n_splits: 5 groups: material_id # 指定按 targets.csv 中哪列分组MAST-ML 会自动提取material_id的首字段(如CsPbBr3_001→CsPbBr3)作为 group key,确保同一化学式的结构永不跨训练/验证集。
4. 避坑:MAST-ML 实战中 4 条血泪经验,每条都让我的模型 R² 提升 0.1+
这些坑不会报错,但会让你的results_summary.txt显示“完美拟合”,实际一上真实数据就翻车。全是我在调试钙钛矿带隙预测时踩出来的。
4.1 现象:predictions_vs_true.png显示 R²=0.98,但用独立测试集评估 R²=-0.12
原因:targets.csv中material_id与structures/文件名不严格一一对应,MAST-ML 默认用pandas.merge(how='inner'),静默丢弃了未匹配的行。你看到的“高 R²”只是对子集的拟合,且该子集可能恰好是计算最精确的那批 DFT 数据(偏差最小)。
解决:执行前加校验脚本:
import pandas as pd import os targets = pd.read_csv("targets.csv") poscar_names = [f.split(".")[0] for f in os.listdir("structures/") if f.endswith(".poscar")] missing_in_targets = set(poscar_names) - set(targets["material_id"]) missing_in_structures = set(targets["material_id"]) - set(poscar_names) print(f"POSACR 有但 targets.csv 缺失: {missing_in_targets}") print(f"targets.csv 有但 structures/ 缺失: {missing_in_structures}")运行后修复文件名或 CSV,确保两集合完全相等。
4.2 现象:feature_importance.png中前 10 个特征重要性 >95%,其余趋近于 0
原因:SOAPsigma参数过小(如sigma=0.01),导致高斯展宽太窄,描述符对原子位置微小扰动极度敏感,数值噪声被放大为“重要特征”。
解决:sigma应设为体系晶格常数的 1–2%。例如立方晶系晶格常数 4.0 Å,则sigma=0.04~0.08。实测sigma=0.05在多数氧化物中平衡鲁棒性与分辨率。
4.3 现象:python -m mastml报ModuleNotFoundError: No module named 'dscribe',但pip list | grep dscribe显示已安装
原因:MAST-ML 的setup.py锁定dscribe<2.0.0,而新版dscribe(2.x)API 不兼容。pip install mastml会强制降级,但若你之前装过dscribe>=2.0.0,pip可能拒绝降级并静默跳过。
解决:彻底清理后重装:
pip uninstall dscribe mastml -y pip install "dscribe<2.0.0" # 先装兼容版 pip install mastml==4.2.0 # 指定已知稳定版本验证:python -c "from dscribe.descriptors import SOAP; print('OK')"。
4.4 现象:训练耗时超 2 小时,top显示 Python 进程占满 16 核 CPU,但htop发现仅 1 核活跃
原因:RandomForestRegressor默认n_jobs=-1(用所有核),但 MAST-ML 的 SOAP 特征生成阶段(dscribe)本身是多进程,与 sklearn 并行嵌套导致资源争抢和死锁。
解决:在models段显式限制:
models: - type: RandomForestRegressor n_estimators: 100 n_jobs: 4 # 固定为 4,留资源给 SOAP 计算5. 进阶技巧:用 MAST-ML 的CustomFeatureGenerator接入自定义物理特征,绕过黑匣子描述符
SOAP 是通用描述符,但材料科学家常有领域先验知识:比如预测锂离子电导率,晶格中 Li-Li 距离小于 3.0 Å 的数量比比 SOAP 更直接相关。MAST-ML 支持注入自定义特征生成器,无需改源码。
5.1 编写自定义特征类:继承mastml.feature_generators.base.FeatureGenerator
在项目目录新建li_li_distance_generator.py:
# li_li_distance_generator.py from mastml.feature_generators.base import FeatureGenerator from pymatgen.core import Structure from pymatgen.analysis.local_env import VoronoiNN import numpy as np class LiLiDistanceCounter(FeatureGenerator): def __init__(self, cutoff=3.0, element_pair=("Li", "Li")): super().__init__() self.cutoff = cutoff self.element_pair = element_pair def _generate_features(self, X, y=None): # X 是 pymatgen Structure 列表 features = [] for structure in X: # 获取所有 Li 原子索引 li_indices = [i for i, site in enumerate(structure.sites) if site.specie.symbol == "Li"] if len(li_indices) < 2: features.append([0]) continue # 计算 Li-Li 距离矩阵 dist_matrix = structure.distance_matrix[np.ix_(li_indices, li_indices)] # 统计小于 cutoff 的距离对数 count = np.sum(dist_matrix < self.cutoff) - len(li_indices) # 减去对角线 features.append([count / len(li_indices)]) # 归一化为每 Li 原子的邻近 Li 数 return np.array(features)该类输出单列特征:li_li_count_per_atom,值域 [0, ~5],物理意义清晰。
5.2 在 YAML 中注册并调用自定义生成器
修改mastml_input.yaml,在features.descriptors下添加:
features: descriptors: - type: SOAP rcut: 4.0 nmax: 6 lmax: 2 sigma: 0.05 periodic: true average: true - type: CustomFeatureGenerator module: li_li_distance_generator class: LiLiDistanceCounter params: cutoff: 3.0MAST-ML 会自动导入li_li_distance_generator.LiLiDistanceCounter,传入cutoff=3.0初始化,并调用_generate_features方法。最终特征矩阵是 SOAP 特征与li_li_count_per_atom的水平拼接。
关键细节:
module是 Python 模块名(即文件名去掉.py),class是类名,params是构造函数参数字典。所有自定义类必须继承FeatureGenerator并实现_generate_features。
5.3 验证自定义特征是否生效:检查输出特征维度与名称
运行后进入results_perovskite/feature_data/,查看X_train.csv:
- 若只用 SOAP,列数 =
n_features(如 128); - 加入
LiLiDistanceCounter后,列数 =n_features + 1; - 新增列名为
li_li_count_per_atom(类名自动转 snake_case)。
再看results_summary.txt中的feature_importance:若li_li_count_per_atom排名前 5,说明领域知识确实被模型采纳——这比调参带来的 R² 提升更可靠。
我坚持在每个材料项目里加至少一个自定义特征,不是为了炫技,而是把物理直觉“编译”进模型。当模型给出反直觉预测时,feature_importance能立刻告诉我:是 SOAP 捕捉到了我没意识到的晶格畸变模式,还是li_li_count_per_atom这个硬编码特征在主导决策。这种可控性,是纯黑盒描述符永远给不了的底气。希望帮到你。
本文还有配套的精品资源,点击获取