Datawhale AI夏令营——催化反应产率预测方向Task1

小白学习笔记,文章有误的地方请各位大佬温和指出

一. 跑通官方给出的的Baseline(代码+分析)

1.下载baseline代码和数据.

数据来源于Datawhale AI夏令营Task1教程

2.启动魔塔Notebook运行代码
3.打开终端,输入指令
unzip AI+化学baseline文件包.zip

解压文件。

4.建立相应环境,并导入库
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.*')

     导入各种使用的库。

     pickle库用于序列化和反序列化Python对象。它可以将Python对象转化为字节流形式,以便于存储或传输,然后在需要时将其还原为原始对象。 

    panda库用于处理数据。panda库纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。

    从tqdm库导入的tqdm用于显示进度条。

    从sklearn.ensemble库RandomForestRegressor导入的,用于随机森林回归。

    从rdkit.Chem库导入的rdMolDescriptors,可以用于药物分析和药物设计,处理化学分子信息。

    从rdkit库导入的RDLogger,Chem,可以用于药物分析和药物设计。

    numpy库用于科学计算,进行数据处理。

5.提取SMILES特征
#该函数用于生成分子对应的Morgan分子指纹
def mfgen(mol,nBits=2048, radius=2):
    '''
    Parameters
    ----------
    mol :mol 需要计算指纹的分子对象。
    nBits :int 设置指纹的位数。
    radius : int 计算指纹的范围半径。
    fp:  位向量
    Returns
    -------
    mf_desc_map : ndarray  分子指纹描述符ndarray
        
    '''
    # 返回分子的位向量形式的Morgan fingerprint
    fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(mol,radius=radius,nBits=nBits)
    return np.array(list(map(eval,list(fp.ToBitString()))))

# 加载数据,该函数将一组化合物的SMILES转化为分子指纹(位向量)的形式。
def vec_cpd_lst(smi_lst):
    smi_set = list(set(smi_lst))  #将输入的 SMILES 列表去重. 
    smi_vec_map = {} #创建一个空字典smi_vec_map,用于存储SMILES和对应的分子指纹。
    for smi in tqdm(smi_set): # tqdm:显示进度条
        mol = Chem.MolFromSmiles(smi)   #将每个SMILES转换为RDKit的分子对象mol。
        smi_vec_map[smi] = mfgen(mol)  
        #调用mfgen函数生成该分子的分子指纹,并将结果存储在 smi_vec_map中。
    smi_vec_map[''] = np.zeros(2048)  #将空SMILES对应的分子指纹设为全零数组
    
    vec_lst = [smi_vec_map[smi] for smi in smi_lst]
    return np.array(vec_lst)
   #从smi_vec_map中获取每个SMILES对应的分子指纹,形成一个分子指纹列表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() #该列表存储反应物1的SMILES数据
train_rct2_smi = train_df['Reactant2'].to_list() #该列表存储反应物2的SMILES数据
train_add_smi = train_df['Additive'].to_list()  #该列表存储添加剂的SMILES数据
train_sol_smi = train_df['Solvent'].to_list()   #该列表存储溶剂的SMILES数据

# 将SMILES转化为分子指纹
train_rct1_fp = vec_cpd_lst(train_rct1_smi)   #调用vec_cpd_lst函数得到各化合物的分子指纹
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)

       通过 mfgen 函数生成分子的 Morgan 指纹,然后在 vec_cpd_lst 函数中对输入的 SMILES 列表中的每个分子进行处理,生成对应的分子指纹列表。这样可以将分子结构表示为数值特征,用于后续的分子相似性比较或其他分子描述符相关的任务。

6.使用随机森林进行建模
# Model fitting
model = RandomForestRegressor(n_estimators=10,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)
7.生成赛题要求的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))

修改文件格式。

二、baseline进一步优化

   初步学习,暂无想法。

   可以通过调整参数、通过文献来研究相关分子指纹方面的优化、使用不同模型进行训练

三、相关知识点补充

1.SMILES

    官方发布的数据是对化学分子的SMILES表达式,具体来说,有rxnid,Reactant1,Reactant2,Product,Additive,Solvent,Yield字段。其中:

  • rxnid 对数据的id标识,无实际意义
  • Reactant1 反应物1
  • Reactant2 反应物2
  • Product 产物
  • Additive 添加剂(包括催化剂catalyst等辅助反应物合成但是不对产物贡献原子的部分)
  • Solvent 溶剂
  • Yield 产率 其中Reactant1,Reactant2,Product,Additive,Solvent都是由SMILES表示。

    SMILES,全称是Simplified Molecular Input Line Entry System,是一种将化学分子用ASCII字符表示的方法,是化学信息学领域非常重要的工具。

2.分子指纹

       分子指纹通过一系列数学算法对分子进行编码,‌将分子的结构、‌原子类型、‌化学键和空间构型等特征转化为一串数字或位表,‌以便于计算机处理和分析。‌

3.随机森林
   (1)使用随机森林进行建模。

参数解释:

  • n_estimators=10: 决策树的个数,越多越好;但是越多意味着计算开销越大;

  • max_depth: (default=None)设置树的最大深度,默认为None;较小的深度可能导致模型欠拟合,而较大的深度可能导致模型过拟合。通常选择在4~12之间。

  • min_samples_split: 根据属性划分节点时,最少的样本数;控制决策树结点分裂的最小样本数。如果节点的样本数少于该值,则不再进行分裂。可以设置较大的值来防止过拟合。

  • min_samples_leaf: 叶子节点最少的样本数;控制叶子节点的最小样本数。

  • n_jobs=1: 并行job个数,-1表示使用所有cpu进行并行计算。

   (2)一些基本概念补充

        随机森林(Random Forest)是一种集成学习方法,通过构建多个决策树来进行分类或回归。它结合了决策树的优点,并通过随机特征选择和样本采样来改进模型的预测性能和泛化能力。随机森林由多个决策树组成,每个决策树都是通过对训练数据随机抽样得到的。在每棵树的训练过程中,随机森林还会对每个节点的特征进行随机选择,而不是基于最优特征来进行分裂。这种随机性有助于减少模型的方差,从而提高整体模型的泛化能力。

(3)优势
  1. 高准确性和泛化能力:随机森林通过集成多个决策树的预测结果,通常比单个决策树具有更高的准确性和泛化能力。
  2. 降低过拟合风险:通过随机选择特征和样本,随机森林可以减少模型的过拟合风险。
  3. 处理大规模数据和高维特征:随机森林能够有效处理大规模数据和高维特征空间,适用于复杂的实际问题。
  4. 对缺失数据和异常值具有鲁棒性:随机森林能够处理缺失数据和异常值,而不需要额外的数据预处理。
  5. 易于解释和调优:相比于其他复杂的机器学习模型,随机森林的结果更易于解释,同时也相对容易进行参数调优。
(4)作用

随机森林在实际应用中广泛用于分类和回归任务,特别是在以下情况下尤为有效:

  • 预测和分类:处理复杂的数据集,如医疗诊断、金融风险评估等。
  • 特征重要性评估:通过分析每个特征在模型中的重要性,帮助理解数据和提高预测效果。
  • 异常检测:识别数据中的异常点或离群值。
  • 数据降维:通过特征选择或特征组合,实现数据降维和简化模型复杂度。

随机森林的这些特点和优势使其成为机器学习和数据挖掘中的重要工具,被广泛应用于各种实际问题中。

四、参考文献:

1.Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5-32.

2.Liaw, A., & Wiener, M. (2002). Classification and Regression by randomForest. R News, 2(3), 18-22.

3.Datawhale AI 夏令营的baseline教程以及直播教学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值