AI在催化反应条件优化中的应用
背景
在现代药物合成中,催化合成反应,如碳氮成键反应和Diels-Alder环加成反应,具有重要地位。研究人员和工业界在开发这些反应的新催化合成方法时,往往希望以高产率获得目标产物,从而提高原子经济性,减少资源浪费与环境污染。然而,开发高活性的催化反应体系往往需要对多种反应条件,包括催化剂和溶剂,进行详尽的探索。这一过程既耗时又费力,目前主要依赖于经验判断和偶然发现,严重制约了新高效催化合成策略的开发。
AI在反应优化中的角色
反应底物和反应条件是决定产率的关键因素。通过利用AI模型捕捉底物、条件与产率之间的内在联系,可以通过输入底物和条件信息,预测该反应组合下的产率,从而有效提升催化反应的条件筛选效率。
比赛介绍
任务描述
本次比赛提供了多种常见的催化反应实验数据,包括反应底物、催化剂、溶剂和产物。参赛选手需要通过分析这些数据,利用机器学习、深度学习算法或大语言模型,建立产率预测模型,以辅助新反应条件的筛选。
初赛任务
初赛任务是构建一个能够准确预测碳氮成键反应产率的模型。选手需要通过对反应中的底物、添加剂、溶剂和产物进行合理特征化,运用机器学习或深度学习模型拟合并预测反应产率,或者利用训练数据对开源大语言模型进行微调,以预测反应产率。
数据集介绍
初赛数据集包含碳氮成键反应数据,训练集中包含23,538条反应数据,测试集中包含2,616条反应数据。每条训练数据包含以下字段:
rxnid
: 数据IDReactant1
: 反应物1Reactant2
: 反应物2Product
: 产物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技术的发展,催化反应优化的效率将进一步提升,为绿色化学和可持续发展做出更大贡献。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!