探究
实验室
计算
公开
分子特征化(Featurization)
Machine Learning
化学信息学
Machine Learning化学信息学
zzh
更新于 2025-03-25
推荐镜像 :Basic Image:ubuntu22.04-py3.10-irkernel-r4.4.1
推荐机型 :c2_m4_cpu
赞 1
4
1. RDKit
2. Open Babel
3. Mol2Vec
4. ChemBERTa
5. GraphConv (TensorFlow Graph Neural Networks)
6. DeepChem (其它 Featurizers)
7. RDKit + TensorFlow / PyTorch(自定义深度学习模型)
RDKit
分子特征化
1. 分子指纹(Molecular Fingerprints)
RDKit 中的常见分子指纹类型:
示例代码(生成 Morgan Fingerprint):
示例代码(生成 MACCS Fingerprints):
2. 分子描述符(Molecular Descriptors)
常见的分子描述符:
示例代码(计算分子描述符):
3. 分子图(Molecular Graph)
示例代码(从 SMILES 创建分子图):
4. 从 SMILES 生成分子特征
示例代码(从 SMILES 转换分子并计算特征):
5. 分子图卷积和图神经网络
示例代码(生成分子图并与 GNN 一起使用):
6. RDKit 与其他工具的结合
示例代码(将 RDKit 特征输入到机器学习模型中):
DeepChem
Featurizers(特征化器) 概述
Featurizers 类别
Featurizers 的使用
API 中的一些特征化器
输入化合物的Smiles,进行相应的特征提取

  在化学和材料科学领域,分子特征化(Featurization) 是模型训练和预测的关键步骤。 用来完成分子特征化(Featurization)功能。以下是一些常见的工具和库,它们提供了不同类型的分子特征化器或可用于将化学数据转换为机器学习模型所需的特征:

1. RDKit

  • 简介:RDKit 是一个广泛使用的化学信息学工具包,提供了强大的分子特征化功能。它能够从分子结构生成多种类型的描述符和分子指纹。
  • 特征化器
    • 分子指纹(Fingerprints):如 Morgan FingerprintsMACCSDaylight
    • 分子描述符:例如分子的物理化学属性(分子量、LogP、极性表面面积等)。
    • 化学规则和 SMARTS:用于生成子结构指纹或查询。
  • 示例
    from rdkit import Chem
    from rdkit.Chem import AllChem
    
    # 从SMILES生成分子对象
    mol = Chem.MolFromSmiles("CCO")
    
    # 计算Morgan指纹
    fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)
    print(fp)
    

2. Open Babel

  • 简介:Open Babel 是一个化学工具包,可以用来转换分子结构文件格式并生成分子特征。Open Babel 提供了多种分子指纹和描述符。
  • 特征化器
    • 分子指纹:如 DaylightMACCSFingerprint
    • 分子描述符:包括化学成分、分子质量、极性等。
  • 示例
    import openbabel
    
    obConversion = openbabel.OBConversion()
    obConversion.SetInFormat("smi")  # SMILES 格式
    
    mol = openbabel.OBMol()
    obConversion.ReadString(mol, "CCO")
    
    # 计算分子指纹
    fingerprint = mol.GetFingerprint()
    print(fingerprint)
    

3. Mol2Vec

  • 简介:Mol2Vec 是一种基于分子2D结构的文本嵌入方法,可以将分子转换为固定长度的向量。这种方法借鉴了 Word2Vec 的思想,将分子表示为一个由多个子结构组成的向量。
  • 特征化器
    • 分子2D向量化:通过训练生成的分子子结构的嵌入向量表示分子。
  • 示例
    from mol2vec import mol2vec
    
    # 使用预训练的模型进行分子特征化
    vector = mol2vec.get_vecs([ "CCO" ], model_file="mol2vec_model")
    print(vector)
    

4. ChemBERTa

  • 简介:ChemBERTa 是一个基于 BERT(Bidirectional Encoder Representations from Transformers)模型的化学分子表示学习模型。它能够处理 SMILES 字符串并学习分子嵌入。
  • 特征化器
    • SMILES 到分子嵌入:利用预训练的 ChemBERTa 模型生成分子的嵌入表示。
  • 示例
    from transformers import AutoModel, AutoTokenizer
    
    model = AutoModel.from_pretrained("seyonec/ChemBERTa-zinc-base-v1")
    tokenizer = AutoTokenizer.from_pretrained("seyonec/ChemBERTa-zinc-base-v1")
    
    # SMILES 转换为分子嵌入
    inputs = tokenizer("CCO", return_tensors="pt")
    outputs = model(**inputs)
    print(outputs)
    

5. GraphConv (TensorFlow Graph Neural Networks)

  • 简介:GraphConv 是一种图神经网络(GNN),它直接处理图结构数据并生成特征。分子可以表示为图,其中原子是节点,化学键是边。
  • 特征化器
    • 分子图表示:利用图神经网络生成分子的嵌入表示。
  • 示例
    import tensorflow as tf
    import tensorflow_gnn as tfgnn
    
    # 假设你已经将分子转化为图表示(例如,使用 RDKit 转化为图)
    graph = tfgnn.GraphTensor.from_pieces(...)
    
    # 使用图神经网络进行特征化
    model = GraphConvModel()
    features = model(graph)
    print(features)
    

6. DeepChem (其它 Featurizers)

  • 简介:除了前面提到的 DeepChem,它还提供了许多其他类型的特征化器,尤其是在图神经网络领域。
  • 特征化器
    • Weave Featurizer:用于生成分子的图表示。
    • GraphConvFeaturizer:用于生成分子的图结构特征,适用于图卷积网络。
  • 示例
    import deepchem as dc
    
    # 使用 GraphConvFeaturizer
    featurizer = dc.feat.GraphConvFeaturizer()
    features = featurizer.featurize(["CCO", "CCOCC"])
    print(features)
    

7. RDKit + TensorFlow / PyTorch(自定义深度学习模型)

  • 简介:使用 RDKit 提取分子特征后,可以将这些特征输入到 TensorFlow 或 PyTorch 中进行进一步的处理和学习。
  • 特征化器
    • RDKit 分子描述符:计算分子量、LogP、极性表面面积等。
    • 深度学习模型:使用这些描述符训练深度学习模型。
  • 示例
    import rdkit
    from rdkit import Chem
    from rdkit.Chem import Descriptors
    import torch
    
    # 使用 RDKit 计算分子描述符
    mol = Chem.MolFromSmiles("CCO")
    molecular_weight = Descriptors.MolWt(mol)
    
    # 将分子描述符传递给 TensorFlow 或 PyTorch 模型
    model = torch.nn.Sequential(...)
    input_tensor = torch.tensor([molecular_weight])
    output = model(input_tensor)
    

根据具体的应用需求(如分子指纹、图神经网络、分子嵌入等),你可以选择不同的工具和方法来处理和生成分子特征。这些工具可以为机器学习任务提供不同类型的特征,以便更好地执行化学性质预测、药物筛选、分子生成等任务。

代码
文本
[ ]
! pip install rdkit torch
import rdkit
from rdkit import Chem
from rdkit.Chem import Descriptors
import torch

# 使用 RDKit 计算分子描述符
mol = Chem.MolFromSmiles("CCO")
molecular_weight = Descriptors.MolWt(mol)

# 将分子描述符传递给 TensorFlow 或 PyTorch 模型
model = torch.nn.Sequential(...)
input_tensor = torch.tensor([molecular_weight])
output = model(input_tensor)
代码
文本

RDKit

分子特征化

RDKit 是一个开源的化学信息学库,广泛用于分子表示、计算分子描述符、分子指纹生成、化学反应模拟等任务。RDKit 提供了多种功能来实现分子的特征化(Featurization),使其成为化学和药物发现领域中常用的工具。分子特征化是机器学习和深度学习任务的关键步骤之一,它将化学结构(如 SMILES 或分子图)转换为数值特征,可以用于后续的建模和分析。

1. 分子指纹(Molecular Fingerprints)

分子指纹是描述分子结构的二进制向量或整数向量。指纹捕捉了分子中的某些特定子结构信息,是分子特征化中最常用的一种方法。指纹通常用于分子相似性比较、聚类和检索等任务。

RDKit 中的常见分子指纹类型:

  • Morgan Fingerprint:基于分子的局部结构,常用于化学结构相似性搜索和分子聚类。
  • MACCS Fingerprints:基于一组标准的子结构规则生成的固定长度指纹,适用于分子筛选和比对。
  • Daylight Fingerprints:通过将分子拆解为特定大小的结构片段生成指纹,适用于分子特征的计算。
示例代码(生成 Morgan Fingerprint):
from rdkit import Chem
from rdkit.Chem import AllChem

# 创建一个分子对象
mol = Chem.MolFromSmiles("CCO")

# 生成 Morgan 指纹(以2048位二进制向量表示)
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)

# 输出指纹(转换为十进制数)
print(fp)
示例代码(生成 MACCS Fingerprints):
from rdkit import Chem
from rdkit.Chem import AllChem

# 创建一个分子对象
mol = Chem.MolFromSmiles("CCO")

# 生成 MACCS 指纹(以166位二进制向量表示)
fp = AllChem.GetMACCSKeysFingerprint(mol)

# 输出指纹(转换为十进制数)
print(fp)

2. 分子描述符(Molecular Descriptors)

分子描述符是一个描述分子物理化学性质的数值特征。它们通常基于分子结构的计算,提供了分子的一些关键属性,如分子量、极性表面面积、LogP 等。RDKit 提供了多种内置的分子描述符,可以根据需要选择合适的描述符。

常见的分子描述符:

  • 分子量(MolWt):分子的质量。
  • LogP(Octanol-water partition coefficient):表示分子在油和水中的溶解度差异。
  • 极性表面面积(TPSA):表示分子表面极性的程度。
  • 氢键供体(HDonorCount)和氢键受体(HAcceptorCount):分子内氢键供体和受体的数量。
  • 旋转键数(RotatableBondCount):分子中可旋转键的数量。
示例代码(计算分子描述符):
from rdkit import Chem
from rdkit.Chem import Descriptors

# 创建一个分子对象
mol = Chem.MolFromSmiles("CCO")

# 计算分子量
mol_weight = Descriptors.MolWt(mol)
print(f"Molecular weight: {mol_weight}")

# 计算LogP
logP = Descriptors.MolLogP(mol)
print(f"LogP: {logP}")

# 计算极性表面面积
tpsa = Descriptors.TPSA(mol)
print(f"Polar surface area: {tpsa}")

# 计算氢键供体数量
h_donor_count = Descriptors.HDonorCount(mol)
print(f"Hydrogen bond donor count: {h_donor_count}")

# 计算氢键受体数量
h_acceptor_count = Descriptors.HAcceptorCount(mol)
print(f"Hydrogen bond acceptor count: {h_acceptor_count}")

3. 分子图(Molecular Graph)

分子图是描述分子结构的一种图论表示方法,分子中的原子作为图中的节点,化学键作为边。使用图神经网络(GNN)进行分子特征化时,分子图是输入数据的主要形式。RDKit 允许将分子结构转化为图数据结构,以便进行进一步的图卷积操作。

示例代码(从 SMILES 创建分子图):

from rdkit import Chem
from rdkit.Chem import rdmolops

# 创建一个分子对象
mol = Chem.MolFromSmiles("CCO")

# 获取分子的邻接矩阵(图表示)
adj_matrix = rdmolops.GetAdjacencyMatrix(mol)

# 打印邻接矩阵
print(adj_matrix)

4. 从 SMILES 生成分子特征

通过 RDKit,我们可以轻松地将 SMILES 表示的分子转换为 RDKit 分子对象,并计算各种特征。SMILES(简化分子线性输入系统)是一种描述分子结构的字符串表示方式。RDKit 提供了将 SMILES 转换为分子对象的工具,并且可以计算分子描述符和生成分子指纹。

示例代码(从 SMILES 转换分子并计算特征):

from rdkit import Chem
from rdkit.Chem import Descriptors, AllChem

# 从 SMILES 字符串生成分子对象
smiles = "CCO"
mol = Chem.MolFromSmiles(smiles)

# 计算分子量
mol_weight = Descriptors.MolWt(mol)
print(f"Molecular weight: {mol_weight}")

# 生成 Morgan 指纹
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)
print(f"Morgan fingerprint: {fp}")

5. 分子图卷积和图神经网络

分子图卷积是一种基于图神经网络的深度学习方法,它通过图结构学习分子的特征。在 RDKit 中,分子图可以通过邻接矩阵表示,之后可以输入到图神经网络模型进行训练和预测。虽然 RDKit 本身不提供图卷积的实现,但它能有效地生成分子图和邻接矩阵,通常结合深度学习框架(如 TensorFlow 或 PyTorch)使用。

示例代码(生成分子图并与 GNN 一起使用):

import tensorflow as tf
import tensorflow_gnn as tfgnn
from rdkit import Chem
from rdkit.Chem import rdmolops

# 创建分子对象
mol = Chem.MolFromSmiles("CCO")

# 获取分子的邻接矩阵(图表示)
adj_matrix = rdmolops.GetAdjacencyMatrix(mol)

# 创建图数据结构
graph = tfgnn.GraphTensor.from_pieces(...)

# 使用图神经网络进行处理
model = tfgnn.GraphModel()
output = model(graph)
print(output)

6. RDKit 与其他工具的结合

RDKit 可以与多种其他机器学习工具和深度学习框架(如 scikit-learnTensorFlowPyTorch)结合使用。例如,我们可以使用 RDKit 生成分子指纹或描述符,然后将其输入到机器学习模型中进行训练和预测。

示例代码(将 RDKit 特征输入到机器学习模型中):

from sklearn.ensemble import RandomForestClassifier
from rdkit import Chem
from rdkit.Chem import AllChem

# 创建一个分子对象
mol = Chem.MolFromSmiles("CCO")

# 生成 Morgan 指纹
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)

# 将指纹转换为特征向量
features = list(fp)

# 构建简单的机器学习模型
model = RandomForestClassifier(n_estimators=100)
model.fit([features], [1])  # 假设目标标签为 1
print(model.predict([features]))

RDKit 提供了丰富的分子特征化工具,包括分子指纹、分子描述符、分子图等。通过 RDKit,用户可以轻松地将分子表示为适合机器学习和深度学习任务的特征。RDKit 与其他机器学习框架(如 scikit-learnTensorFlowPyTorch)结合使用,可以完成分子性质预测、药物发现、化学反应模拟等任务。

代码
文本

DeepChem

Featurizers(特征化器) 概述

详细介绍了 DeepChem 中各种用于将化学分子数据转换为机器学习模型所需特征的工具和方法。 https://deepchem.rehttps://deepchem.readthedocs.io/en/latest/api_reference/featurizers.htmladthedocs.io/en/latest/api_reference/featurizers.html

在化学和材料科学的机器学习研究中,常常需要将分子的结构信息转换为可以输入到模型中的数值特征。这些特征可以包括原子级别的属性、分子的整体形状、电子结构等。DeepChem 提供了一系列 Featurizers,帮助将这些分子信息转化为机器学习模型可以使用的特征。

Featurizers 类别

  1. 分子指纹(Molecular Fingerprints)

    • 分子指纹是用二进制位表示化学结构特征的常用方法。DeepChem 提供了几种常见的分子指纹特征化器:
      • CircularFingerprint:也叫 Morgan Fingerprints,通过将分子转化为一个大小固定的位向量来表示。
      • RDKit Fingerprints:基于 RDKit 的指纹,具有不同的位数(比如 1024 或 2048 位)。
  2. 分子图表示(Molecular Graph Representations)

    • 这些特征化器将分子表示为图结构,分子的原子和键是图的节点和边。DeepChem 提供了一些特征化器,用于将分子转化为图:
      • GraphConvFeaturizer:将分子转换为图表示,适用于图卷积(Graph Convolution)模型。
      • WeaveFeaturizer:用来构建“编织”网络的特征,类似图卷积方法,但更适合于处理特定类型的数据。
  3. 原子与分子描述符(Atomic and Molecular Descriptors)

    • 这些特征化器提取分子的一些原子级描述符,如电荷、半径、氢键等。它们用于描述分子或单个原子的不同属性。
      • AtomicDescriptors:计算分子中每个原子的描述符。
      • MolecularDescriptors:计算整个分子的描述符。
  4. 文本和 SMILES 转换(Text and SMILES to Features)

    • SMILES 字符串或其他文本形式的化学表达式转换为模型可用的数值特征。
      • SmilesToImageFeaturizer:将 SMILES 表达式转换为图像特征(例如,可以用于卷积神经网络)。
      • SmilesToFingerprintFeaturizer:将 SMILES 字符串转换为分子指纹。
  5. 分子生成器(Molecule Generators)

    • 这些是用于生成分子特征的工具,适用于生成式模型(如 GAN 或 VAE)。
      • MolGANFeaturizer:使用类似于生成对抗网络的算法来生成分子图和特征。

Featurizers 的使用

  • Featurizer 的基本操作

    • 每个 Featurizer 都有一个 featurize 方法,该方法接受分子输入(例如 SMILES 字符串或 RDKit 分子对象),并将其转换为特征数组。
    • 你可以选择合适的 Featurizer 来根据具体需求处理不同的分子数据,并输出特征。
  • 示例代码

    import deepchem as dc
    
    # 假设你有一些 SMILES 数据
    smiles = ['CCO', 'CCOCC', 'CCOCO']
    
    # 使用 Morgan Fingerprint Featurizer
    featurizer = dc.feat.CircularFingerprint(size=2048, radius=2)
    features = featurizer.featurize(smiles)
    
    # 打印特征
    print(features)
    

API 中的一些特征化器

  1. CircularFingerprint

    • 功能:计算分子的圆形(Morgan)指纹,广泛应用于化学数据分析。
    • 参数
      • size:指纹的长度(例如 1024 或 2048)。
      • radius:指纹的半径,控制生成指纹时考虑的邻近原子数目。
      • sparse:是否返回稀疏数组。
    • 返回:一个包含分子指纹的数组。
  2. WeaveFeaturizer

    • 功能:将分子转换为一个图,适用于图卷积网络(GCN)等图神经网络方法。
    • 参数
      • size:生成的特征大小。
  3. GraphConvFeaturizer

    • 功能:将分子转换为图表示,适合用于 Graph Convolution 网络。
    • 参数
      • graph:图的表示方式(原子、键等)。
  4. SmilesToImageFeaturizer

    • 功能:将 SMILES 字符串转换为图像,用于卷积神经网络(CNN)。
    • 参数
      • image_size:图像的大小。

DeepChem 的 Featurizers 提供了多种用于将化学分子数据转换为机器学习所需特征的工具。从简单的分子指纹到复杂的图表示和图像特征,DeepChem 可以帮助用户轻松地将化学数据处理成适合训练机器学习模型的格式。

这些 Featurizers 可以用于各种机器学习任务,如化学性质预测、分子生成、药物筛选等。用户可以根据具体问题选择最合适的 Featurizer。

代码
文本

输入化合物的Smiles,进行相应的特征提取

代码
文本
[5]
from rdkit import Chem
from rdkit.Chem import Descriptors
import pandas as pd
from IPython.display import display, HTML

# --- 可提取的特征列表与 RDKit 对应函数 ---
feature_functions = {
'MolWt': Descriptors.MolWt,
'MolLogP': Descriptors.MolLogP,
'NumHDonors': Descriptors.NumHDonors,
'NumHAcceptors': Descriptors.NumHAcceptors,
'TPSA': Descriptors.TPSA,
'NumRotatableBonds': Descriptors.NumRotatableBonds,
'RingCount': Descriptors.RingCount,
'HeavyAtomCount': Descriptors.HeavyAtomCount,
'NumValenceElectrons': Descriptors.NumValenceElectrons,
'FractionCSP3': Descriptors.FractionCSP3,
'ExactMolWt': Descriptors.ExactMolWt,
}

# --- 单个 SMILES 提取特征 ---
def get_features(smiles):
mol = Chem.MolFromSmiles(smiles)
if mol is None:
return {'SMILES': smiles, 'Error': 'Invalid SMILES'}
features = {'SMILES': smiles}
for name, func in feature_functions.items():
try:
features[name] = round(func(mol), 4)
except:
features[name] = 'Error'
return features

# --- 批量提取:从列表 ---
def extract_features_from_list(smiles_list):
df = pd.DataFrame([get_features(smi) for smi in smiles_list])
display(HTML(df.to_html(index=False))) # 显示结果表格
return df

# --- 批量提取:从 CSV 文件 ---
def extract_features_from_csv(input_csv, output_csv='output_features.csv'):
df = pd.read_csv(input_csv)
if 'SMILES' not in df.columns:
raise ValueError("CSV中缺少 'SMILES' 列")
features_df = extract_features_from_list(df['SMILES'].tolist())
features_df.to_csv(output_csv, index=False)
print(f"✅ 特征提取完成,已保存结果到:{output_csv}")
return features_df

代码
文本
[6]
# 从列表中提取并显示结果
smiles_list = ['CCO', 'CCC(=O)O', 'CC(C)O']
extract_features_from_list(smiles_list)

# 或者从 CSV 批量读取
# extract_features_from_csv('your_input.csv')

SMILES MolWt MolLogP NumHDonors NumHAcceptors TPSA NumRotatableBonds RingCount HeavyAtomCount NumValenceElectrons FractionCSP3 ExactMolWt
CCO 46.069 -0.0014 1 1 20.23 0 0 3 20 1.0000 46.0419
CCC(=O)O 74.079 0.4810 1 1 37.30 1 0 5 30 0.6667 74.0368
CC(C)O 60.096 0.3871 1 1 20.23 0 0 4 26 1.0000 60.0575
SMILES MolWt MolLogP NumHDonors NumHAcceptors TPSA NumRotatableBonds RingCount HeavyAtomCount NumValenceElectrons FractionCSP3 ExactMolWt
0 CCO 46.069 -0.0014 1 1 20.23 0 0 3 20 1.0000 46.0419
1 CCC(=O)O 74.079 0.4810 1 1 37.30 1 0 5 30 0.6667 74.0368
2 CC(C)O 60.096 0.3871 1 1 20.23 0 0 4 26 1.0000 60.0575
代码
文本
Machine Learning
化学信息学
Machine Learning化学信息学
已赞1