{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## DataLoader & Leaderboard\n", "\n", "[Tianfan Fu@Gatech](futianfan.github.io)\n", "\n", "Agenda\n", "\n", "- How to load dataset in TDC?\n", " - Example for `single_pred` ML problem\n", " - Example for `multi_pred` ML problem\n", " - Example for `generation` ML problem\n", "- Run ML models using few lines of codes\n", " - with scikit-learn\n", " - with DeepPurpose\n", "- How to use leaderboard in TDC?\n", " - ADMET leaderboard\n", "\n", "Let's start!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How to load dataset in TDC?\n", "\n", "Supposed a dataset X is from therapeutic task Y with machine learning problem Z, then to obtain the data and splits, simply type:\n", "\n", "```python\n", "from tdc.Z import Y\n", "data = Y(name = 'X')\n", "split = data.split()\n", "```\n", "\n", "We categorize all therapeutic tasks into three general ML problems (Z):\n", "- `single_pred`: Prediction of property for an individual biomedical entity (e.g., a molecule or a protein), output is a scalar, e.g., molecule property prediction. \n", "- `multi_pred`: Prediction of property for multiple biomedical entities, output is a scalar, e.g., drug-target interaction. \n", "- `generation`: Generation of a new desirable biomedical entity, output is a biomedical entity, e.g., molecule generation, reaction prediction. \n", "\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `single_pred`: Prediction of property for an individual biomedical entity." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] } ], "source": [ "from tdc.single_pred import ADME ### ADME predicts absorption, distribution, metabolism, excretion of a drug. \n", "data = ADME(name = 'Caco2_Wang') ### absorption: Caco-2 Cell Effective Permeability" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Drug_IDDrugY
0(-)-epicatechinOc1cc(O)c2c(c1)OC(c1ccc(O)c(O)c1)C(O)C2-6.220000
1(2E,4Z,8Z)-N-isobutyldodeca-2,4,10-triene-8 -y...C/C=C\\C#CCC/C=C\\C=C\\C(=O)NCC(C)C-3.860000
2codeineCOc1ccc2c3c1O[C@H]1[C@@H](O)C=C[C@H]4[C@@H](C2...-4.090000
3creatinineCN1CC(=O)NC1=N-5.935409
4danazolC#C[C@]1(O)CC[C@H]2[C@@H]3CCC4=Cc5oncc5C[C@]4(...-4.840000
\n", "
" ], "text/plain": [ " Drug_ID \\\n", "0 (-)-epicatechin \n", "1 (2E,4Z,8Z)-N-isobutyldodeca-2,4,10-triene-8 -y... \n", "2 codeine \n", "3 creatinine \n", "4 danazol \n", "\n", " Drug Y \n", "0 Oc1cc(O)c2c(c1)OC(c1ccc(O)c(O)c1)C(O)C2 -6.220000 \n", "1 C/C=C\\C#CCC/C=C\\C=C\\C(=O)NCC(C)C -3.860000 \n", "2 COc1ccc2c3c1O[C@H]1[C@@H](O)C=C[C@H]4[C@@H](C2... -4.090000 \n", "3 CN1CC(=O)NC1=N -5.935409 \n", "4 C#C[C@]1(O)CC[C@H]2[C@@H]3CCC4=Cc5oncc5C[C@]4(... -4.840000 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.get_data().head(5) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we can also flag `convert_format` to other molecule representation. For example, ECFP4:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Drug_IDDrugDrug_ECFP4Y
0(-)-epicatechinOc1cc(O)c2c(c1)OC(c1ccc(O)c(O)c1)C(O)C2[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...-6.220000
1(2E,4Z,8Z)-N-isobutyldodeca-2,4,10-triene-8 -y...C/C=C\\C#CCC/C=C\\C=C\\C(=O)NCC(C)C[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...-3.860000
2codeineCOc1ccc2c3c1O[C@H]1[C@@H](O)C=C[C@H]4[C@@H](C2...[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...-4.090000
3creatinineCN1CC(=O)NC1=N[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...-5.935409
4danazolC#C[C@]1(O)CC[C@H]2[C@@H]3CCC4=Cc5oncc5C[C@]4(...[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, ...-4.840000
\n", "
" ], "text/plain": [ " Drug_ID \\\n", "0 (-)-epicatechin \n", "1 (2E,4Z,8Z)-N-isobutyldodeca-2,4,10-triene-8 -y... \n", "2 codeine \n", "3 creatinine \n", "4 danazol \n", "\n", " Drug \\\n", "0 Oc1cc(O)c2c(c1)OC(c1ccc(O)c(O)c1)C(O)C2 \n", "1 C/C=C\\C#CCC/C=C\\C=C\\C(=O)NCC(C)C \n", "2 COc1ccc2c3c1O[C@H]1[C@@H](O)C=C[C@H]4[C@@H](C2... \n", "3 CN1CC(=O)NC1=N \n", "4 C#C[C@]1(O)CC[C@H]2[C@@H]3CCC4=Cc5oncc5C[C@]4(... \n", "\n", " Drug_ECFP4 Y \n", "0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... -6.220000 \n", "1 [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... -3.860000 \n", "2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... -4.090000 \n", "3 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... -5.935409 \n", "4 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, ... -4.840000 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = ADME(name = 'Caco2_Wang', convert_format = 'ECFP4')\n", "data.get_data().head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also get other format from \n", "- string, e.g., SMILES, SELFIES\n", "- graph, e.g., DGL, PyG (torch-geometric), Graph2D\n", "- feature vector, e.g., ECFP2/ECFP4/ECFP6/MACCS/Daylight/RDKit2D/Morgan/PubChem" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n", "Using backend: pytorch\n" ] }, { "data": { "text/plain": [ "Graph(num_nodes=21, num_edges=46,\n", " ndata_schemes={}\n", " edata_schemes={})" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = ADME(name = 'Caco2_Wang', convert_format = 'DGL')\n", "data.get_data()['Drug_DGL'][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `multi_pred`: Prediction of property for multiple biomedical entities." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Protein1_IDProtein1Protein2_IDProtein2Y
0ENSG00000102119MDNYADLSDTELTTLLRRYNIPHGPVVDLNSTRGDADMYDLPKKED...ENSG00000176435MRPAFALCLLWQALWPGPGGGEHPTADRAGCSASGACYSLHHATMK...1
1ENSG00000157110MNNGGKAEKENTPSEANLQEEEVRTLFVSGLPLDIKPRELYLLFRP...ENSG00000227151MEEPRPSKRLRSMAPNQASGGPPPEPGCCVADPEGSVEADGPAQPA...1
\n", "
" ], "text/plain": [ " Protein1_ID Protein1 \\\n", "0 ENSG00000102119 MDNYADLSDTELTTLLRRYNIPHGPVVDLNSTRGDADMYDLPKKED... \n", "1 ENSG00000157110 MNNGGKAEKENTPSEANLQEEEVRTLFVSGLPLDIKPRELYLLFRP... \n", "\n", " Protein2_ID Protein2 Y \n", "0 ENSG00000176435 MRPAFALCLLWQALWPGPGGGEHPTADRAGCSASGACYSLHHATMK... 1 \n", "1 ENSG00000227151 MEEPRPSKRLRSMAPNQASGGPPPEPGCCVADPEGSVEADGPAQPA... 1 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tdc.multi_pred import PPI ### protein-protein interaction\n", "data = PPI(name = 'HuRI') ## HUman Reference Interactome (HuRI) \n", "## Luck, K., Kim, D., Lambourne, L. et al. A reference map of the human binary protein interactome. Nature 580, 402–408 (2020).\n", "split = data.get_split()\n", "split['valid'].head(2) \n", "### protein ID is ensembl ID" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lots of functionalities such as negative pair sampling, graph transformation, label units conversion and so on! Checkout https://tdcommons.ai/functions/data_process" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `generation`: Generation of a new desirable biomedical entity. \n", "\n", "Output is an entity, instead of a scalar. \n", "\n", "- molecule generation: generating novel and diverse molecules given molecule library. \n", "- molecule optimization: generating molecules with desirable properties. \n", "- retrosynthesis/synthesis: for a chemical reaction, given product/a set of reactants, predict reactants set/product. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
smiles
0CCCS(=O)c1ccc2[nH]c(=NC(=O)OC)[nH]c2c1
1CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1
\n", "
" ], "text/plain": [ " smiles\n", "0 CCCS(=O)c1ccc2[nH]c(=NC(=O)OC)[nH]c2c1\n", "1 CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tdc.generation import MolGen\n", "data = MolGen(name = 'MOSES')\n", "# Polykovskiy et al. “Molecular Sets (MOSES): A Benchmarking Platform for Molecular Generation Models.”, Frontiers in Pharmacology. (2020).\n", "split = data.get_split()\n", "split['train'].head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For molecule optimization, we also have lots of oracles within one line of code! \n", "https://tdcommons.ai/functions/oracles/\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n" ] }, { "data": { "text/plain": [ "[2.706977149048555, 2.8548373344538067, 2.659973244931228]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tdc import Oracle\n", "oracle = Oracle(name = 'SA') ### Synthetic Accessibility \n", "oracle(['CC(C)(C)[C@H]1CCc2c(sc(NC(=O)COc3ccc(Cl)cc3)c2C(N)=O)C1', \\\n", " 'CCNC(=O)c1ccc(NC(=O)N2CC[C@H](C)[C@H](O)C2)c(C)c1', \\\n", " 'C[C@@H]1CCN(C(=O)CCCc2ccccc2)C[C@@H]1O'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other generation task includes retrosynthesis and reaction outcome prediction:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inputoutput
0COC(=O)CCC(=O)c1ccc(OC2CCCCO2)cc1OC1=COCCC1.COC(=O)CCC(=O)c1ccc(O)cc1O
1COC(=O)c1cccc(-c2nc3cccnc3[nH]2)c1COC(=O)c1cccc(C(=O)O)c1.Nc1cccnc1N
\n", "
" ], "text/plain": [ " input output\n", "0 COC(=O)CCC(=O)c1ccc(OC2CCCCO2)cc1O C1=COCCC1.COC(=O)CCC(=O)c1ccc(O)cc1O\n", "1 COC(=O)c1cccc(-c2nc3cccnc3[nH]2)c1 COC(=O)c1cccc(C(=O)O)c1.Nc1cccnc1N" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tdc.generation import RetroSyn ## given the produt, pred the reaktant, \n", "data = RetroSyn(name = 'USPTO-50K')\n", "split = data.get_split()\n", "split['train'].head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The goal of TDC is to make ML-ready dataset. Next, we use ML-ready examples to demonstrate how easy to use TDC for ML models. \n", "\n", "\n", "### ML-Ready example (I): Scikit-learn\n", "TDC allows rapid prototyping of ML methods. Here is an example using scikit-learn to predict ADMET prediction within minutes on LR (logistic regression) with ECFP2!\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] } ], "source": [ "import numpy as np\n", "from tdc.single_pred import ADME\n", "data = ADME(name = 'HIA_Hou', convert_format='ECFP2')\n", "split = data.get_split(method = 'random', seed = 42, frac = [0.7, 0.1, 0.2])\n", "train_data, valid_data, test_data = split['train'], split['valid'], split['test']" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Drug_IDDrugDrug_ECFP2Y
0MebeverineCCN(CCCCOC(=O)c1ccc(OC)c(OC)c1)[C@@H](C)Cc1ccc...[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...1
1Zanamivir.molCC(=O)N[C@H]1[C@@H]([C@@H](O)[C@H](O)CO)OC(C(=...[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...0
2Flurazepam.molCCN(CC)CCN1C(=O)CN=C(c2ccccc2F)c2cc(Cl)ccc21[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...1
3SalsalateO=C(Oc1ccccc1C(=O)O)c1ccccc1O[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...1
4Desogestrel.molC#C[C@@]1(O)CC[C@H]2[C@@H]3CCC4=CCCC[C@@H]4[C@...[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...1
\n", "
" ], "text/plain": [ " Drug_ID Drug \\\n", "0 Mebeverine CCN(CCCCOC(=O)c1ccc(OC)c(OC)c1)[C@@H](C)Cc1ccc... \n", "1 Zanamivir.mol CC(=O)N[C@H]1[C@@H]([C@@H](O)[C@H](O)CO)OC(C(=... \n", "2 Flurazepam.mol CCN(CC)CCN1C(=O)CN=C(c2ccccc2F)c2cc(Cl)ccc21 \n", "3 Salsalate O=C(Oc1ccccc1C(=O)O)c1ccccc1O \n", "4 Desogestrel.mol C#C[C@@]1(O)CC[C@H]2[C@@H]3CCC4=CCCC[C@@H]4[C@... \n", "\n", " Drug_ECFP2 Y \n", "0 [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 1 \n", "1 [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 0 \n", "2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 1 \n", "3 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 1 \n", "4 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... 1 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_data.head(5)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "roc-auc: 0.7580032555615844\n" ] } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import roc_auc_score\n", "# load data\n", "X_train, y_train = np.stack(train_data.Drug_ECFP2.values), train_data['Y'].values\n", "X_test, y_test =np.stack(test_data.Drug_ECFP2.values), test_data['Y'].values\n", "\n", "# initialize model\n", "lr = LogisticRegression(fit_intercept=True, max_iter=10, random_state=42, solver='liblinear')\n", "\n", "# train your model\n", "lr.fit(X_train, y_train)\n", "\n", "# predict and get accuracy\n", "y_pred = lr.predict(X_test)\n", "roc_auc = roc_auc_score(y_test, y_pred)\n", "\n", "print(\"roc-auc:\", roc_auc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "logistic regression is not state-of-the-art, then we introduce a more recent package DeepPurpose. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ML-ready example (II): DeepPurpose\n", "\n", "Scikit-learn only has simple models. Molecular machine learning SOTA is on GNNs! Here is an example using turn-key GNN for molecular machine learning by a package called DeepPurpose, which is a Deep Learning Based Molecular Modeling and Prediction Toolkit. Using DeepPurpose, we can rapidly build model prototypes for various drug discovery tasks covered in TDC, such as ADME, Tox, HTS, Developability prediction, DTI, DDI, PPI, Antibody Affinity predictions. \n", "\n", "Note that DeepPurpose is developed by two of the core teams in TDC, Kexin and Tianfan, and it is now published in Bioinformatics. To start with this tutorial, please follow [DeepPurpose instructions](https://github.com/kexinhuang12345/DeepPurpose#install--usage) to set up the necessary packages. DeepPurpose also provides [tutorials](https://github.com/kexinhuang12345/DeepPurpose/blob/master/Tutorial_1_DTI_Prediction.ipynb) for you to familiarize with it. \n", "\n", "### DeepPurpose Installation\n", "\n", "```bash\n", "conda create -n DeepPurpose python=3.6\n", "conda activate DeepPurpose\n", "conda install -c conda-forge rdkit\n", "pip install git+https://github.com/bp-kelley/descriptastorus \n", "pip install DeepPurpose\n", "pip install PyTDC --upgrade\n", "```\n", "\n", "We assume now you have set up the right environment. Now, we show you how to build an ADME predictor using Message Passing Neural Network (MPNN)! \n", "\n", "### Predicting HIA using MPNN with 10 Lines of Code\n", "\n", "First, let's load DeepPurpose and TDC:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:No normalization for BCUT2D_MWHI\n", "WARNING:root:No normalization for BCUT2D_MWLOW\n", "WARNING:root:No normalization for BCUT2D_CHGHI\n", "WARNING:root:No normalization for BCUT2D_CHGLO\n", "WARNING:root:No normalization for BCUT2D_LOGPHI\n", "WARNING:root:No normalization for BCUT2D_LOGPLOW\n", "WARNING:root:No normalization for BCUT2D_MRHI\n", "WARNING:root:No normalization for BCUT2D_MRLOW\n" ] } ], "source": [ "from DeepPurpose import utils, CompoundPred\n", "from tdc.single_pred import ADME" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, you can get the HIA dataset from TDC. HIA is from ADME task from Single-instance prediction and we want to predict whether or not can a compound be absorped in human intestinal, i.e. given SMILES X, predict 1/0. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found local copy...\n", "Loading...\n", "Done!\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Drug Property Prediction Mode...\n", "in total: 578 drugs\n", "encoding drug...\n", "unique drugs: 578\n", "Done.\n" ] } ], "source": [ "# load dataset in DeepPurpose format\n", "X, y = ADME(name = 'HIA_Hou').get_data(format = 'DeepPurpose')\n", "\n", "# transformation of data formats to get ready for DGL_GIN_AttrMasking\n", "drug_encoding = 'DGL_GIN_AttrMasking' ### a pretraining strategy, pretrained GNN, Hu et al 2020. \n", "train, val, test = utils.data_process(X_drug = X, \n", " y = y, \n", " drug_encoding = drug_encoding,\n", " random_seed = 'TDC')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can build and train model within 4 lines of code, in less than 1 minute. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading gin_supervised_masking_pre_trained.pth from https://data.dgl.ai/dgllife/pre_trained/gin_supervised_masking.pth...\n", "Pretrained model loaded\n", "Let's use CPU/s!\n", "--- Data Preparation ---\n", "--- Go for Training ---\n", "Training at Epoch 1 iteration 0 with loss 0.68574. Total time 0.0 hours\n", "Validation at Epoch 1 , AUROC: 0.87955 , AUPRC: 0.98278 , F1: 0.93577\n", "Training at Epoch 2 iteration 0 with loss 0.33972. Total time 0.00361 hours\n", "Validation at Epoch 2 , AUROC: 0.93277 , AUPRC: 0.99073 , F1: 0.93577\n", "Training at Epoch 3 iteration 0 with loss 0.32077. Total time 0.00722 hours\n", "Validation at Epoch 3 , AUROC: 0.90756 , AUPRC: 0.98487 , F1: 0.95145\n", "Training at Epoch 4 iteration 0 with loss 0.17391. Total time 0.01111 hours\n", "Validation at Epoch 4 , AUROC: 0.87114 , AUPRC: 0.97285 , F1: 0.94000\n", "Training at Epoch 5 iteration 0 with loss 0.16028. Total time 0.01416 hours\n", "Validation at Epoch 5 , AUROC: 0.82913 , AUPRC: 0.94314 , F1: 0.92929\n", "--- Go for Testing ---\n", "Testing AUROC: 0.9062706270627062 , AUPRC: 0.9850101116006439 , F1: 0.9308755760368664\n", "--- Training Finished ---\n" ] }, { "data": { "image/png": "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yEF798bRseMHrFzpNEh40031ee21K6lUqXiQI8sbEhISiI2NJT4+PtihGJNvFC5cmMqVK1OoUM49G2aJIweVKVOEsmWLUqNGScaM6UrXrrWDHVKeEhsbS2RkJNWrV7fyH2NygKqyb98+YmNjqVGjRo4t1xLHWVBVPv74D1q2rMQFF5RBRPjoo+soUaKwPfmdDfHx8ZY0jMlBIkKZMmXYs2dPji7Xyjiyaf36vVx++Yf06fMF9903m5Ntfp13XqQljbNgScOYnOWP35RdcWRRfHwiL774EyNGLOTEiSTKlCnCf/7TONhhGWNMwFjiyIL58zfTr99sNm7cD8AddzThpZc6UaZM0SBHZowxgWO3qjzatesI3btPZuPG/dSvX44ff+zLO+9cY0kjnwkNDaVJkyY0aNCAqKgoRo0aRXJycsr0xYsX0759e2rXrk2zZs3o1q0bf/zxBwBDhgzhlVde8bSeXbt2ccstt1CzZk0uvPBC2rRpwxdffAHADz/8QPfu3QGYNGkSISEhrFy5MuW9DRs2ZOvWrRku/3//+x8iwty5c1PGbd26lcmTJ6cML1++nDlz5qT19pQ4RIR33nnnjOV63U5fkyZNYsCAAWeMj4mJ4YMPPsjy8tJz4403snnz5hxbXk775ptvqFOnDrVq1WLEiBFpznPgwAGuu+46GjduTMuWLVm1alXKtDvuuIPy5cvTsGHD097zyCOP8P333/s19pPsiiMDycmKiHOPsEKFcxg2rAPJycrDD7exBgn9rPrjs/2y3K0jumU4vUiRIixfvhyA3bt3c8stt3Do0CGGDh3Krl276NGjB5MnT+aiiy4C4Oeff2bTpk00atTIcwyqyrXXXsttt92WciDftm0bM2fOTHP+ypUrM3z4cKZNm+Z5HVOmTKFt27ZMmTKFK6+8EjiVOG655RbASRxLly6la9euZ7w/MTERgEaNGjFt2jTuvPNOAKZOnUpUVJTnOLyIjo7OsWWtXr2apKQkatas6fk9SUlJhIYG5veclJRE//79+fbbb6lcuTItWrTg6quvpn79+qfN98ILL9CkSRO++OIL1q1bR//+/fnuu+8A6Nu3LwMGDODWW2897T33338/d999N5dddpnft8OuONKxfPk/XHTROynNngM89tjFPP54W0saBUT58uWZMGECY8aMQVUZM2YMt912W0rSAGjbti3X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+7//o1atWlx00UV89tlnp1Uxff7556lcuXLKKy0iwowZM1iwYAE1atSgZcuW3HbbbZleTYSHh/PAAw+we/fudOeZMmUK11133WnjbrjhBiZPnkzjxo0JCwsjKiqK1157jQ4dOrBmzZqUwvGMXHTRRWlWAnjuuedo1aoVnTp1om7duinjH330URo1akTDhg1p167daTWx6tSpw8cff8xNN93Epk2bMlzvSffddx979uyhcePGjBw5ksaNG1OiRIkz5uvWrVvKVU9UVBRNmzalQYMG3HHHHSm3olIrV64ckyZNolevXjRu3JjWrVuzbt06SpYsyd13302jRo249tpradGihadYMxIWFsaYMWO48sorqVevHj169KBBgwaAc5UWExMDwNq1a2nQoAF169bl66+/Pu1WaK9evWjTpg3r16+ncuXKKdWlExIS2LhxY4ZXrjlFzraWQLBFnFdbj+/80/P8+/bF8fjj85k48X/ceWdTJk48M9ub4Fi7di316tULdhgmF0pKSiIhIYHChQuzadMmOnbsyIYNGwgPDz9tvmPHjtGhQwcWLlwYsCq2ucUXX3zB77//znPPPXfGtLR+WyKyTFWzlWUKTBmHqvLBByt45JFv2bs3jkKFQqhYMRJVtcJvY3K5uLg4OnToQEJCAqrK+PHjz0ga4JRxDB06lB07dlC1atUgRBo8iYmJDBo0KCDrKhCJY926vURHz2LBgm0AtG9fnfHju1G3btkgR2bys3379qXUxff13XffUaZMmbNefqtWrTh+/Php4z788MMsPYyYV0RGRqb53EZaTtbsKmhuuummgK0r3yeO2Nh/iYqK4cSJJMqWLcqrr15Bnz72XEZulZ+uAMuUKZNSm8gf0qr/b0xq/iiOyPeJo3Ll4vTp05iQEGHEiMspXdr/VdVM9hQuXJh9+/ZRpkyZfJM8jAmmk9WxCxcunKPLzXeF4zt3HmbgwLlERzenffvqgNPmlPX3nftZ17HG5Lz0uo61wnEgKSmZ8eOX8uST3/Pvv8fZuHE/S5bcjYhY0sgjChUqlKPdWxpj/COgDyyISGcRWS8iG0Xk8TSmi4i84U5fKSKeGvT5/fedtG79Dvff/zX//nucq666gM8/72G3O4wxxg8CdsUhIqHAWKATEAssEZGZqrrGZ7YuQG331QoY7/5NV+K/J2jR4m2Sk5XKlYvz5ptd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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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gXNL1XGgkQVX0BoCG4CCsCwZSDOzZKA+sCYxYVesli1bMm7cOMaMGYO7M2bMGK688sqSZAEwcOBAzjvvvLj2+/7775OSkrLHibJdu3bccMMNZdY/++yzmT9/Pl9//XWk/bs7kydPZvz48bz99tsld8jceuutfPjhh2RlZTF69Ghuv/12Jk2aRFZWFpMmTeLOO+9k+PDh/PjHP2bo0KEAtG3blp07d7J27VrcnTfffJMzzjij5FiPPvooffv2JTMzkwsvvJC8vDwAnn/+ebp3705mZiYnnnjiXjG+/vrrDBgwgPXr1+/RMzvppJO45ZZb6NevH0ceeSQffvghAHl5eVxyySX07NmTSy+9lP79+zNr1qy99jthwgTOPff7f7q/+MUv6NOnD926deOOO+4oWd++fXvuvvtuBg4cyPPPP8/bb7/NgAED6N27NxdffDHbtm0D4O6776Zv3750796d4cOH4+6R/gb7MnPmTDp16kTHjh1JSUlhyJAhvPLKK3vVW7BgAYMGDQLg6KOPZvny5axdu5aFCxdy7LHHUr9+fZKTk/nRj35U0jNt164dubm5fPfddwcVo1RPiXwOozWwKmY5G+hfqs4YYApBMmgEXOruRcBqM3sAWAnsAN5297fLOoiZDQeGQ3Ai2p8D9QQSpWPHjhQVFbFu3Trmz5/PlVdeedD7nD9/Pr17945cv06dOvz2t7/l/vvv58knnzxg/Y8++ogOHTpwxBFHcNJJJzF16lQuuOACRo0axQMPPMBrr70GQKtWrZg1axZjxowBgiG1zz77jOnTp5OWlsa0adOAYIjn+eefp1evXvTu3Zt69eqVHOuCCy7g2muvBeAPf/gDjz/+ODfccAN33303b731Fq1bt2bTpk17xPfSSy/x4IMPMnXqVJo1a7ZX/AUFBcycOZOpU6dy11138e677/K3v/2NZs2aMXfuXObNm0dWVtY+237ZZZeVLN93330ccsghFBYWMmjQIObOnUvPnj2B4IG26dOns379ei644ALeffddGjRowOjRo3nwwQe5/fbbGTlyJLfffjsAV1xxBa+99ho/+clP9jjmhAkT+POf/7xXLJ06dWLy5Ml7rFu9ejVt2rQpWc7IyGDGjBl7bZuZmcmLL77IwIEDmTlzJitWrCA7O5vu3bvz+9//ntzcXNLS0pg6dSp9+vQp2a5379589NFH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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "config = utils.generate_config(drug_encoding = drug_encoding, \n", " train_epoch = 10, \n", " LR = 0.001, \n", " batch_size = 32,\n", " mpnn_hidden_size = 200,\n", " mpnn_depth = 5)\n", "model = CompoundPred.model_initialize(**config)\n", "model.train(train, val, test)\n", "model.save_model('./tutorial_model')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Leaderboard \n", "\n", "Every dataset in TDC is a benchmark, and we provide training, validation, and test sets for it, together with data splits and performance evaluation metrics. To participate in the leaderboard for a specific benchmark, follow these steps:\n", "\n", "- Use the TDC benchmark data loader to retrieve the benchmark.\n", "\n", "- Use training and/or validation set to train your model.\n", "\n", "- Use the TDC model evaluator to calculate the performance of your model on the test set.\n", "\n", "- Submit the test set performance to a TDC leaderboard.\n", "\n", "\n", "## ADMET leaderboard\n", "\n", "ADMET is a cornerstone of small molecule drug discovery, defining drug efficacy and toxicity profile. An ML model that could accurately predict all ADMET properties using structural information of compounds would be greatly valuable.\n", "We formulate the ADMET Benchmark Group using 22 ADMET datasets in TDC. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tdc.benchmark_group import admet_group\n", "\n", "# get the benchmark group class\n", "group = admet_group(path = 'data/')\n", "\n", "# get specific benchmark in the benchmark group\n", "benchmark = group.get('Caco2_Wang')\n", "\n", "# get data splits\n", "predictions = {}\n", "name = benchmark['name']\n", "train_val, test = benchmark['train_val'], benchmark['test']\n", "\n", "## --- train your model --- ##\n", "\n", "# get model prediction on test set\n", "predictions[name] = y_pred\n", "\n", "# call TDC evaluator\n", "group.evaluate(predictions)\n", "# {'caco2_wang': {'mae': 0.234}}\n", "# submission-ready format" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have four leaderboards! Checkout https://tdcommons.ai/benchmark/overview/!\n", "\n", "More tutorials are available at https://github.com/mims-harvard/TDC/tree/main/tutorials" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" } }, "nbformat": 4, "nbformat_minor": 4 }