Datawhale AI夏令营-AI+物质科学Task1 学习笔记

  • 学习任务:跑通baseline

特征提取

1.SMULES

在官方提供的csv文件中有rxnid,Reactant1,Reactant2,Product,Additive,Solvent,Yield7个字段,组成SMILES表达式。

各字段的含义是:

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

SMILES是一种将化学分子用ASCII字符表示的方法。SMILES把分子结构表示为 任意的手性特征图,这本质上就是分子家描述分子结构的二维图片,用作题目需要的化学数据输入

2.Morgan Fingerprints

摩根指纹(Morgan Fingerprints)是一种用于描述分子结构的编码方法,广泛应用于化学信息学和药物发现领域。它的基本原理是将分子结构映射到一个固定长度的比特串,以便于计算机进行处理和比较。其能够将复杂的分子结构转化为一系列由0和1组成的位向量,这些位向量能够直观地反映分子的化学性质和结构特征,类似于人类指纹的独特性。

3.RDKit

RDKit是开源的化学信息工具包,生成用于机器学习的分子描述符,直接白嫖


ok理论完毕,开始赛博炼丹

首先安装相应库并导入

!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.*')

提取数据--Vectorization 

就是对两个csv文件(即测试集跟训练集)进行字段读取,得到用于训练模型的两个参数train_x, train_y,以及结果预测用的test_x。原料收集QAQ

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

# 加载数据
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' 

train_df = pd.read_csv(f'{dataset_dir}/round1_train_data.csv')
test_df = pd.read_csv(f'{dataset_dir}/round1_test_data.csv')

# 从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 fitting and saving

baseline使用的是随机森林进行建模。

  1. 实例化模型(并指定重要参数);
  2. model.fit(x, y) 训练模型;

起鼎!开炼!

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

参数解释:

  • n_estimators=10: 决策树的个数,越多越好;但是越多意味着计算开销越大;
  • max_depth: (default=None)设置树的最大深度,默认为None;
  • min_samples_split: 根据属性划分节点时,最少的样本数;
  • min_samples_leaf: 叶子节点最少的样本数;
  • n_jobs=1: 并行job个数,-1表示使用所有cpu进行并行计算。

接着就是保存下模型然后进行预测,最后生成submit文件

提交结果后第一个分数是0.1880!!感觉还有提升空间,回炉重造~

之后从随机森林入手,微调了树的最大深度跟个数。目前最理想的就是个数为100还有不限制树的深度。

model = RandomForestRegressor(
    n_estimators=100,   # 增加树的数量
    max_depth=None,     # 不限制树的深度
    min_samples_split=2, # 允许每个节点分割
    min_samples_leaf=1,  # 允许叶子节点只有一个样本
    n_jobs=-1
)
model.fit(train_x, train_y) 

(请忽略中间的报红QwQ)

结尾

嘿嘿,Task1学习笔记到这里就结束了,挺有意思的,根据题目了解对应领域的知识,最有趣的就是最后的调参环节,每一次出锅提交文件到拿到分数都是期待满满。加油呀哈哈哈哈期盼之后的课程安排~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值