[PYTHON] Spielen Sie mit PDBBind von MoleculeNet und RDKitGridFeaturizer von DeepChem

Einführung

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.

Umgebung

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

Vorbereitungen

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.

Quelle

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

Lauf

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.

abschließend

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

Spielen Sie mit PDBBind von MoleculeNet und RDKitGridFeaturizer von DeepChem
Spielen Sie mit Poancare-Serien und SymPy
Fraktal zum Erstellen und Spielen mit Python
Laden Sie csv mit Pandas und spielen Sie mit Index
Spiel mit dem Propheten
Spiele mit PyTorch
Spielen Sie mit 2016-Python
Spielen Sie mit CentOS 8
Spiel mit der Pyramide
Spiel mit Fathom
So schleifen und spielen Sie ein GIF-Video mit openCV ab
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
Spiel mit Othello (Reversi)
Mit und ohne WSGI
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
BASIC und C sowie Assembler-Geschwindigkeitsvergleich und -optimierung spielen mit IchigoJam
Spielen Sie mit Mastodons Archiv in Python 2 Count Antworten und Favoriten
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python