#인공지능 #물질과학#
과제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()
랜덤 포레스트 모델링 (내일 작성)