2024-7-28 笔记,粗读催化反应产率预测的baseline代码#Datawhale AI夏令营

这里是写在开头的前言

首先,由于我尚且缺乏见识与实践经验,仅能基于普通的高中毕业生的一般课本知识进行理解和编辑,因此难以写出什么好的笔记。请见谅。再接着,我需要进行一些边角料的解释,也算是给自己一些记忆——那便是这当中会遇见的一些名词,这个我会放在最后。我只能尽量,并且,如果您乐意指出错误,进行纠正,将感激不尽。

预先:数据准备与baseline代码获取

这个可以直接从[http://competition.sais.com.cn/competitionDetail/532233/competitionData(上海科学智能研究院)]获取,也可以从[Datawhale (linklearner.com)]的Step2中获取,注意,前者请先注册登录,才可以打开。

第一步:安装配置依赖

这里是安装环境依赖

!pip install pandas
!pip install -U scikit-learn
!pip install rdkit

这里是引用所需要的库

import pickle
import pandas as pd|from tqdm import tqdm
from sklearn.ensemble import RandomForestRegressor
from rdkit.Chem import rdMolDescriptors
from rdkit import RDLogger,Chem
import numpy as np
RDLogger.DisableLog('rdApp.*')

最后一行的含义是使用名为 RDLogger 的日志记录工具将会不记录所有以 “rdApp” 开头的日志类别。
在这里,我想提一个事。便是初步迈出高中,或许会对报错一类的事情很敏感,但在观察并试跑了多种AI训练的代码后发现。报错、警告是家常便饭。

第二步:进行特征提取

在示例代码中,使用的是RDKit工具。

def mfgen(mol,nBits=2048, radius=2):
    # 返回分子的位向量形式的Morgan fingerprint
    fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(mol,radius=radius,nBits=nBits)
    return np.array(list(map(eval,list(fp.ToBitString()))))

该步骤进行了数据特征向分子位向量的转化。这其中,mol为分子对象本身(题外话:mol也可以指MDL的分子文件格式()但这里不是。大概。)

def vec_cpd_lst(smi_lst):
    smi_set = list(set(smi_lst))
    smi_vec_map = {}
    for smi in tqdm(smi_set): # tqdm显示进度条
        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'   # 注:如果是在AI Studio上,将这里改为'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)}')

导入了数据集,同时输出了训练集和测试集的数据量。

# 从csv中读取数据
train_rct1_smi = train_df['Reactant1'].to_list()
train_rct2_smi = train_df['Reactant2'].to_list()
train_add_smi = train_df['Additive'].to_list()
train_sol_smi = train_df['Solvent'].to_list()

# 将SMILES转化为分子指纹
train_rct1_fp = vec_cpd_lst(train_rct1_smi)
train_rct2_fp = vec_cpd_lst(train_rct2_smi)
train_add_fp = vec_cpd_lst(train_add_smi)
train_sol_fp = vec_cpd_lst(train_sol_smi)

# 在dim=1维度进行拼接。即:将一条数据的Reactant1,Reactant2,Product,Additive,Solvent字段的morgan fingerprint拼接为一个向量。
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_smi = test_df['Reactant1'].to_list()
test_rct2_smi = test_df['Reactant2'].to_list()
test_add_smi = test_df['Additive'].to_list()
test_sol_smi = test_df['Solvent'].to_list()
test_rct1_fp = vec_cpd_lst(test_rct1_smi)
test_rct2_fp = vec_cpd_lst(test_rct2_smi)
test_add_fp = vec_cpd_lst(test_add_smi)
test_sol_fp = vec_cpd_lst(test_sol_smi)
test_x = np.concatenate([test_rct1_fp,test_rct2_fp,test_add_fp,test_sol_fp],axis=1)

读取相关数据,将对应的特征转化为位向量,以供后续模型的方便处理。

第四步:利用随机森林算法进行模型训练

模型训练:

model = RandomForestRegressor(n_estimators=20,max_depth=10,min_samples_split=2,min_samples_leaf=1,n_jobs=-1) # 实例化模型,并指定重要参数
model.fit(train_x,train_y) # 训练模型

这里把原来的参数解释贴过来,提供方便参照。
1、n_estimators=10: 决策树的个数,越多越好;但是越多意味着计算开销越大;
2、max_depth: (default=None)设置树的最大深度,默认为None;
3、min_samples_split: 根据属性划分节点时,最少的样本数;
4、min_samples_leaf: 叶子节点最少的样本数;
5、n_jobs=1: 并行job个数,-1表示使用所有cpu进行并行计算。
这里可以对决策树、深度等进行调整,来影响模型的质量。
模型保存:

with open('./random_forest_model.pkl', 'wb') as file:
    pickle.dump(model, file)

模型加载:

with open('./random_forest_model.pkl', 'wb') as file:
    pickle.dump(model, file)

推理预测:

test_pred = loaded_model.predict(test_x)

第五步:生成规定submit文件

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))

名词解释

rxnid:反应id,rxn为"reaction"(反应)的缩写。
Reactant:反应物。
Additive:添加剂。
Solvent:溶剂。
Yield:产率。
Vectorization:使用向量运算来提高计算效率。
鲁棒性:系统或模型在异常或压力条件下能够维持基本功能的特性。
位向量:一种数据结构,由一系列二进制位组成,通常用于高效地存储和操作大量布尔值。位向量中的每个位可以用来表示一个布尔值,其中0通常代表false,而1通常代表true。
欠拟合:在机器学习和统计建模中,当一个模型不能充分捕捉训练数据中的模式时发生的现象。这意味着模型过于简单,无法很好地拟合训练数据,因此在新数据上的表现也会很差。
过拟合:模型在训练数据上表现得非常好,但在新的、未见过的数据上表现较差的现象。这意味着模型不仅学习到了数据中的基本模式,还学习到了噪声或训练数据特有的细节,导致其泛化能力降低。
SMILES模型:一种用于表示化学分子的文本字符串编码方式,采用ASCII编码中的字符。个人认为以下链接的内容能够让人获取较为清晰的基础知识。https://www.bilibili.com/video/BV1mb411k7ey/?vd_source=529ab0615f52a52655bf0c5d9f40774f

草草收尾

因为23:35了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值