物质科学催化反应产率预测之baseline(Datawhale AI 夏令营)

AI在催化反应条件优化中的应用

背景

        在现代药物合成中,催化合成反应,如碳氮成键反应和Diels-Alder环加成反应,具有重要地位。研究人员和工业界在开发这些反应的新催化合成方法时,往往希望以高产率获得目标产物,从而提高原子经济性,减少资源浪费与环境污染。然而,开发高活性的催化反应体系往往需要对多种反应条件,包括催化剂和溶剂,进行详尽的探索。这一过程既耗时又费力,目前主要依赖于经验判断和偶然发现,严重制约了新高效催化合成策略的开发。

AI在反应优化中的角色

        反应底物和反应条件是决定产率的关键因素。通过利用AI模型捕捉底物、条件与产率之间的内在联系,可以通过输入底物和条件信息,预测该反应组合下的产率,从而有效提升催化反应的条件筛选效率。

比赛介绍

任务描述

        本次比赛提供了多种常见的催化反应实验数据,包括反应底物、催化剂、溶剂和产物。参赛选手需要通过分析这些数据,利用机器学习、深度学习算法或大语言模型,建立产率预测模型,以辅助新反应条件的筛选。

初赛任务

        初赛任务是构建一个能够准确预测碳氮成键反应产率的模型。选手需要通过对反应中的底物、添加剂、溶剂和产物进行合理特征化,运用机器学习或深度学习模型拟合并预测反应产率,或者利用训练数据对开源大语言模型进行微调,以预测反应产率。

数据集介绍

        初赛数据集包含碳氮成键反应数据,训练集中包含23,538条反应数据,测试集中包含2,616条反应数据。每条训练数据包含以下字段:

  • rxnid: 数据ID
  • Reactant1: 反应物1
  • Reactant2: 反应物2
  • Product: 产物
  • Additive: 添加剂
  • Solvent: 溶剂
  • Yield: 产率

        数据格式如下所示:

# 安装必要的库
!pip install pandas
!pip install -U scikit-learn
!pip install rdkit

模型构建与实现

环境配置

        在开始特征提取和模型训练之前,首先需要配置Python环境并安装必要的库:

# 安装必要的库
!pip install pandas
!pip install -U scikit-learn
!pip install rdkit
特征提取

        使用RDKit工具从SMILES字符串中提取分子指纹:

import pickle
import pandas as pd
import numpy as np
from tqdm import tqdm
from rdkit import Chem
from rdkit.Chem import rdMolDescriptors
from rdkit import RDLogger
from sklearn.ensemble import RandomForestRegressor

# 关闭RDKit的日志记录
RDLogger.DisableLog('rdApp.*')

# 定义提取分子指纹的函数
def mfgen(mol, nBits=2048, radius=2):
    fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(mol, radius=radius, nBits=nBits)
    return np.array(list(map(int, list(fp.ToBitString()))))

def vec_cpd_lst(smi_lst):
    smi_set = list(set(smi_lst))
    smi_vec_map = {}
    for smi in tqdm(smi_set):
        mol = Chem.MolFromSmiles(smi)
        smi_vec_map[smi] = mfgen(mol)
    smi_vec_map[''] = np.zeros(2048)
    vec_lst = [smi_vec_map[smi] for smi in smi_lst]
    return np.array(vec_lst)

# 加载数据
dataset_dir = 'dataset'  # 请根据实际情况修改路径
train_df = pd.read_csv(f'{dataset_dir}/round1_train_data.csv')
test_df = pd.read_csv(f'{dataset_dir}/round1_test_data.csv')

print(f'Training set size: {len(train_df)}, test set size: {len(test_df)}')

# 提取训练集特征
train_rct1_fp = vec_cpd_lst(train_df['Reactant1'].tolist())
train_rct2_fp = vec_cpd_lst(train_df['Reactant2'].tolist())
train_add_fp = vec_cpd_lst(train_df['Additive'].tolist())
train_sol_fp = vec_cpd_lst(train_df['Solvent'].tolist())

train_x = np.concatenate([train_rct1_fp, train_rct2_fp, train_add_fp, train_sol_fp], axis=1)
train_y = train_df['Yield'].to_numpy()

# 提取测试集特征
test_rct1_fp = vec_cpd_lst(test_df['Reactant1'].tolist())
test_rct2_fp = vec_cpd_lst(test_df['Reactant2'].tolist())
test_add_fp = vec_cpd_lst(test_df['Additive'].tolist())
test_sol_fp = vec_cpd_lst(test_df['Solvent'].tolist())

test_x = np.concatenate([test_rct1_fp, test_rct2_fp, test_add_fp, test_sol_fp], axis=1)
模型训练

        使用随机森林模型对训练数据进行拟合:

# 训练模型
model = RandomForestRegressor(n_estimators=100, max_depth=10, min_samples_split=2, min_samples_leaf=1, n_jobs=-1)
model.fit(train_x, train_y)
模型保存与加载

        模型训练完成后,可以保存并在预测时加载:

# 保存模型
with open('random_forest_model.pkl', 'wb') as file:
    pickle.dump(model, file)

# 加载模型
with open('random_forest_model.pkl', 'rb') as file:
    loaded_model = pickle.load(file)
预测结果

        使用训练好的模型对测试集进行预测,并生成文件:

# 预测测试集结果
test_pred = loaded_model.predict(test_x)

# 生成提交文件
ans_str_lst = ['rxnid,Yield']
for idx, y in enumerate(test_pred):
    ans_str_lst.append(f'test{idx+1},{y:.4f}')
with open('submit.txt', 'w') as fw:
    fw.writelines('\n'.join(ans_str_lst))

结语

        通过对反应数据进行特征化和模型训练,利用机器学习方法预测反应产率,可以显著提高催化反应条件的筛选效率,为药物合成和其他化学反应的优化提供有力支持。未来,随着AI技术的发展,催化反应优化的效率将进一步提升,为绿色化学和可持续发展做出更大贡献。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值