Intégration du calcul de prédiction logP (Oct 2024)
SPGoO YS – PK
- Article: https://www.nature.com/articles/s42004-021-00528-9
- Site de réf A : https://deepchem.readthedocs.io/en/latest/index.html
- Site de réf B : https://github.com/nadinulrich/log_P_prediction/tree/main
Objectif de cette action :
Intégrer le code calcul fourni par le site en référence A dans la plateforme EMOLGINE pour permettre des évaluations de logP des différentes états des molécules ionisables afin de calculer le logD d’une molécule ionisable ce qui correspondant au logP en tenant de tous les états ionisés à ph=7.
Installation à partir du git
git clone https://github.com/nadinulrich/log_P_prediction/tree/main
(base) ystroppa@ystroppa-Latitude-5510:~/ICOA/log_P_prediction$ tree
.
├── Corrections.xlsx
├── Dataset_and_Predictions.xlsx
├── DNN_mono
│ └── model.pickle
├── DNN_taut
│ └── model.pickle
├── Exporing_chemical_datasets_DNN_log_P.py
├── Extraction_and_preparation_of_the_raw_data.txt
├── LICENSE
├── logP.yml
└── readme.md
Première tentative sur une Vm Ubuntu 22. 04
Rechargement dans un contexte anaconda à partir du fichier logP.yml qui s’appuie sur une version 3.5.6 de python. Problème, cette version n’est plus supportée donc impossible de la mettre en place même sous anaconda.
Tentative de monter à la version 3.9 mais trop de problème de compatibilité des autres librairies., de plus problème avec la version de deepchem qui ne présente plus les mêmes fonctions.
Deuxième tentative
Partir d’une version conteneurisée de deepchem pour restaurer le même environnement de 2018. Consultation du site docker de deepchem https://hub.docker.com/r/deepchemio/deepchem/tags et consultation des solutions en place. On opte dans un premier temps pour celle de 2018 2.0.0-cpu
#docker pull deepchemio/deepchem:2.0.0-cpu
#docker run --rm -it -v /home/ystroppa/ICOA/log_P_prediction/:/root/mydir deepchemio/deepchem:2.0.0-cpu
Dans cette commande on monte le répertoire dans lequel se trouve les sources du github dans le contexte du conteneur via l’option -v.
Une fois sur le conteneur on dispose de l’environnement souhaité et on peut exécuter la commande suivante pour lancer la production du modèle.
#python Exporing_chemical_datasets_DNN_log_P.py
Quelques erreurs surviennent car il manque des lignes et de déclarations de variables dans le code.
Adaptation du code pour les déclarations de variables et la récupération des données
Parmi l’ensemble des fichiers plusieurs éléments importants : le fichier xlsx qui contient les données pour la préparation de modèle qu’il faut extraire (deux colonnes SMILES et logP ) pour reconstituer le fichier data.csv sous le répertoire data.
On réadapte la fonction de lecture en venant compléter les lignes manquantes :
#Define working directory
working_directory="/root/mydir"
model_dir = working_directory
#Define prediction task and directory of .csv file
#csv file should include SMILES and the prediction task
prediction_tasks = ['logP']
data_directory="/root/mydir/data/"
train_dataset, test_dataset = read_data(data_directory)
def read_data(input_file_path):
input_file_path+="data.csv"
featurizer = dc.feat.ConvMolFeaturizer(use_chirality=True)
loader = dc.data.CSVLoader(tasks=prediction_tasks, smiles_field="SMILES", featurizer=featurizer)
dataset = loader.featurize(input_file_path, shard_size=8192)
# Initialize transformers
transformer = dc.trans.NormalizationTransformer(transform_w=True, dataset=dataset)
print("About to transform data")
dataset = transformer.transform(dataset)
splitter = dc.splits.RandomSplitter()
# Splitting dataset into train and test datasets
dataset1 = splitter.train_test_split(dataset)
return dataset1
Une fois ces deux problèmes réglés il en reste un autre à la fin du fichier qu’il faut corriger c’est l’exposant de r² qui n’est pas interprété par la version de python.
Problème :
File "Exporing_chemical_datasets_DNN_log_P.py", line 186, in <module>
print("Train r\xb2: %f" % train_scores)
UnicodeEncodeError: 'ascii' codec can't encode character '\xb2' in position 7: ordinal not in range(128)
Remplacer les deux de r² par r ^ 2
print("Train r²: %f" % train_scores)
print("Train r^2: %f" % train_scores)
Résultats obtenus à partir de la configuration A :
root@c204a7c0bbee:~/mydir# python Exporing_chemical_datasets_DNN_log_P.py
Loading raw samples now.
shard_size: 8192
About to start loading CSV from /root/mydir/data/data.csv
Loading shard 1 of size 8192.
Featurizing sample 0
Featurizing sample 1000
Featurizing sample 2000
Featurizing sample 3000
Featurizing sample 4000
Featurizing sample 5000
Featurizing sample 6000
Featurizing sample 7000
Featurizing sample 8000
TIMING: featurizing shard 0 took 29.827 s
Loading shard 2 of size 8192.
Featurizing sample 0
Featurizing sample 1000
Featurizing sample 2000
Featurizing sample 3000
Featurizing sample 4000
TIMING: featurizing shard 1 took 20.689 s
TIMING: dataset construction took 56.177 s
Loading dataset from disk.
About to transform data
TIMING: dataset construction took 7.856 s
Loading dataset from disk.
fin de transform
TIMING: dataset construction took 6.790 s
Loading dataset from disk.
TIMING: dataset construction took 3.191 s
Loading dataset from disk.
2024-10-08 18:48:29.419655: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 AVX512F FMA
/miniconda/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py:97: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.
"Converting sparse IndexedSlices to a dense Tensor of unknown shape. "
Avec 60 Epochs
Epoch number: 0
Epoch number: 1
Epoch number: 58
Epoch number: 59
Evaluating on train data
Epoch number: 0
computed_metrics: [0.9517886791324378]
computed_metrics: [0.556083694593303]
Train r^2: 0.951789
Train rms: 0.556084
Evaluating on test data
Epoch number: 0
computed_metrics: [0.9372460490989268]
computed_metrics:Objectif de cette action : [0.6062835926549927]
Test r^2: 0.937246
Test rms: 0.606284
Avec 100 Epochs
Epoch number: 0
Epoch number: 1
Epoch number: 98
Epoch number: 99
valuating on train data
Epoch number: 0
computed_metrics: [0.9613516179000574]
computed_metrics: [0.3872050821129295]
Train r^2: 0.961352
Train rms: 0.387205
Evaluating on test data
Epoch number: 0
computed_metrics: [0.9498574583889254]
computed_metrics: [0.4310948172386415]
Test r^2: 0.949857
Test rms: 0.431095
Fichier data csv exporté à partir du fichier Dataset_and_Predictions.xlsx
SMILES,logP
CCC1(NC(=O)N(C)C1=O)c1ccccc1,1.69
[H]N1C(=O)N(C(=O)C1(C1=C([H])C([H])=C([H])C([H])=C1[H])C([H])([H])C([H])([H])[H])C([H])([H])[H],1.69
CCC1(NC(=O)N(C)C1=O)C1=CC=CC=C1,1.69
[H]OC1=NC(C(=O)N1C([H])([H])[H])(C1=C([H])C([H])=C([H])C([H])=C1[H])C([H])([H])C([H])([H])[H],1.69
CCC1(N=C(O)N(C)C1=O)C1=CC=CC=C1,1.69
CCN(CC)C(O)=C1CN(C)[C@@H]2CC3=CNC4=CC=CC(=C34)C2=C1,2.95
Perspectives d’amélioration
Plusieurs axes d’amélioration sont possibles :
- on travaille actuellement à partir de 12710 molécules pour lesquelles on connaît de logP expérimental ce qui constitue une partie de la base d’apprentissage et de test avec une répartition 8000 et 4000. Cette base constituée en 2018 pourrait être augmentée …. pour avoir une base de connaissance plus importante.
- autre piste c’est l’utilisation des modèles, actuellement les modèles testés sont DNNtaut, DNNmono, KOWWIN, OCHEM, ALOGPS, JChem, DataWarrior, ACD GALAS, COSMO-RS il y a peut-être des modèles supplémentaires que l’on pourrait évaluer.
- action de portage du code dans un contexte 2024 avec la dernière version de Deepchem et des librairies associées de type tensorflow …