Datawhale AI夏令营第三期 AI+物质科学学习记录 Task2 RNN建模SMILES进行反应产率预测

引导

如何将化学知识转化为计算机可识别的形式

提到化学应该会想到元素周期表,分子式,化学反应方程等等,化学这门学科的知识和内容都有专有符号记录的,但计算机不能理解,所以需要将这些符号让计算机能理解

Ai4Chemistry知识点补充

AI4Science的早期历史(概要)

三个阶段

  1. 将化学知识以计算机形式存储,并构建数据

人们主要做的事情就是尝试使用不同的方法,尽可能地将化学知识和信息以计算机的形式进行存储,并以此为基础开始构建数据库。例如,用一些字符表示分子或者其他化学符号,如何保存一个具有空间结构的分子的原子、键的位置信息等等。

  1. 机器学习

大家开始使用一些手动的特征工程对已有数据进行编码、特征提取等操作。例如,在baseline中我们使用了分子指纹(molecule fingerprint)作为我们的编码方式。再辅以传统的机器学习的方法,做一些预测。

  1. 深度学习。

各种各样的深度神经网络也开始被广泛使用。这些网络不仅仅开始学习各种特征,也像word2vec那样,非常多的网络也被拿来对分子进行向量化。这也导致后来又非常多的新型的分子指纹出现。基于seq2seq模型学习表示为序列类型的化学数据、基于diffusion重建分子三维空间结构等等,都是当今的潮流方向。

SMILES —— 最流行的将分子表示为序列类型数据的方法

SMILES,提出者Weininger et al[1],全称是Simplified Molecular Input Line Entry System,是一种将化学分子用ASCII字符表示的方法,在化学信息学领域有着举足轻重的作用。当前对于分子和化学式的储存形式,几乎都是由SMILES(或者它的一些手足兄弟)完成的。使用非常广泛的分子/反应数据库,例如ZINC[2],ChemBL[3],USPTO[4]等,都是采用这种形式存储。SMILES将化学分子中涉及的原子、键、电荷等信息,用对应的ASCII字符表示;环、侧链等化学结构信息,用特定的书写规范表达。以此,几乎所有的分子都可以用特定的SMILES表示,且SMILES的表示还算比较直观。

常见的化学结构
在这里插入图片描述
化学反应的表示
在这里插入图片描述

分子指纹——分子向量化

分子的指纹就像人的指纹一样,用于表示特定的分子。分子指纹是一个具有固定长度的位向量(即由0,1组成),其中,每个为1的值表示这个分子具有某些特定的化学结构。例如,对于一个只有长度为2的分子指纹,我们可以设定第一个值表示分子是否有甲基,第二个位置的值表示分子是都有苯环,那么[0,1]的分子指纹表示的就是一个有苯环而没有甲基的分子。通常,分子指纹的维度都是上千的,也即记录了上千个子结构是否出现在分子中。
(这非常像NLP中的Bag of Word)。

RDkit —— 强大、丰富且高效的化学信息工具

RDkit是化学信息学中主要的工具,是开源的。网址:http://www.rdkit.org,支持WIN\MAC\Linux,可以被python、Java、C调用。几乎所有的与化学信息学相关的内容都可以在上面找到。常用的功能包括但不限于:

  1. 读和写分子;
  2. 循环获取分子中原子、键、环的信息;
  3. 修饰分子;
  4. 获取分子指纹;
  5. 计算分子相似性;
  6. 将分子绘制为图片;
  7. 子结构匹配和搜索;
  8. 生成和优化3D结构。
    RDkit会将分子读取为RDkit中专属的rdkit.Chem.rdchem.Mol对象,并以Mol对象为基础,可以对分子进行转化为各种表达形式,例如SMILES、SMARTS:
from rdkit import Chem
m = Chem.MolFromSmiles('Cc1ccccc1')
res = Chem.MolToSmarts(m)
# res : [#6]-[#6]1:[#6]:[#6]:[#6]:[#6]:[#6]:1

绘制图片

from rdkit.Chem import Draw
img = Draw.MolToImage(m)
img.show() # 把图片展示出来

子结构搜索

m = Chem.MolFromSmiles('c1ccccc1O')
patt = Chem.MolFromSmarts('ccO')
m.HasSubstructMatch(patt)
# True

获得分子指纹(fingerprint)并通过指纹计算分子之间的相似性:

from rdkit import Chem
from rdkit import DataStructs
from rdkit.Chem import AllChem
ms = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO'),
Chem.MolFromSmiles('COC')]
fpgen = AllChem.GetRDKitFPGenerator()
fps = [fpgen.GetFingerprint(x) for x in ms]
DataStructs.TanimotoSimilarity(fps[0],fps[1]) # TanimotoSimilarity是计算分子相似性的其中一个指标,更多指标详见RDkit官网
# 0.6
DataStructs.TanimotoSimilarity(fps[0],fps[2])
# 0.4
DataStructs.TanimotoSimilarity(fps[1],fps[2])
# 0.25

Tanimoto Similarity计算方法:
在这里插入图片描述
其中: b X , b Y b_X, b_Y bX,bY就是是分子指纹。
分子相似性的计算方法也是多样的。

机器学习

机器学习按照目标可以分为分类任务(classification)和回归(regression)任务两大类。所谓分类任务,就是模型预测的结果是离散的值,例如类别;那么,回归任务中,模型预测的结果就是连续的值,例如房价等等。在本次竞赛中,我们需要预测的目标是反应的产率,是0-1之间的一个连续的数值,所以是一个回归任务。(注:离散值通过一些处理可以近似认为是连续值,所以不要被连续值和离散值限制了自己的思维)。

传统的机器学习需要需要经历特征工程这一步骤,即将原始数据转化为向量形式。然后通过SVM、Random Forest等算法学习数据的规律。这些方法在处理简单的任务时是比较有效的。

深度学习

深度学习可以归为机器学习的一个子集,主要通过神经网络学习数据的特征和分布。深度学习的一个重要进化是不再需要繁琐的特征工程,让神经网络自己从里面学习特征。

SMILES是一种以ASCII组成的序列,可以被理解为一种“化学语言”。既然是一种语言,那么很自然地想到了可以使用NLP中的方法对SMILES进行建模。

使用RNN对SMILES建模是早期的一个主要方法。RNN(Recurrent Neural Network)是处理序列数据的一把好手。RNN的网络每层除了会有自己的输出以外,还会输出一个隐向量到下一层。

实践部分

调整到GPU
在这里插入图片描述
下载ipynb文件,上传导mp/code/下即可

目录如下
在这里插入图片描述
vocab_full.txt是词汇表文件
然后就是运行了

调参

由于我是瞎调的,把几个数字调整了一下

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值