Tính toán các mô tả phân tử và dấu vân tay từ SMILES và lưu trữ chúng trong khung dữ liệu [Python, RDKit]

Ngày 2020 tháng 1 năm 8

Đây là một phương pháp để tạo khung dữ liệu chứa các bộ mô tả phân tử và dấu vân tay từ bộ dữ liệu ghép SMILES với RDKit. Tôi đã cố gắng tạo mô hình QSAR/máy học của riêng mình, nhưng tôi gặp khá nhiều khó khăn khi tạo bộ mô tả phân tử và dấu vân tay, vì vậy tôi sẽ tóm tắt bên dưới.

Ý nghĩa của việc lưu trữ trong một khung dữ liệu

Nếu nó chỉ dành cho máy học, bạn có thể tạo nó dưới dạng một loại danh sách, nhưng biến nó thành một khung dữ liệu sẽ giúp thực hiện những việc sau dễ dàng hơn.

  1. Chế độ xem toàn cảnh về bộ dữ liệu phức hợp dựa trên bộ mô tả/dấu vân tay đã tạo
  2. Tiền xử lý dữ liệu như xử lý giá trị bị thiếu và giảm kích thước

Ngoài ra, RDKit trước tiên chuyển đổi các đối tượng SMILES thành mol để tính toán các bộ mô tả, nhưng các khung dữ liệu dễ xử lý hơn ngay cả khi có những thứ không thể chuyển đổi tốt.

thử nó ra

sự chuẩn bị

Đối với dữ liệu mẫu, chúng tôi sẽ sử dụng BBBP của MoleculeNet (bộ dữ liệu thâm nhập hàng rào máu não) SMIELS.

Các đối tượng RDKit mol được lưu trữ trong một cột có tên là ROMol, vì vậy hãy tạo một bộ mô tả dựa trên cột này.

Tham khảo: Danh sách tập dữ liệu tổng hợp

import numpy as np
import pandas as pd
 
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, PandasTools, Descriptors
from rdkit.Chem.Draw import IPythonConsole
 
print('rdkit version: ',rdBase.rdkitVersion)  # rdkit version:  2019.03.4
 
# 下準備
# データセットの読み込み
df = pd.read_csv("BBBP.csv")
 
# dfのSMILES列を参照してMolオブジェクト列をデータフレームに加える
PandasTools.AddMoleculeColumnToFrame(df,'smiles')
 
# Molオブジェクトが作成できたか確認
print(df.shape)
print(df.isnull().sum())  
(2050, 4) num 0 tên 0 p_np 0 nụ cười 0 ROMol 11 dtype: int64

Xuất hiện lỗi "Hóa trị rõ ràng cho nguyên tử # 1 N, 4, lớn hơn mức cho phép", nhưng lỗi này là do một phân tử (chẳng hạn như ion) có hóa trị bất thường ("Nguyên tử # 4 N, 11, lớn hơn mức cho phép "). giá trị vượt quá giá trị chấp nhận được”).Không có cái nào được trả lại trong ROMol cho một phân tử như vậy và có XNUMX CƯỜI như vậy ở đây.

Bạn có thể xử lý từng cái một, nhưng nếu số lượng ít, thì việc loại bỏ chúng trong thời gian này sẽ nhanh hơn.Do đó, hãy sử dụng isnull().sum() để kiểm tra xem có thiếu giá trị nào trong cột ROMol hay không và nếu có, hãy xóa hàng đó.

Tham khảo: Khắc phục sự cố khi tải dữ liệu ghép

# ROMolが作成できなかったものを確認
print(df[df.ROMol.isnull()])

# 欠損行の除去
df = df.dropna() 
Tính toán các mô tả phân tử và dấu vân tay từ SMILES và lưu trữ chúng trong khung dữ liệu

Nếu bạn thấy "CẢNH BÁO: không loại bỏ nguyên tử hydro mà không có hàng xóm", thì có thể là do dữ liệu có chứa muối. Theo mặc định, RDKit lưu dữ liệu với H đã bị xóa, vì vậy nếu có H (chẳng hạn như muối) không liên kết với hàng xóm, H đó không thể bị xóa và cảnh báo sẽ được đưa ra.

 

Tạo ra các mô tả phân tử

Hàm Bản đồ rất hữu ích để áp dụng một hàm cho từng hàng trong khung dữ liệu.

Vì các tên và chức năng của bộ mô tả được liệt kê trong "Descriptors.descList" của RDKit nên phải mất một thời gian, nhưng tôi đã có thể thực hiện các phép tính hàng loạt với hàm for và hàm bản đồ và đưa chúng trở lại khung dữ liệu.

for i,j in Descriptors.descList:
    df[i] = df.ROMol.map(j)
 
df.shape
# (2039, 205)

df.head()
tạo khung dữ liệu của các bộ mô tả phân tử

Đã thêm bộ mô tả cho 201 cột.

Khi áp dụng biến thu được cho scikit-learning hoặc khung học sâu, bạn có thể gặp lỗi "ValueError: Đầu vào chứa NaN, vô cực hoặc giá trị quá lớn đối với dtype ('float64')", nhưng trong trường hợp đó thì không sao nếu Tôi đã làm:

for i,j in Descriptors.descList:
    df[i] = df['ROMol'].map(j)

df['Ipc'] = [Descriptors.Ipc(mol, avg=True) for mol in df['ROMol']]  

Có vẻ như nguyên nhân là một giá trị vô cùng lớn được tạo ra trong giá trị "IPC" của một phần của bộ mô tả.

Tham khảo: #12 Phải làm gì khi giá trị IPC trong bộ mô tả RDKit 2D rất lớn
Tham khảo: Danh sách mô tả phân tử

Tạo dấu vân tay

Nó có thể được tính toán nhanh chóng bằng cách sử dụng chức năng áp dụng, nhưng có vẻ như danh sách dấu vân tay được lưu trữ trong một cột.

Dấu vân tay được lưu trữ ở định dạng đối tượng ExplicitBitVect, vì vậy việc lưu trữ từng giá trị trong một hàng hơi phức tạp.

# 下準備
df = pd.read_csv("BBBP.csv")
PandasTools.AddMoleculeColumnToFrame(df,'smiles') 
df = df.dropna()
 
# 1列にfingerprintのリストを追加する場合
df['FP'] = df.apply(lambda x: AllChem.GetMorganFingerprintAsBitVect(x.ROMol, 2, 1024), axis=1)

# fingerprintの各値を各列に格納する場合
# 個別に01をデータフレームに格納する
FP = [AllChem.GetMorganFingerprintAsBitVect(mol, 2, 1024) for mol in df.ROMol]
df_FP = pd.DataFrame(np.array(FP)) 

# フィンガープリントをもとのデータフレームに結合
df_FP.index = df.index
df = pd.concat([df, df_FP], axis=1)
Nếu bạn thêm danh sách dấu vân tay vào một cột
Khi lưu trữ từng giá trị của dấu vân tay trong mỗi cột