Scikit-Mol 简化了建立化学信息学模型的过程,把 RDKit 的化学分析能力和 Scikit-Learn 的机器学习搭建能力结合起来。不同于其他尝试把化学和机器学习融为一体的工具,Scikit-Mol 更专注于充当一个简洁的中间媒介,这个定位大大降低了更新和维护的成本。
简介
在分子数据集上应用机器学习技术对于药物发现和材料设计的预测建模至关重要。通过这种方式,我们可以在设计阶段就预测分子的性质,这有助于我们优化和筛选模拟数据集。近期,预测模型开始指导从头设计具有特定属性的分子。出现了多种工具包和框架来支持这一过程。这些工具包各有特色,优势不同,也各有千秋,正如表 1 所展示的那样。
Scikit-Learn 和 RDKit 是两个广受欢迎的项目。Scikit-Learn 主要是一个基于 Python/Numpy 的机器学习库,而 RDKit 则专注于化学信息学的计算和处理。RDKit 是一个多功能的化学信息学工具包,提供了完善的 Python 接口;Scikit-Learn 则是一个功能全面的 Python 机器学习框架,提供了大量的机器学习模型和工具,用于数据降维、聚类或构建预测模型。
开放药物发现工具包(ODDT)是一个综合性工具包,它整合了如 RDKit 和 Scikit-Learn 这样的现有开源工具包,使得计算描述符(比如蛋白质-配体指纹)和构建蛋白质-配体信息的评分模型变得更加简单。Scikit-Chem 提供了更符合 Python 风格的界面来处理 RDKit 的分子对象和功能,但目前看来几乎没有维护和更新,最后一次代码更新是在 2020 年,而大部分更新是在 2016 年完成的。DeepChem 则致力于为化学领域的深度学习提供一个框架。PySMILESUtils 是一个专门的包,用于扩展、标记化和向量化 SMILES 字符串,以便与深度学习模型配合使用,主要用于构建化学信息学模型。尽管它使用并不广泛,但最近在 Jürgen Schmidhuber 及其团队的一篇论文中有所提及。OpenChem 是一个基于 PyTorch 的计算化学深度学习工具包,它处理各种数据向量化,并提供深度学习模型。然而,最近的代码更新是在两年前,除了去年更新的许可证之外。
Oloren Chemengine 是一个雄心勃勃的新项目,它旨在提供工具来创建最先进的分子属性预测引擎。它支持多种分子格式,能进行描述符计算和深度学习嵌入,并提供了许多模型。目前,这个项目似乎正在迅速发展并越来越受欢迎。
表 1:2023 年 3 月收集的化学信息学和机器学习项目示例
那么,我们为什么还需要另一个工具包,比如 Scikit-Mol 呢?
虽然像 RDKit 和 Scikit-Learn 这样的工具包都力求通用性,各自在自己的领域内取得了巨大成功,但其他工具包则试图将化学和机器学习/深度学习整合到一个框架中,通常是为了满足开发者的特定需求。但这种方法可能导致随着底层工具包的不断演进和发展,维护工作变得繁重。
例如,当 Scikit-Learn 出现新模型时,可能需要编写新的封装器来将其纳入框架中,或者如果 PyTorch 更新了可能改变 API 的内容,就可能需要进行重大更新。因此,有些项目可能变得无人维护。
Scikit-Mol 项目简介
Scikit-Mol 的目标是简单地连接两个知名的开源工具包:RDKit 和 Scikit-Learn。
Scikit-Mol 专注于帮助用户轻松构建简洁、自解释的可序列化模型。通过整合这两个成功的开源项目,作者的项目在面对其他项目更新时,减少了对代码维护的需求。比如说,Scikit-Learn 的最新机器学习模型,很可能无需任何代码修改就能在 Scikit-Mol 中得到支持。作者的目标是打造一个既实用又灵活的工具包,即在最少的维护下也能保持其实用性和相关性。
Scikit-Mol 示例入门
图 2 用一个实例向作者展示了 Scikit-Mol 包的核心功能和目标。这个包里的指纹转换器能与 Scikit-Learn 完美配合,可以轻松地融入 Scikit-Learn 的数据处理管道中。一旦这个管道建立并在已有数据上完成训练,它就能独立运行,不再依赖外部的特征计算。输入数据是标准的分子信息格式,也就是 SMILES 字符串(前提是这些字符串可以被 RDKit 解析)。这个管道还可以被保存和读取,便于之后的使用,且它的参数设置一目了然,方便查看。这样做的好处是,关于指纹的大小、范围和类型等信息都一清二楚,避免了日后使用时可能出现的混淆或误解。如果作者不考虑代码中的导入语句、打印命令和函数内的换行,实际上只需要两行 Python 代码,就能创建并训练一个以 SMILES 字符串为输入的分子预测模型。
图 2:这个示例清晰地展示了 Scikit-Mol 与 Scikit-Learn 的无缝连接。只要有一组可以被 RDKit 解析的 SMILES 字符串(smiles_list)和对应的分子属性列表(mol_property_list),我们就能轻松创建一个完全独立、可存储并且功能齐全的预测器。
如何安装
如果您想在 Python 环境中使用 Scikit-Mol,您只需简单地运行一个命令即可完成安装。具体操作为在终端输入pip install scikit-mol
。另外,您还可以选择在 Conda 或 virtualenv 这类虚拟环境中进行安装。
Scikit-Mol 类的简化解读
Scikit-Mol 提供了一系列基于 Scikit-Learn 转换器的类,它们遵循 Scikit-Learn 的标准和接口。这些类的一个关键功能是 .transform
方法,它能够将各种可迭代数据(比如列表、NumPy 数组或 Pandas 系列)转换成新的、长度相似的数据结构。
举个例子,MorganFingerprintTransformer
能将 RDKit 的分子对象列表转换成密集的 NumPy 数组,这些数组可以直接应用于 Scikit-Learn 的其他转换器、缩放器或模型中。
Scikit-Mol 类需要满足几个条件:
- 它们必须是 Scikit-Learn 的
BaseEstimator
和TransformerMixin
的子类。 -
__init__()
方法中用到的参数必须是带默认值的关键词,并且作为具有相同名称的属性存在于类对象中。 -
__init__()
方法应只用于设置属性。要重新配置对象,可以直接更改这些属性,或使用set_params
方法。因此,在__init__
方法中不应进行逻辑处理、数据清理或其他操作,以免影响 Scikit-Learn 其他类中set_params
方法的正常运作。 - 类必须有一个
transform
方法,用于接收并转换数据。为了与 Scikit-Learn 兼容,transform
方法还需要接受一个可选的第二个参数 y-data,虽然这个参数并不会被使用或返回。
详细的子类要求可在 Scikit-Learn 开发者文档中找到: https://scikitlearn.org/st
并行计算技术
在现代计算机中,多处理器的配置让 Scikit-Mol 转换器能并行运行成为可能。
这种并行执行是通过在子进程中重新创建转换器对象来实现的。这意味着,作我们不是直接发送整个对象到子进程,而是发送关于转换器类别和参数设置的信息,然后在子进程中根据这些信息克隆一个新的对象。特别是在处理分子对象时,一些指纹和描述符依赖于实例化的 RDKit 对象,这些对象与 C++后端交互。出于安全考虑,作者选择从头开始重建这些对象,而不是序列化那些可能含有指向内存中 C++对象指针的对象。
不同平台上创建子进程的方法各不相同。Linux 系统默认使用 fork 方法,而 Windows 和 Mac 则使用 spawn 方法。尽管 Mac 系统可以设置为使用 fork 方法,但 Windows 系统不支持这一选项。fork 方法采用了更改时复制的策略,允许子进程直接访问父进程中的对象,无需复制,这样可以减少处理大型只读数据集时的计算和内存负担。而 spawn 方法则需要在子进程中重新运行主线程,这就导致了一个问题:在 Windows 平台和 Mac 系统的默认配置下,我们无法在 Jupyter 笔记本中直接以并行模式使用这些转换器。
图 3 显示了在一台 32 核(16 个物理核心)的工作站上,使用 Desc2DTransformer 计算描述符时的加速效果。数据集包含 7228 个与血清素转运体(SLC6A4 基因符号)结合的小分子。随着数据集的增大和使用的核心数量的增加,计算速度相较于单线程有了显著提升。当使用 16 个核心处理完整数据集时,计算时间仅为单线程的 7%,相当于加速了 14 倍。但是,在其他一些并行执行的指纹计算中,所需时间可能更长。图 4 展示了使用 MorganFingerprintTransformer 的情况,其中只有最大的数据集显示出计算性能的适度提升。
通常情况下,指纹计算越快,就需要更大的数据集才能让并行计算真正发挥作用,如图 5 所示。只有规模最大的数据集(超过 10,000 个样本)才值得采用 Morgan、Atompairs 和拓扑扭转的并行计算。SEC 指纹、MACCS 键和 RDKitFP 的情况居中,当数据集规模较大(例如超过 500 个样本)时,采用并行计算会更有益处。而描述符的计算几乎立即受益,即使是最小的数据集(超过 100 个样本)也是如此。
图 3:32 核心(16 个物理核心)工作站对 7228 个与血清素转运体(SLC6A4 基因符号)结合物的数据集进行描述符计算的加速效果
图 4:32 核心(16 个物理核心)工作站对 7228 个与血清素转运体(SLC6A4 基因符号)结合物的数据集进行 Morgan 指纹计算的加速效果
图 5:并行计算性能与单分子特征计算的关系图
Scikit-Mol 提供了丰富的使用说明,包括一系列实用的笔记本教程。这些教程详细介绍了如何在数据处理流程中应用转换器,进行超参数的优化和数据标准化等。感兴趣的用户可以在它的 GitHub 页面(https://github.com/EBjerrum/scikit-mol/tree/main/notebooks)找到这些教程。另外,类的使用方法也有详尽的说明,你可以在 Python 交互环境中通过 help()函数轻松查阅。
结语
简而言之,Scikit-Mol 是一个强大的工具,能够将 RDKit 的分子特征化功能和 Scikit-Learn 完美结合。利用这些开源项目的优点,Scikit-Mol 为分子预测模型的开发提供了一个简单但全面的方案。作者相信,Scikit-Mol 选择在这些成熟的平台基础上进行扩展,而不是单独建立一个新平台,这将使其在未来长期保持实用、灵活和相关性。
数据获取
所有相关的源代码都可以在项目的 GitHub 仓库中找到:https://github.com/EBjerrum/scikit-mol
参考文献:
Bjerrum, E. J., Bachorz, R. A., Bitton, A., Choung, O.-h., Chen, Y., Esposito, C., ...Poehlmann, A. (2023). Scikit-Mol brings cheminformatics to Scikit-Learn. ChemRxiv.
— 完 —
点击这里👇关注我,记得标星哦~
一键三连「分享」、「点赞」和「在看」
每天进步一点点 ~