RDKit_0">基于RDKit的分子描述符分析与特征选择:以溶解度预测为例
在药物化学、材料科学和环境化学等领域,分子特性与其生物活性或环境行为之间的关系(例如溶解度、毒性等)是至关重要的。定量构效关系(QSAR)建模可以帮助我们理解这些关系,并预测新分子的性质。然而,要建立有效的QSAR模型,首先需要通过合适的分子描述符(如分子指纹、拓扑特征、电子特征等)来表征分子结构。在本篇博客中,我们将使用RDKit来提取分子描述符,并结合机器学习技术进行特征选择和数据分析,以预测分子的溶解度。
1. 数据准备:加载和清洗数据
我们首先加载一个包含溶解度数据的CSV文件,并通过RDKit的SMILES标准化功能确保每个分子都有唯一的、标准化的SMILES表示。标准化的SMILES对于后续计算和模型训练至关重要,因为它消除了化学结构描述中的不同表述方式。
import pandas as pd
dataset = pd.read_csv('solubility.csv')# 生成规范的smiles
def canonical_smiles(smiles):mols = [Chem.MolFromSmiles(smi) for smi in smiles] smiles = [Chem.MolToSmiles(mol) for mol in mols]return smiles# Canonical SMILES
Canon_SMILES = canonical_smiles(dataset.smiles)
dataset['SMILES'] = Canon_SMILES
dataset_new = dataset.drop_duplicates(subset=['SMILES'])# 可视化溶解度分布
import seaborn as sn
sn.displot(dataset_new.sol)
- Canonical SMILES:确保每个分子只有一个标准的SMILES表示。
- 去重:使用
drop_duplicates
函数移除SMILES相同的重复分子。 - 可视化溶解度:使用Seaborn绘制溶解度的分布,以观察数据的整体趋势。
2. 生成分子描述符
在QSAR建模中,分子描述符是机器学习模型的输入特征。在本例中,我们使用RDKit提供的分子描述符计算器来计算每个分子的约200个描述符。这些描述符包括拓扑特征、电子特征、几何特征等,能够充分反映分子结构的各种性质。
from rdkit.Chem import Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptorsdef RDkit_descriptors(smiles):mols = [Chem.MolFromSmiles(i) for i in smiles] calc = MoleculeDescriptors.MolecularDescriptorCalculator([x[0] for x in Descriptors._descList])desc_names = calc.GetDescriptorNames()Mol_descriptors =[]for mol in mols:# 添加氢原子mol = Chem.AddHs(mol)# 计算所有描述符descriptors = calc.CalcDescriptors(mol)Mol_descriptors.append(descriptors)return Mol_descriptors, desc_names # 计算分子描述符
Mol_descriptors, desc_names = RDkit_descriptors(dataset_new['SMILES'])# 创建包含描述符的数据框
df_with_200_descriptors = pd.DataFrame(Mol_descriptors, columns=desc_names)
在这里,我们通过MolecularDescriptorCalculator
计算每个分子的所有200多个描述符,并将其存储在一个DataFrame中,以便后续分析。
3. 特征选择:移除高度相关的描述符
在计算了大量的分子描述符后,我们往往会遇到多重共线性问题,即某些描述符之间高度相关。这些冗余的描述符不会为模型提供新的信息,反而可能影响模型的性能。因此,我们需要对描述符进行相关性分析并去除那些高度相关的描述符。
import numpy as npdef remove_correlated_features(descriptors):# 计算相关矩阵correlated_matrix = descriptors.corr().abs()# 获取相关矩阵的上三角部分upper_triangle = correlated_matrix.where(np.triu(np.ones(correlated_matrix.shape), k=1).astype(np.bool_))# 识别相关性超过0.9的描述符to_drop = [column for column in upper_triangle.columns if any(upper_triangle[column] >= 0.9)]print(to_drop)# 去除相关性高的描述符descriptors_correlated_dropped = descriptors.drop(columns=to_drop, axis=1)return descriptors_correlated_dropped# 去除相关性高的描述符
descriptors_new = remove_correlated_features(df_with_200_descriptors)
- 相关性分析:我们计算所有描述符之间的相关系数,并移除相关性大于0.9的描述符。
- 冗余特征移除:通过
drop
方法去除冗余的描述符,减少模型的复杂性并提高计算效率。
4. 特征选择:去除低方差特征
除了相关性高的描述符,某些特征的方差可能非常低,这意味着这些特征对数据的区分度较差,因此没有什么用处。在这种情况下,我们需要去除低方差特征。
from sklearn.feature_selection import VarianceThresholddef remove_low_variance(input_data, threshold=0.1):selection = VarianceThreshold(threshold)selection.fit(input_data)return input_data[input_data.columns[selection.get_support(indices=True)]]# 去除低方差特征
X = remove_low_variance(descriptors_new, threshold=0.1)
- 低方差特征去除:使用
VarianceThreshold
进行低方差特征的去除。设定一个阈值,低于该阈值的特征将被去除。
5. 数据标准化
在机器学习建模中,特征的标准化是一个常见的预处理步骤。它能避免某些特征因量纲不同而对模型训练产生不良影响。这里,我们使用StandardScaler对特征进行标准化,使其均值为0,方差为1。
from sklearn.preprocessing import StandardScaler# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
6. 模型训练与评估
在处理和选择了合适的特征之后,我们可以使用机器学习模型来进行训练。在本例中,我们使用了LazyPredict
库,它能够自动尝试多个回归模型,并帮助我们快速评估不同模型的效果。
LazyRegressor
会尝试不同的回归算法,如线性回归、随机森林回归等,并输出每个模型的性能指标。
7. 总结与展望
通过上述步骤,我们使用了RDKit提取分子描述符,并结合机器学习中的特征选择和标准化方法,为QSAR建模做好了数据预处理工作。使用LazyPredict
库快速评估了多个回归模型,帮助我们选择最佳的模型进行预测。
- 特征选择:去除高度相关的特征和低方差特征,避免了冗余信息的干扰,提升了模型性能。
- 数据标准化:使得不同量纲的特征对模型的影响一致,避免了数值范围差异带来的问题。