基于RDKit的分子描述符分析与特征选择:以溶解度预测为例

server/2024/11/27 14:18:26/

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库快速评估了多个回归模型,帮助我们选择最佳的模型进行预测。

  • 特征选择:去除高度相关的特征和低方差特征,避免了冗余信息的干扰,提升了模型性能。
  • 数据标准化:使得不同量纲的特征对模型的影响一致,避免了数值范围差异带来的问题。

原文链接:基于RDKit分子描述符分析与特征选择:以溶解度预测为例


http://www.ppmy.cn/server/145350.html

相关文章

Stable Diffusion中的自注意力替换技术与Diffusers实现

Stable Diffusion中的自注意力替换技术与Diffusers实现 文章目录 Stable Diffusion中的自注意力替换技术与Diffusers实现摘要Abstract一、机器学习部分1. 注意力计算2. SD中的自注意力替换3. 自注意力替换的应用4. 在 Diffusers 里实现自注意力替换4.1 AttentionProcessor4.2 实…

前端 Vue 3 后端 Node.js 和Express 结合cursor常见提示词结构

cursor 提示词 后端提示词 请为我开发一个基于 Node.js 和Express 框架的 Todo List 后端项目。项目需要实现以下四个 RESTful API 接口: 查询所有待办事项 接口名: GET /api/get-todo功能: 从数据库的’list’集合中查询并返回所有待办事项参数: 无返回: 包含所…

分类算法——基于heart数据集实现

1 heart数据集——描述性统计分析 import matplotlib.pyplot as plt import pandas as pd# Load the dataset heart pd.read_csv(r"heart.csv", sep,)# Check the columns in the DataFrame print(heart.columns)aheart.loc[:, y].value_counts() print(a) heart.l…

【linux】线程概念与控制

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 线程基本概念 🦋 1-1 什么是线程🦋 1-2 分⻚式存储管理1-2-1 虚拟地址和⻚表的由来1-2-2 ⻚表1-2-3 ⻚⽬录结构1-2-4 两级⻚表的地…

uname -m(machine) 命令用于显示当前系统的机器硬件架构(Unix Name)

文章目录 关于 arm64 架构检查是否安装了 Rosetta 2其他相关信息解释:命令功能:示例: dgqdgqdeMac-mini / % uname -m arm64您运行的 uname -m 命令显示您的系统架构是 arm64。这意味着您的 Mac Mini 使用的是 Apple 的 M1 或更新的芯片&…

Java与C#

Java和C#(C Sharp)是两种流行的面向对象编程语言,它们在很多方面非常相似,因为它们都受到了类似的编程范式和语言设计理念的影响。然而,它们之间也存在一些重要的区别。 平台依赖性: Java:Java是…

sql漏洞

目录 SQL漏洞产生的原因 未对用户输入进行验证和过滤: 动态SQL语句的拼接: 不安全的数据库配置: 缺乏安全意识和培训: 使用过时的技术或框架: 如何避免SQL漏洞产生 使用参数化查询: 对用户输入进行…

vue项目使用element-ui中的radio,切换radio时报错: Blocked aria-hidden

vue项目使用element-ui中的radio,切换radio时报错: Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. Avoid using aria-hidden on a focused element or its…