AI를 활용한 물질 과학 분자 지문 분석

#인공지능 #물질과학#

과제1 기준 코드 분석

필요한 라이브러리 명령줄 설치:

pandas:데이터 처리 및 분석

scikit-learn:머신러닝 라이브러리

rdkit:화학 정보학 관련 도구

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

라이브러리 함수 가져오기:

pickle:직렬화 작업을 통해 객체 정보를 영구적으로 저장하며, 거의 모든 데이터 유형에 사용 가능

tqdm:진행 표시줄 라이브러리

sklearn.ensemble:앙상블 학습 관련, 여기서는 랜덤 포레스트 회귀 방법 사용

rdkit.Chem.rdMolDescriptors:분자 기술자 계산을 위한 함수 포함

RDLogger.DisableLog:경고 메시지 비활성화

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

모간 분자 지문 계산:

입력:mol——RDKit 분자 객체;nBits——지문 길이 지정;radius——모간 지문 알고리즘의 반경 매개변수

출력:분자 지문 기술자 배열 반환

구체적 과정:GetMorganFingerprintAsBitVect 함수 호출하여 지정된 분자 mol의 Morgan 지문 계산, 지문 객체 fp를 ToBitString 함수로 비트 정보 문자열로 변환, 이후 리스트로 변환하고 eval 함수로 각 문자를 정수로 변환, 마지막으로 하나의 ndarray로 병합.

def 분자지문생성(mol,nBits=2048, 반경=2):
    '''
    매개변수
    ----------
    mol : mol
        RDKit 분자 객체.
    nBits : int
        지문의 비트 수.
    반경 : int
        Morgan 지문의 반경.
    반환값
    -------
    mf_desc_map : ndarray
        분자 지문 기술자의 ndarray.
    '''
    # 분자의 비트 벡터 형태의 Morgan 지문 반환
    fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(mol,반경=반경,nBits=nBits)
    return np.array(list(map(eval,list(fp.ToBitString()))))

데이터 로딩:

입력:여러 SMILES 표현을 포함하는 화합물 목록

출력:각 화합물에 해당하는 Morgan 지문 벡터로 구성된 배열

구체적 과정:목록 중복 제거, 분자지문생성 함수를 사용하여 SMILES 표현에서 Morgan 지문으로의 매핑 생성.

def 화합물목록_벡터화(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] = 분자지문생성(mol)
    smi_vec_map[''] = np.zeros(2048)
    
    vec_lst = [smi_vec_map[smi] for smi in smi_lst]
    return np.array(vec_lst)

데이터 읽기:

# 원본 csv 파일에서 데이터 읽기, 훈련 세트와 테스트 세트 길이 기록
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'훈련 세트 크기: {len(train_df)}, 테스트 세트 크기: {len(test_df)}')

전처리:Rct1、Rct2、Additive、Solvent 네 필드에 해당 지문을 연결하여 훈련 세트 입력으로 사용,Yield 필드를 훈련 세트 출력으로 사용. 테스트 세트 입력도 동일한 방식 처리 (코드 생략)

# 다양한 필드에 따라 훈련 세트 데이터 통합 및 해당 지문으로 변환
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()

train_rct1_fp = 화합물목록_벡터화(train_rct1_smi)
train_rct2_fp = 화합물목록_벡터화(train_rct2_smi)
train_add_fp = 화합물목록_벡터화(train_add_smi)
train_sol_fp = 화합물목록_벡터화(train_sol_smi)

# 실제 사용되는 훈련 세트 입력:rct1,rct2,add,sol 네 필드의 지문 연결;훈련 세트 출력:Yield 필드 데이터
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()

랜덤 포레스트 모델링 (내일 작성)

태그: 분자지문 RDKit 머신러닝 화학정보학 랜덤포레스트

5월 28일 23:15에 게시됨