{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "[INFO 05-10 14:48:43] ipy_plotting: Injecting Plotly library into cell. Do not overwrite or delete cell.\n" ] }, { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os\n", "os.chdir('../')\n", "\n", "import DeepPurpose.CompoundPred as property_pred\n", "from DeepPurpose.utils import *\n", "from DeepPurpose.dataset import *\n", "\n", "from sklearn.metrics import mean_squared_error, roc_auc_score, average_precision_score, f1_score\n", "\n", "\n", "import numpy as np\n", "\n", "from ax.plot.contour import interact_contour, plot_contour\n", "from ax.plot.trace import optimization_trace_single_method\n", "from ax.service.managed_loop import optimize\n", "from ax.utils.notebook.plotting import render, init_notebook_plotting\n", "from ax.utils.tutorials.cnn_utils import load_mnist, train, evaluate, CNN\n", "\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "init_notebook_plotting()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drug Property Prediction Mode...\n", "in total: 3328 drugs\n", "encoding drug...\n", "unique drugs: 1694\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n", "Drug Property Prediction Mode...\n", "in total: 201 drugs\n", "encoding drug...\n", "unique drugs: 201\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n", "Drug Property Prediction Mode...\n", "in total: 202 drugs\n", "encoding drug...\n", "unique drugs: 202\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n" ] } ], "source": [ "fold_n = 1\n", "balanced = True\n", "train = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/train.csv')\n", "dev = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/dev.csv')\n", "test = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/test.csv')\n", "\n", "if balanced:\n", " # oversample balanced training\n", " train = pd.concat([train[train.activity == 1].sample(n = len(train[train.activity == 0]), replace=True), train[train.activity == 0]]).sample(frac = 1).reset_index(drop = True)\n", "\n", "X_train = train.smiles.values\n", "y_train = train.activity.values\n", "X_dev = dev.smiles.values\n", "y_dev = dev.activity.values\n", "X_test = test.smiles.values\n", "y_test = test.activity.values\n", "\n", "drug_encoding = 'Morgan'\n", "train = data_process(X_drug = X_train, y = y_train, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)\n", "\n", "val = data_process(X_drug = X_dev, y = y_dev, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)\n", "\n", "test = data_process(X_drug = X_test, y = y_test, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def run_Morgan(parameterization): \n", " config = generate_config(drug_encoding = drug_encoding, \n", " cls_hidden_dims = [parameterization['cls_hidden_dims']], \n", " train_epoch = 10, \n", " LR = parameterization['LR'], \n", " batch_size = parameterization['batch_size'],\n", " decay = parameterization['decay']\n", " )\n", " \n", " model = property_pred.model_initialize(**config)\n", " model.train(train, val, test, verbose = False)\n", " \n", " scores = model.predict(test, verbose = False)\n", " return average_precision_score(test.Label.values, scores)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# easy tuning " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[INFO 05-10 14:48:44] ax.modelbridge.dispatch_utils: Using Sobol generation strategy.\n", "[INFO 05-10 14:48:44] ax.service.managed_loop: Started full optimization with 20 steps.\n", "[INFO 05-10 14:48:44] ax.service.managed_loop: Running optimization trial 1...\n", "[INFO 05-10 14:48:57] ax.service.managed_loop: Running optimization trial 2...\n", "[INFO 05-10 14:49:08] ax.service.managed_loop: Running optimization trial 3...\n", "[INFO 05-10 14:49:24] ax.service.managed_loop: Running optimization trial 4...\n", "[INFO 05-10 14:49:35] ax.service.managed_loop: Running optimization trial 5...\n", "[INFO 05-10 14:49:47] ax.service.managed_loop: Running optimization trial 6...\n", "[INFO 05-10 14:50:01] ax.service.managed_loop: Running optimization trial 7...\n", "[INFO 05-10 14:50:20] ax.service.managed_loop: Running optimization trial 8...\n", "[INFO 05-10 14:50:32] ax.service.managed_loop: Running optimization trial 9...\n", "[INFO 05-10 14:50:46] ax.service.managed_loop: Running optimization trial 10...\n", "[INFO 05-10 14:51:00] ax.service.managed_loop: Running optimization trial 11...\n", "[INFO 05-10 14:51:19] ax.service.managed_loop: Running optimization trial 12...\n", "[INFO 05-10 14:51:29] ax.service.managed_loop: Running optimization trial 13...\n", "[INFO 05-10 14:51:44] ax.service.managed_loop: Running optimization trial 14...\n", "[INFO 05-10 14:52:00] ax.service.managed_loop: Running optimization trial 15...\n", "[INFO 05-10 14:52:14] ax.service.managed_loop: Running optimization trial 16...\n", "[INFO 05-10 14:52:32] ax.service.managed_loop: Running optimization trial 17...\n", "[INFO 05-10 14:52:46] ax.service.managed_loop: Running optimization trial 18...\n", "[INFO 05-10 14:52:57] ax.service.managed_loop: Running optimization trial 19...\n", "[INFO 05-10 14:53:13] ax.service.managed_loop: Running optimization trial 20...\n" ] } ], "source": [ "best_parameters, values, experiment, model = optimize(\n", " parameters=[\n", " {\"name\": \"LR\", \"type\": \"range\", \"bounds\": [1e-6, 1e-3], \"log_scale\": False},\n", " {\"name\": \"decay\", \"type\": \"range\", \"bounds\": [0.0, 0.2], \"log_scale\": False},\n", " {\"name\": \"cls_hidden_dims\", \"type\": \"choice\", \"values\": [32, 64, 128, 256, 512]},\n", " {\"name\": \"batch_size\", \"type\": \"choice\", \"values\": [64, 128, 256]}\n", " ],\n", " evaluation_function=run_Morgan,\n", " objective_name='accuracy',\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'LR': 0.00017391057281102986,\n", " 'decay': 0.13253133054822683,\n", " 'cls_hidden_dims': 256,\n", " 'batch_size': 128}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "best_parameters" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'accuracy': 0.567285785786404}, {'accuracy': {'accuracy': 0.0}})" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "means, covariances = values\n", "means, covariances" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "hoverinfo": "none", "legendgroup": "", "line": { "width": 0 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ], "y": [ 54.896028666621696, 54.896028666621696, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395 ] }, { "fill": "tonexty", "fillcolor": "rgba(128,177,211,0.3)", "legendgroup": "mean", "line": { "color": "rgba(128,177,211,1)" }, "mode": "lines", "name": "mean", "type": "scatter", "x": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ], "y": [ 54.896028666621696, 54.896028666621696, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395 ] }, { "fill": "tonexty", "fillcolor": "rgba(128,177,211,0.3)", "hoverinfo": "none", "legendgroup": "", "line": { "width": 0 }, "mode": "lines", "showlegend": false, "type": "scatter", "x": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ], "y": [ 54.896028666621696, 54.896028666621696, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.034234323550145, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395, 56.728578578640395 ] } ], "layout": { "showlegend": true, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Model performance vs. # of iterations" }, "xaxis": { "title": { "text": "Iteration" } }, "yaxis": { "title": { "text": "Classification Accuracy, %" } } } }, "text/html": [ "
\n", " \n", " \n", "
\n", " \n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "best_objectives = np.array([[trial.objective_mean*100 for trial in experiment.trials.values()]])\n", "best_objective_plot = optimization_trace_single_method(\n", " y=np.maximum.accumulate(best_objectives, axis=1),\n", " title=\"Model performance vs. # of iterations\",\n", " ylabel=\"Classification Accuracy, %\",\n", ")\n", "render(best_objective_plot)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# for more customized optimization and plotting" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "import numpy as np\n", "import argparse\n", "import datetime\n", "from ax import ParameterType, ChoiceParameter, RangeParameter, FixedParameter, SearchSpace, SimpleExperiment, modelbridge, models\n", "from ax.plot.contour import interact_contour, plot_contour\n", "from ax.plot.diagnostic import interact_cross_validation\n", "from ax.plot.scatter import interact_fitted, plot_objective_vs_constraints\n", "from ax.plot.slice import plot_slice\n", "from ax.modelbridge.cross_validation import cross_validate\n", "from ax.plot.trace import optimization_trace_single_method\n", "from plotly.offline import plot" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Running Sobol initialization trials...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 1/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 2/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 3/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 4/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 5/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 6/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 7/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 8/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 9/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 10/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 11/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 12/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 13/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 14/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 15/16...\n", "========================================\n", "\n", "\n", "Running GP+EI optimization trial 16/16...\n", "========================================\n", "\n" ] } ], "source": [ "opt_trials = 16\n", "init_trials = 5\n", "dset = 'Morgan'\n", "\n", "# Search space\n", "search_space = SearchSpace(parameters=[\n", " RangeParameter(\n", " name='LR', parameter_type=ParameterType.FLOAT, \n", " lower=1e-6, upper=1e-3, log_scale=False),\n", " RangeParameter(\n", " name='decay', parameter_type=ParameterType.FLOAT, \n", " lower=0, upper=0.2, log_scale=False),\n", " ChoiceParameter(\n", " name='batch_size', parameter_type=ParameterType.INT, \n", " values=[64, 128, 256]), \n", " ChoiceParameter(\n", " name='cls_hidden_dims', parameter_type=ParameterType.INT, \n", " values=[64, 128, 256, 512]), \n", "])\n", "\n", "# Create Experiment\n", "exp = SimpleExperiment(\n", " name = 'Morgan',\n", " search_space = search_space,\n", " evaluation_function = run_Morgan,\n", " objective_name = 'accuracy',\n", ")\n", "\n", "# Run the optimization and fit a GP on all data\n", "sobol = modelbridge.get_sobol(search_space=exp.search_space)\n", "print(f\"\\nRunning Sobol initialization trials...\\n{'='*40}\\n\")\n", "for _ in range(init_trials):\n", " exp.new_trial(generator_run=sobol.gen(1))\n", "\n", "for i in range(opt_trials):\n", " print(f\"\\nRunning GP+EI optimization trial {i+1}/{opt_trials}...\\n{'='*40}\\n\")\n", " gpei = modelbridge.get_GPEI(experiment=exp, data=exp.eval())\n", " exp.new_trial(generator_run=gpei.gen(1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# each plot will be opened in a html tab " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best arm:\n", " Arm(name='16_0', parameters={'LR': 0.00043294545493323936, 'decay': 0.08204705377971983, 'batch_size': 64, 'cls_hidden_dims': 256})\n" ] }, { "data": { "text/plain": [ "'Ax_output/Morgan/0510-145936/cv_plot.html'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output_dir = os.path.join('Ax_output', dset, datetime.datetime.now().strftime('%m%d-%H%M%S'))\n", "os.makedirs(output_dir)\n", "\n", "# Save all experiment parameters \n", "df = exp.eval().df\n", "df.to_csv(os.path.join(output_dir, 'exp_eval.csv'), index=False)\n", "\n", "# Save best parameter\n", "best_arm_name = df.arm_name[df['mean'] == df['mean'].max()].values[0]\n", "exp_arm = {k:v.parameters for k, v in exp.arms_by_name.items()}\n", "exp_arm['best'] = best_arm_name\n", "print('Best arm:\\n', str(exp.arms_by_name[best_arm_name]))\n", "with open(os.path.join(output_dir, 'exp_arm.json'), 'w') as f: \n", " json.dump(exp_arm, f)\n", "\n", "# Contour Plot\n", "os.makedirs(os.path.join(output_dir, 'contour_plot'))\n", "for metric in ['accuracy']:\n", " contour_plot = interact_contour(model=gpei, metric_name=metric)\n", " plot(contour_plot.data, filename=os.path.join(output_dir, 'contour_plot', '{}.html'.format(metric)))\n", "\n", "# Slice Plot\n", "# show the metric outcome as a function of one parameter while fixing the others\n", "os.makedirs(os.path.join(output_dir, 'slice_plot'))\n", "for param in [\"LR\", \"decay\"]:\n", " slice_plot = plot_slice(gpei, param, \"accuracy\")\n", " plot(slice_plot.data, filename=os.path.join(output_dir, 'slice_plot', '{}.html'.format(param)))\n", "\n", "# Tile Plot\n", "# the effect of each arm\n", "tile_plot = interact_fitted(gpei, rel=False)\n", "plot(tile_plot.data, filename=os.path.join(output_dir, 'tile_plot.html'))\n", "\n", "# Cross Validation plot\n", "# splits the model's train data into train/test folds and makes out-of-sample predictions on the test folds.\n", "cv_results = cross_validate(gpei)\n", "cv_plot = interact_cross_validation(cv_results)\n", "plot(cv_plot.data, filename=os.path.join(output_dir, 'cv_plot.html'))\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# use the selected parameter." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def run_Morgan(fold_n, balanced, parameterization):\n", " \n", " train = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/train.csv')\n", " dev = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/dev.csv')\n", " test = pd.read_csv('./aicures_data/train_cv/fold_'+str(fold_n)+'/test.csv')\n", " \n", " if balanced:\n", " # oversample balanced training\n", " train = pd.concat([train[train.activity == 1].sample(n = len(train[train.activity == 0]), replace=True), train[train.activity == 0]]).sample(frac = 1).reset_index(drop = True)\n", " \n", " X_train = train.smiles.values\n", " y_train = train.activity.values\n", " X_dev = dev.smiles.values\n", " y_dev = dev.activity.values\n", " X_test = test.smiles.values\n", " y_test = test.activity.values\n", " \n", " drug_encoding = 'Morgan'\n", " train = data_process(X_drug = X_train, y = y_train, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)\n", "\n", " val = data_process(X_drug = X_dev, y = y_dev, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)\n", "\n", " test = data_process(X_drug = X_test, y = y_test, \n", " drug_encoding = drug_encoding,\n", " split_method='no_split', \n", " random_seed = 1)\n", " \n", " config = generate_config(drug_encoding = drug_encoding, \n", " cls_hidden_dims = [parameterization['cls_hidden_dims']], \n", " train_epoch = 10, \n", " LR = parameterization['LR'], \n", " batch_size = parameterization['batch_size'],\n", " decay = parameterization['decay']\n", " )\n", " \n", " model = property_pred.model_initialize(**config)\n", " model.train(train, val, test)\n", " \n", " scores = model.predict(test)\n", " \n", " return roc_auc_score(test.Label.values, scores), average_precision_score(test.Label.values, scores), scores, test.Label.values" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drug Property Prediction Mode...\n", "in total: 3328 drugs\n", "encoding drug...\n", "unique drugs: 1694\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n", "Drug Property Prediction Mode...\n", "in total: 201 drugs\n", "encoding drug...\n", "unique drugs: 201\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n", "Drug Property Prediction Mode...\n", "in total: 202 drugs\n", "encoding drug...\n", "unique drugs: 202\n", "drug encoding finished...\n", "do not do train/test split on the data for already splitted data\n", "Let's use CPU/s!\n", "--- Data Preparation ---\n", "--- Go for Training ---\n", "Training at Epoch 1 iteration 0 with loss 0.69255. Total time 0.0 hours\n", "Validation at Epoch 1 , AUROC: 0.79187 , AUPRC: 0.53684 , F1: 0.36363\n", "Training at Epoch 2 iteration 0 with loss 0.55604. Total time 0.00027 hours\n", "Validation at Epoch 2 , AUROC: 0.78553 , AUPRC: 0.53354 , F1: 0.57142\n", "Training at Epoch 3 iteration 0 with loss 0.02210. Total time 0.00055 hours\n", "Validation at Epoch 3 , AUROC: 0.77030 , AUPRC: 0.31726 , F1: 0.0\n", "Training at Epoch 4 iteration 0 with loss 0.00274. Total time 0.00083 hours\n", "Validation at Epoch 4 , AUROC: 0.78426 , AUPRC: 0.45020 , F1: 0.4\n", "Training at Epoch 5 iteration 0 with loss 0.01539. Total time 0.00111 hours\n", "Validation at Epoch 5 , AUROC: 0.78807 , AUPRC: 0.53458 , F1: 0.57142\n", "Training at Epoch 6 iteration 0 with loss 0.00025. Total time 0.00166 hours\n", "Validation at Epoch 6 , AUROC: 0.76903 , AUPRC: 0.31680 , F1: 0.0\n", "Training at Epoch 7 iteration 0 with loss 0.00206. Total time 0.00194 hours\n", "Validation at Epoch 7 , AUROC: 0.78807 , AUPRC: 0.53560 , F1: 0.57142\n", "Training at Epoch 8 iteration 0 with loss 0.00017. Total time 0.00222 hours\n", "Validation at Epoch 8 , AUROC: 0.78680 , AUPRC: 0.45226 , F1: 0.4\n", "Training at Epoch 9 iteration 0 with loss 0.00035. Total time 0.0025 hours\n", "Validation at Epoch 9 , AUROC: 0.78426 , AUPRC: 0.45020 , F1: 0.4\n", "Training at Epoch 10 iteration 0 with loss 0.00020. Total time 0.00305 hours\n", "Validation at Epoch 10 , AUROC: 0.79568 , AUPRC: 0.55345 , F1: 0.57142\n", "--- Go for Testing ---\n", "Testing AUROC: 0.6626139817629179 , AUPRC: 0.539919932901533 , F1: 0.6363636363636364\n", "--- Training Finished ---\n", "predicting...\n" ] }, { "data": { "image/png": "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+HGKFClCiRIl2L9/P3Pnzs1WXHXr1mXr1nO9UMfGxqY23k+ZMiXD17Vv357333+fkydPAk510oEDB4iNjaVUqVJERESwceNGli1blu7rR40axZo1ay54pE0a4CTdGTNmEB8fz44dO9iyZQuNGze+oNytt97KDz/8AMDixYtTE0OXLl1SzzxOnz7Nr7/+St26dQE4fPgwZcuWzdGuRTJSYM845s/fSsuW1QgLC6FMmQhmzepGvXplKVHC99namLysUqVKqVVNnoYNG0bv3r2Jjo4mIiKCDz/8MN3X9+/fn549exIdHU3Dhg2Jjo6mRIkS1KpVi4YNG3LllVdyxRVX0KxZs2zFVadOHWJjY1Orap588kl69uzJyJEjad26dYava9euHRs2bEhtoC5atCjTpk2jQ4cOTJgwgejoaKKiomjSpEm24knPlVdeyZ133km9evUICQlh7NixqVdUderUicmTJ3P55ZczZMgQ7r77bkaNGkXRokWZPHky4CTHDh06EB0dTVBQEA888EBqu87ChQsvqD70FcnotDGvCKtQS+P3bvG6/O7dsfzzn/P48suNvPRSK555prkPozMmZ2zYsCH1l2Vel5SUREJCAuHh4Wzbto02bdqwefNmQkMv/Z6oUaNGUaxYsVx/L4cvdO3alVdffZWoqAt7skjv+BGRVara6GK2VWDOOBITkxk9+leee24hp04lULRoKKVLW3fnxvjb6dOnadWqFQkJCagq48ePz5GkAdCvXz9mzpyZI+vKS86ePcutt96abtLwhQJxxrFsWQx9+37D77/vB+D22+vy9tsdqFjxwvpXY3Kj/HTGYfzPzjiy6ddfY7j++vdQhWrVSjJmTEc6d64d6LCMyTZVtY4OTbb54uQg3yeOxo0r0r59TRo2vIxnnmlORITvrzgwJqeFh4dz+PBh61rdZEvKeBw5fYluvquq2rLlMAMHzmfkyPbUru3cqJOcrNa3lMnTbARAc7EyGgHQqqqA+PhEXnvtJ1599Sfi45MIDw/hs8/uBLCkYfK8QoUK5egIbsZcCr/eACgiHURkk4hsFZEL7o4RkTAR+cRd/quIVPNmvd9/v53o6AkMG7aY+PgkevduwIQJuaerZ2OMyU/8dsYhIsHAWOAmIAZYISKzVHW9R7H7gaOqWlNEugGvA/+X2XoTj8XTtu1HANStG8mECed6szXG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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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2ezv6uKLL860LV++nKOPPrrx+eDBg1m+fHmzv+tvf/vbXHHFFZx44on84Ac/oFu3bixfvpw777yTRx55ZLtgqK6uLmhvaUeKFgySpgHHAQMk1QCXAl0BIuJG4F7gNJL7xa4DzilWbWaWnxEjRrB06VKmTZvGaaedlpn3+OOPN254TzjhBFauXEldXR0AY8aMoXv37o39LrjgAgAOO+ywxg0/wPTp05kyZQoNDQ289tprLFy4sHH+pz71KQA++MEP8oc//GG72l577TUGDtx2sdC6ujrOPvtsFi1ahCTq6+sb5330ox+lX7/ktuEPPvggDz74ICNHjgRgzZo1LFq0iFGjRnH99ddz5513ArBs2TIWLVq0XTBcd911ef/+mruVcnOfGrryyit597vfzaZNm5g0aRJXXXUVl1xyCRdeeCFXXXVVs4ee9t57b1asaJ+DLMX8VNKEVuYH8G9FKses08rnnX1HGjNmDF/96leZNWsWK1eubGzf0UavR48eO+wHsGTJEq655hrmzJlD3759mThxYubz9926dQOgrKyMhoaG7Zbv3r17pv93v/tdjj/+eO68806WLl3Kcccd1zivaT3f/OY3+eIXv5hZ36xZs3j44Yd58sknqaqq4rjjjmv2+wCF7DEMHjyYZcu2fcampqaGffbZZ7tlBw0a1Djmc845h2uuuQZI9orGjx8PwJtvvsm9995LeXk5Y8eOZcOGDY3h21a+VpKZFeTcc8/lkksu4f3vf3+mfdSoUdx6661AslEdMGAAvXv33m75j3zkI0yfPh1ITsb+7W9/A2DVqlX06NGDPn368Prrr3PfffcVVNfBBx/M4sWLG5/X1dU1nhyfOnVqi8udcsop3HzzzaxZswZIDve88cYb1NXV0bdvX6qqqnjhhRd46qmnml3+uuuu47nnntvup2koQBKqt912Gxs3bmTJkiUsWrSIo446art+r72WHEWPCO66667GQ2RLlixh6dKlLF26lHHjxnHDDTcwduxYAF566aXMobS22JXOMZhZJzB48ODGQ0G5LrvsMs455xxGjBhBVVUVv/rVr5pd/ktf+hJnn302I0aMYOTIkYwYMYI+ffowdOhQRo4cyaGHHsp73vOegk+iDh8+nLq6OlavXk2vXr34+te/ztlnn821117LCSec0OJyJ598Ms8//3zjCeCePXtyyy23MHr0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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": [ "roc, prc, scores, labels = run_Morgan(1, True, best_parameters)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# We thank Chih-Ying Deng and Ax tutorials for the scripts on BO." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7" } }, "nbformat": 4, "nbformat_minor": 4 }