DeepChem enthält Daten aus MolculeNet (http://moleculenet.ai/), mit denen Sie maschinelles Lernen mit Verbindungen ausprobieren können. Unter den verschiedenen Daten von Molecule Net sind die Daten, die als "PDB Bind" bezeichnet werden, die außergewöhnlich leuchtenden. Der Grund, warum es sich geändert hat, ist, dass die anderen Daten die in sdf gespeicherten "Verbindungsdaten" sind und als Trainingsdaten lächeln, während dies der Bindungszustand des Proteins und des Liganden (der Verbindung, die spezifisch an das Protein bindet) ist. Dies liegt daran, dass Daten gelernt werden. Natürlich unterscheidet sich der Featurizer auch von den anderen und verwendet etwas anderes als den für einen normalen Datensatz wie "RDKitGridFeaturizer".
Dieses Mal habe ich das PDBBind-Dataset lokal heruntergeladen und versucht, es mit RDKitGridFeaturier zu kennzeichnen.
Zusätzlich zu Deep Chem benötigen Sie einen PDB-Fixer, um es auszuführen. Die Installationsmethode von PDB Fixer ist wie folgt.
$ conda install -c omnia pdbfixer
Klicken Sie auf den Link "PDBBind" unter http://moleculenet.ai/datasets-1, um den Datensatz herunterzuladen, und entpacken Sie ihn an einen geeigneten Ort. Die Kapazität ist ziemlich groß. Das Format der einzelnen Daten ist übrigens sdf (und mol2) für den Liganden und pdb für das Protein.
Die Datei load_pdbdataset.py von deepchem wird umgeleitet und unnötige Teile werden gelöscht. Da die ursprüngliche Quelle fast unverändert verwendet wird, können nicht nur RdkitGridFeaturizer, sondern auch ComplexNeighborListFragmentAtomicCoordinates und AtomicConvFeaturizer angegeben werden. RDKitGridFeaturizer kann als Feature-Typ "ecfp", "splif", "hbond", "salt_bridge", "pi_stack", "cation_pi" und "charge" angeben.
Bitte lesen Sie den Pfad usw. entsprechend Ihrer eigenen Umgebung.
deepchem_test.py
import os
import time
import numpy as np
from deepchem.feat import rdkit_grid_featurizer as rgf
from deepchem.feat.atomic_coordinates import ComplexNeighborListFragmentAtomicCoordinates
from deepchem.feat.graph_features import AtomicConvFeaturizer
def main():
split = "random",
featurizer = "grid"
subset = "core"
load_binding_pocket = True
pdbbind_tasks = ["-logKd/Ki"]
data_folder = "../data/v2015"
if subset == "core":
index_labels_file = os.path.join(data_folder, "INDEX_core_data.2013_small")
elif subset == "refined":
index_labels_file = os.path.join(data_folder, "INDEX_refined_data.2015")
else:
raise ValueError("Other subsets not supported")
# Extract locations of data
with open(index_labels_file, "r") as g:
pdbs = [line[:4] for line in g.readlines() if line[0] != "#"]
if load_binding_pocket:
protein_files = [
os.path.join(data_folder, pdb, "%s_pocket.pdb" % pdb) for pdb in pdbs
]
else:
protein_files = [
os.path.join(data_folder, pdb, "%s_protein.pdb" % pdb) for pdb in pdbs
]
ligand_files = [
os.path.join(data_folder, pdb, "%s_ligand.sdf" % pdb) for pdb in pdbs
]
# Extract labels
with open(index_labels_file, "r") as g:
labels = np.array([
# Lines have format
# PDB code, resolution, release year, -logKd/Ki, Kd/Ki, reference, ligand name
# The base-10 logarithm, -log kd/pk
float(line.split()[3]) for line in g.readlines() if line[0] != "#"
])
# Featurize Data
if featurizer == "grid":
featurizer = rgf.RdkitGridFeaturizer(
voxel_width=2.0,
feature_types=[
'ecfp', 'splif', 'hbond', 'salt_bridge', 'pi_stack', 'cation_pi', 'charge'
],
flatten=False)
elif featurizer == "atomic" or featurizer == "atomic_conv":
# Pulled from PDB files. For larger datasets with more PDBs, would use
# max num atoms instead of exact.
frag1_num_atoms = 70 # for ligand atoms
if load_binding_pocket:
frag2_num_atoms = 1000
complex_num_atoms = 1070
else:
frag2_num_atoms = 24000 # for protein atoms
complex_num_atoms = 24070 # in total
max_num_neighbors = 4
# Cutoff in angstroms
neighbor_cutoff = 4
if featurizer == "atomic":
featurizer = ComplexNeighborListFragmentAtomicCoordinates(
frag1_num_atoms=frag1_num_atoms,
frag2_num_atoms=frag2_num_atoms,
complex_num_atoms=complex_num_atoms,
max_num_neighbors=max_num_neighbors,
neighbor_cutoff=neighbor_cutoff)
if featurizer == "atomic_conv":
featurizer = AtomicConvFeaturizer(
labels=labels,
frag1_num_atoms=frag1_num_atoms,
frag2_num_atoms=frag2_num_atoms,
complex_num_atoms=complex_num_atoms,
neighbor_cutoff=neighbor_cutoff,
max_num_neighbors=max_num_neighbors,
batch_size=64)
else:
raise ValueError("Featurizer not supported")
print("\nFeaturizing Complexes for \"%s\" ...\n" % data_folder)
feat_t1 = time.time()
features, failures = featurizer.featurize_complexes(ligand_files, protein_files)
print(features.shape)
print(features)
feat_t2 = time.time()
print("\nFeaturization finished, took %0.3f s." % (feat_t2 - feat_t1))
if __name__ == '__main__':
main()
Wenn es ausgeführt wird, wird es in features.shape angezeigt, Features wie dieses. Dies zeigt an, dass es fünf Trainingsdaten gibt und eine Trainingsdaten 18944-dimensionale Merkmale aufweist.
(5, 18944)
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
Als die Anzahl der Dimensionen für jeden Feature-Typ durch Ändern der Spezifikation von Feature-Typen untersucht wurde, war dies wie folgt.
Tatsächlich wird es auf eine Dimension reduziert, aber Sie können die ursprüngliche Dimension anzeigen, indem Sie das Argument "Reduzieren" von rgf.RdkitGridFeaturizer auf "Falsch" setzen. Salt_bridge usw. können sich auf 3D-Koordinaten beziehen, da 512 Dimensionen ursprünglich 8 x 8 x 8 sind.
Bis hierher für diese Zeit.
Dieses Mal ging ich so weit, die Daten vorzubereiten und den Inhalt der Funktionen zu sehen, aber leider konnte ich nicht so weit gehen, mit meinen eigenen Daten zu "spielen".
Die größte Frage scheint zu sein, dass der Bindungszustand des Proteins und des Liganden von den Atomen und Bindungen des Proteins / Liganden um die Bindung abhängt, dies sind jedoch je nach Trainingsdaten unterschiedliche Typen und Zahlen, aber alle Trainingsdaten enthalten. Warum liegen die Ergebnisse in derselben Dimension? Die einzige Antwort wäre, sich die Quelle für RDKitGridFeaturizer anzusehen.
Wenn es sich um eindimensionale Trainingsdaten handelt, können diese von anderen als DeepLearning vorhergesagt werden. Daher kann es interessant sein, sie mit der herkömmlichen Methode des maschinellen Lernens gegen MoleculeNet vorherzusagen. Es kann auch interessant sein, einen Featurizer zu erstellen, der Ihre Ideen unter Bezugnahme auf RDKitGridFeaturizer widerspiegelt.
Recommended Posts