name: molfeat description: “用于机器学习的分子特征化(100+特征化器)。ECFP、MACCS、描述符、预训练模型(ChemBERTa),将SMILES转换为特征,用于QSAR和分子ML。”
Molfeat - 分子特征化中心
概述
Molfeat是一个全面的Python库,用于分子特征化,统一了100多个预训练嵌入和手工制作的特征化器。将化学结构(SMILES字符串或RDKit分子)转换为数值表示,用于机器学习任务,包括QSAR建模、虚拟筛选、相似性搜索和深度学习应用。具有快速并行处理、scikit-learn兼容的转换器和内置缓存功能。
何时使用此技能
此技能应用于以下情况:
- 分子机器学习:构建QSAR/QSPR模型,属性预测
- 虚拟筛选:对化合物库进行生物活性排序
- 相似性搜索:寻找结构相似的分子
- 化学空间分析:聚类、可视化、降维
- 深度学习:在分子数据上训练神经网络
- 特征化管道:将SMILES转换为ML就绪的表示
- 化学信息学:任何需要分子特征提取的任务
安装
# 推荐:使用conda/mamba
mamba install -c conda-forge molfeat
# 替代:使用pip
pip install molfeat
# 安装所有可选依赖
pip install "molfeat[all]"
可选依赖用于特定特征化器:
molfeat[dgl]- GNN模型(GIN变体)molfeat[graphormer]- Graphormer模型molfeat[transformer]- ChemBERTa、ChemGPT、MolT5molfeat[fcd]- FCD描述符molfeat[map4]- MAP4指纹
核心概念
Molfeat将特征化组织为三个层次类:
1. 计算器(molfeat.calc)
可调用对象,将单个分子转换为特征向量。接受RDKit Chem.Mol对象或SMILES字符串。
使用计算器用于:
- 单分子特征化
- 自定义处理循环
- 直接特征计算
示例:
from molfeat.calc import FPCalculator
calc = FPCalculator("ecfp", radius=3, fpSize=2048)
features = calc("CCO") # 返回numpy数组 (2048,)
2. 转换器(molfeat.trans)
Scikit-learn兼容的转换器,包装计算器进行批量处理并支持并行化。
使用转换器用于:
- 分子数据集的批量特征化
- 与scikit-learn管道的集成
- 并行处理(自动CPU利用)
示例:
from molfeat.trans import MoleculeTransformer
from molfeat.calc import FPCalculator
transformer = MoleculeTransformer(FPCalculator("ecfp"), n_jobs=-1)
features = transformer(smiles_list) # 并行处理
3. 预训练转换器(molfeat.trans.pretrained)
专用转换器,用于深度学习模型,支持批量推理和缓存。
使用预训练转换器用于:
- 最先进的分子嵌入
- 从大型化学数据集的迁移学习
- 深度学习特征提取
示例:
from molfeat.trans.pretrained import PretrainedMolTransformer
transformer = PretrainedMolTransformer("ChemBERTa-77M-MLM", n_jobs=-1)
embeddings = transformer(smiles_list) # 深度学习嵌入
快速入门工作流程
基本特征化
import datamol as dm
from molfeat.calc import FPCalculator
from molfeat.trans import MoleculeTransformer
# 加载分子数据
smiles = ["CCO", "CC(=O)O", "c1ccccc1", "CC(C)O"]
# 创建计算器和转换器
calc = FPCalculator("ecfp", radius=3)
transformer = MoleculeTransformer(calc, n_jobs=-1)
# 特征化分子
features = transformer(smiles)
print(f"Shape: {features.shape}") # (4, 2048)
保存和加载配置
# 保存特征化器配置以确保可重复性
transformer.to_state_yaml_file("featurizer_config.yml")
# 重新加载确切配置
loaded = MoleculeTransformer.from_state_yaml_file("featurizer_config.yml")
优雅处理错误
# 处理可能包含无效SMILES的数据集
transformer = MoleculeTransformer(
calc,
n_jobs=-1,
ignore_errors=True, # 在失败时继续
verbose=True # 记录错误详情
)
features = transformer(smiles_with_errors)
# 对失败的分子返回None
选择合适的特征化器
用于传统机器学习(RF、SVM、XGBoost)
从指纹开始:
# ECFP - 最流行,通用
FPCalculator("ecfp", radius=3, fpSize=2048)
# MACCS - 快速,适合骨架跳跃
FPCalculator("maccs")
# MAP4 - 高效,适用于大规模筛选
FPCalculator("map4")
用于可解释模型:
# RDKit 2D描述符(200+命名属性)
from molfeat.calc import RDKitDescriptors2D
RDKitDescriptors2D()
# Mordred(1800+全面描述符)
from molfeat.calc import MordredDescriptors
MordredDescriptors()
组合多个特征化器:
from molfeat.trans import FeatConcat
concat = FeatConcat([
FPCalculator("maccs"), # 167维
FPCalculator("ecfp") # 2048维
]) # 结果:2215维组合特征
用于深度学习
基于Transformer的嵌入:
# ChemBERTa - 在7700万PubChem化合物上预训练
PretrainedMolTransformer("ChemBERTa-77M-MLM")
# ChemGPT - 自回归语言模型
PretrainedMolTransformer("ChemGPT-1.2B")
图神经网络:
# GIN模型,具有不同预训练目标
PretrainedMolTransformer("gin-supervised-masking")
PretrainedMolTransformer("gin-supervised-infomax")
# Graphormer用于量子化学
PretrainedMolTransformer("Graphormer-pcqm4mv2")
用于相似性搜索
# ECFP - 通用,最广泛使用
FPCalculator("ecfp")
# MACCS - 快速,基于骨架的相似性
FPCalculator("maccs")
# MAP4 - 高效,适用于大型数据库
FPCalculator("map4")
# USR/USRCAT - 3D形状相似性
from molfeat.calc import USRDescriptors
USRDescriptors()
用于药效团方法
# FCFP - 基于功能基团
FPCalculator("fcfp")
# CATS - 药效团对分布
from molfeat.calc import CATSCalculator
CATSCalculator(mode="2D")
# Gobbi - 显式药效团特征
FPCalculator("gobbi2D")
常见工作流程
构建QSAR模型
from molfeat.trans import MoleculeTransformer
from molfeat.calc import FPCalculator
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
# 特征化分子
transformer = MoleculeTransformer(FPCalculator("ecfp"), n_jobs=-1)
X = transformer(smiles_train)
# 训练模型
model = RandomForestRegressor(n_estimators=100)
scores = cross_val_score(model, X, y_train, cv=5)
print(f"R² = {scores.mean():.3f}")
# 保存配置用于部署
transformer.to_state_yaml_file("production_featurizer.yml")
虚拟筛选管道
from sklearn.ensemble import RandomForestClassifier
# 在已知活性/非活性上训练
transformer = MoleculeTransformer(FPCalculator("ecfp"), n_jobs=-1)
X_train = transformer(train_smiles)
clf = RandomForestClassifier(n_estimators=500)
clf.fit(X_train, train_labels)
# 筛选大型库
X_screen = transformer(screening_library) # 例如,100万化合物
predictions = clf.predict_proba(X_screen)[:, 1]
# 排名并选择顶级命中
top_indices = predictions.argsort()[::-1][:1000]
top_hits = [screening_library[i] for i in top_indices]
相似性搜索
from sklearn.metrics.pairwise import cosine_similarity
# 查询分子
calc = FPCalculator("ecfp")
query_fp = calc(query_smiles).reshape(1, -1)
# 数据库指纹
transformer = MoleculeTransformer(calc, n_jobs=-1)
database_fps = transformer(database_smiles)
# 计算相似性
similarities = cosine_similarity(query_fp, database_fps)[0]
top_similar = similarities.argsort()[-10:][::-1]
Scikit-learn管道集成
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
# 创建端到端管道
pipeline = Pipeline([
('featurizer', MoleculeTransformer(FPCalculator("ecfp"), n_jobs=-1)),
('classifier', RandomForestClassifier(n_estimators=100))
])
# 直接在SMILES上训练和预测
pipeline.fit(smiles_train, y_train)
predictions = pipeline.predict(smiles_test)
比较多个特征化器
featurizers = {
'ECFP': FPCalculator("ecfp"),
'MACCS': FPCalculator("maccs"),
'Descriptors': RDKitDescriptors2D(),
'ChemBERTa': PretrainedMolTransformer("ChemBERTa-77M-MLM")
}
results = {}
for name, feat in featurizers.items():
transformer = MoleculeTransformer(feat, n_jobs=-1)
X = transformer(smiles)
# 用您的ML模型评估
score = evaluate_model(X, y)
results[name] = score
发现可用特征化器
使用ModelStore探索所有可用特征化器:
from molfeat.store.modelstore import ModelStore
store = ModelStore()
# 列出所有可用模型
all_models = store.available_models
print(f"总特征化器数: {len(all_models)}")
# 搜索特定模型
chemberta_models = store.search(name="ChemBERTa")
for model in chemberta_models:
print(f"- {model.name}: {model.description}")
# 获取使用信息
model_card = store.search(name="ChemBERTa-77M-MLM")[0]
model_card.usage() # 显示使用示例
# 加载模型
transformer = store.load("ChemBERTa-77M-MLM")
高级功能
自定义预处理
class CustomTransformer(MoleculeTransformer):
def preprocess(self, mol):
"""自定义预处理管道"""
if isinstance(mol, str):
mol = dm.to_mol(mol)
mol = dm.standardize_mol(mol)
mol = dm.remove_salts(mol)
return mol
transformer = CustomTransformer(FPCalculator("ecfp"), n_jobs=-1)
批量处理大型数据集
def featurize_in_chunks(smiles_list, transformer, chunk_size=10000):
"""分块处理大型数据集以管理内存"""
all_features = []
for i in range(0, len(smiles_list), chunk_size):
chunk = smiles_list[i:i+chunk_size]
features = transformer(chunk)
all_features.append(features)
return np.vstack(all_features)
缓存昂贵嵌入
import pickle
cache_file = "embeddings_cache.pkl"
transformer = PretrainedMolTransformer("ChemBERTa-77M-MLM", n_jobs=-1)
try:
with open(cache_file, "rb") as f:
embeddings = pickle.load(f)
except FileNotFoundError:
embeddings = transformer(smiles_list)
with open(cache_file, "wb") as f:
pickle.dump(embeddings, f)
性能提示
- 使用并行化:设置
n_jobs=-1以利用所有CPU核心 - 批量处理:一次处理多个分子而非循环
- 选择合适的特征化器:指纹比深度学习模型更快
- 缓存预训练模型:利用内置缓存进行重复使用
- 使用float32:当精度允许时设置
dtype=np.float32 - 高效处理错误:使用
ignore_errors=True处理大型数据集
常见特征化器参考
常用特征化器快速参考:
| 特征化器 | 类型 | 维度 | 速度 | 使用案例 |
|---|---|---|---|---|
ecfp |
指纹 | 2048 | 快 | 通用 |
maccs |
指纹 | 167 | 非常快 | 骨架相似性 |
desc2D |
描述符 | 200+ | 快 | 可解释模型 |
mordred |
描述符 | 1800+ | 中 | 全面特征 |
map4 |
指纹 | 1024 | 快 | 大规模筛选 |
ChemBERTa-77M-MLM |
深度学习 | 768 | 慢* | 迁移学习 |
gin-supervised-masking |
GNN | 可变 | 慢* | 基于图的模型 |
*首次运行慢;后续运行受益于缓存
资源
此技能包括全面参考文档:
references/api_reference.md
完整API文档覆盖:
molfeat.calc- 所有计算器类和参数molfeat.trans- 转换器类和方法molfeat.store- ModelStore使用- 常见模式和集成示例
- 性能优化提示
何时加载: 在实现特定计算器、理解转换器参数或与scikit-learn/PyTorch集成时参考。
references/available_featurizers.md
所有100+特征化器的全面目录,按类别组织:
- 基于Transformer的语言模型(ChemBERTa、ChemGPT)
- 图神经网络(GIN、Graphormer)
- 分子描述符(RDKit、Mordred)
- 指纹(ECFP、MACCS、MAP4及其他15+)
- 药效团描述符(CATS、Gobbi)
- 形状描述符(USR、ElectroShape)
- 基于骨架的描述符
何时加载: 在为特定任务选择最佳特征化器、探索可用选项或理解特征化器特性时参考。
搜索提示: 使用grep查找特定特征化器类型:
grep -i "chembert" references/available_featurizers.md
grep -i "pharmacophore" references/available_featurizers.md
references/examples.md
常见场景的实用代码示例:
- 安装和快速入门
- 计算器和转换器示例
- 预训练模型使用
- Scikit-learn和PyTorch集成
- 虚拟筛选工作流程
- QSAR模型构建
- 相似性搜索
- 故障排除和最佳实践
何时加载: 在实现特定工作流程、故障排除或学习molfeat模式时参考。
故障排除
无效分子
启用错误处理以跳过无效SMILES:
transformer = MoleculeTransformer(
calc,
ignore_errors=True,
verbose=True
)
大型数据集内存问题
处理超过10万分子的数据集时,分块处理或使用流式方法。
预训练模型依赖
某些模型需要额外包。安装特定扩展:
pip install "molfeat[transformer]" # 用于ChemBERTa/ChemGPT
pip install "molfeat[dgl]" # 用于GIN模型
可重复性
保存确切配置并记录版本:
transformer.to_state_yaml_file("config.yml")
import molfeat
print(f"molfeat版本: {molfeat.__version__}")