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