[PYTHON] Jouez avec PDBBind de MoleculeNet et RDKitGridFeaturizer de DeepChem

introduction

DeepChem contient des données de MolculeNet (http://moleculenet.ai/), qui vous permet d'essayer l'apprentissage automatique avec des composés. Parmi les différentes données de Molecule Net, celle qui brille exceptionnellement est la donnée appelée "PDB Bind". La raison pour laquelle cela a changé est que les autres données sont les «données composées» stockées dans sdf et sourient comme données d'entraînement, alors que c'est l'état de liaison de la protéine et du ligand (le composé qui se lie spécifiquement à la protéine). C'est parce qu'il apprend des données. Bien sûr, Featurizer est également différent des autres, et il utilise quelque chose de différent de celui d'un ensemble de données normal tel que "RDKitGridFeaturizer".

Cette fois, j'ai téléchargé le jeu de données PDBBind localement et j'ai essayé de le mettre en vedette avec RDKitGridFeaturier.

environnement

En plus de Deep Chem, vous avez besoin d'un PDB Fixer pour l'exécuter. La méthode d'installation de PDB Fixer est la suivante.

$ conda install -c omnia pdbfixer

Préparation préalable

Cliquez sur le lien "PDBBind" sur http://moleculenet.ai/datasets-1 pour télécharger le jeu de données, donc décompressez-le dans un emplacement approprié. La capacité est assez grande. En passant, le format de chaque donnée est sdf (et mol2) pour le ligand et le format pdb pour la protéine.

La source

Le fichier appelé load_pdbdataset.py de deepchem est détourné et les parties inutiles sont supprimées. Puisque la source originale est utilisée presque telle quelle, non seulement RdkitGridFeaturizer mais aussi ComplexNequartListFragmentAtomicCoordinates, AtomicConvFeaturizer, etc. peuvent être spécifiés. RDKitGridFeaturizer peut spécifier «ecfp», «splif», «hbond», «salt_bridge», «pi_stack», «cation_pi» et «charge» comme feature_type.

Veuillez lire le chemin, etc. en fonction de votre propre environnement.

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

Courir

Une fois exécuté, il sera affiché dans features.shape, des fonctionnalités comme celle-ci. Cela indique qu'il existe cinq données d'entraînement et qu'une donnée d'apprentissage a 18944 caractéristiques dimensionnelles.

(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.]]

Lorsque le nombre de dimensions pour chaque feature_type a été examiné en modifiant la spécification de feature_types, c'était comme suit.

En fait, il est aplati à une dimension, mais vous pouvez voir la dimension d'origine en définissant l'argument aplatir de rgf.RdkitGridFeaturizer sur False. Salt_bridge etc. peut être lié aux coordonnées 3D car 512 dimensions sont à l'origine 8 x 8 x 8.

Jusqu'à ici pour cette fois.

en conclusion

Cette fois, je suis allé au point de préparer les données et de voir le contenu des fonctionnalités, mais malheureusement je n'ai pas pu aller au point de "jouer" avec mes propres données.

La plus grande question semble être que l'état de liaison de la protéine et du ligand dépend des atomes et des liaisons de la protéine / ligand autour de la liaison, mais ce sont des types et des nombres différents en fonction des données d'entraînement, mais mettez en valeur toutes les données d'entraînement Pourquoi les résultats sont-ils dans la même dimension? La seule réponse serait de regarder la source de RDKitGridFeaturizer.

S'il s'agit de données d'entraînement unidimensionnelles, elles peuvent être prédites par une méthode autre que DeepLearning, il peut donc être intéressant d'essayer de les prédire par la méthode d'apprentissage automatique conventionnelle par rapport à MoleculeNet. Il peut également être intéressant de créer un Featurizer qui reflète vos idées en faisant référence à RDKitGridFeaturizer.

Recommended Posts

Jouez avec PDBBind de MoleculeNet et RDKitGridFeaturizer de DeepChem
Jouez avec la série Poancare et SymPy
Fractal pour faire et jouer avec Python
Chargez CSV avec des pandas et jouez avec Index
Jouez avec Prophet
Jouez avec PyTorch
Jouez avec 2016-Python
Jouez avec CentOS 8
Jouez avec Pyramid
Jouez avec Fathom
Comment boucler et lire une vidéo gif avec openCV
[Comment!] Apprenez et jouez à Super Mario avec Tensorflow !!
Jouer avec Othello (Reversi)
Avec et sans WSGI
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
[Jouons avec Python] Traitement d'image en monochrome et points
La comparaison et l'optimisation des vitesses BASIC et C et assembleur jouent avec IchigoJam
Jouez avec les archives de Mastodon dans les réponses et les favoris de Python 2 Count
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python