{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "rotary-animation", "metadata": {}, "outputs": [], "source": [ "from itertools import combinations\n", "\n", "import mysql.connector as sql\n", "import numpy as np\n", "import pandas as pd\n", "import scikit_posthocs as sp\n", "import seaborn as sns\n", "from bootstrap import bootstrap_error_estimate\n", "from scipy.stats import gmean\n", "# Model comparison imports\n", "from delong_ci import calc_auc_ci\n", "from mlxtend.evaluate import cochrans_q, mcnemar, mcnemar_table\n", "from mlxtend.evaluate import paired_ttest_5x2cv\n", "#RDKit imports\n", "from rdkit import Chem\n", "from rdkit import Chem\n", "from rdkit.Chem import AllChem\n", "# ML imports\n", "from lightgbm import LGBMClassifier\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import roc_auc_score, roc_curve\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from tqdm.notebook import tqdm" ] }, { "cell_type": "markdown", "id": "exterior-denmark", "metadata": {}, "source": [ "Establish a connection to a local version of the ChEMBL database. " ] }, { "cell_type": "code", "execution_count": 2, "id": "female-principal", "metadata": {}, "outputs": [], "source": [ "con = sql.connect(host='localhost', database='chembl_26', user='pwalters', password='itsasecret')\n", "cursor = con.cursor()" ] }, { "cell_type": "markdown", "id": "appointed-basis", "metadata": {}, "source": [ "Query the ChEMBL database for hERG data. " ] }, { "cell_type": "code", "execution_count": 3, "id": "referenced-momentum", "metadata": {}, "outputs": [], "source": [ "query = \"\"\"select canonical_smiles, cs.molregno, md.chembl_id as mol_chembl_id, standard_relation, standard_value,\n", "standard_type, standard_units, description, td.organism, assay_type, confidence_score,\n", "td.pref_name, td.chembl_id as tgt_chembl_id\n", "from activities act\n", "join assays ass on act.assay_id = ass.assay_id\n", "join target_dictionary td on td.tid = ass.tid\n", "join compound_structures cs on cs.molregno = act.molregno\n", "join molecule_dictionary md on md.molregno = cs.molregno\n", "where ass.tid = 165\n", "and assay_type in ('B','F')\n", "and standard_value is not null\n", "and standard_units = 'nM'\n", "and act.standard_relation is not null\n", "and standard_type = 'IC50'\n", "and standard_relation = '='\"\"\"" ] }, { "cell_type": "code", "execution_count": 4, "id": "retired-accounting", "metadata": {}, "outputs": [], "source": [ "df_ok = pd.read_sql(query,con=con)" ] }, { "cell_type": "markdown", "id": "finnish-paradise", "metadata": {}, "source": [ "A quick sanity check to ensure that we extracted the data correctly. " ] }, { "cell_type": "code", "execution_count": 5, "id": "recent-bunny", "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", " \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", " \n", " \n", " \n", " \n", " \n", "
canonical_smilesmolregnomol_chembl_idstandard_relationstandard_valuestandard_typestandard_unitsdescriptionorganismassay_typeconfidence_scorepref_nametgt_chembl_id
0COCC(=O)O[C@]1(CCN(C)CCCc2nc3ccccc3[nH]2)CCc2c...72035CHEMBL45816=1430.0IC50nMK+ channel blocking activity in COS-7 African ...Homo sapiensF8HERGCHEMBL240
1CC(C)COCC(CN(Cc1ccccc1)c1ccccc1)N1CCCC1112651CHEMBL1008=550.0IC50nMK+ channel blocking activity in COS-7 African ...Homo sapiensF9HERGCHEMBL240
2COc1c(N2C[C@@H]3CCCN[C@@H]3C2)c(F)cc2c(=O)c(C(...1788CHEMBL32=129000.0IC50nMK+ channel blocking activity in Chinese hamste...Homo sapiensF8HERGCHEMBL240
3COc1c(N2CCNC(C)C2)c(F)cc2c(=O)c(C(=O)O)cn(C3CC...1712CHEMBL31=130000.0IC50nMK+ channel blocking activity in Chinese hamste...Homo sapiensF8HERGCHEMBL240
4Cc1c(F)c(N2CCNC(C)C2)cc2c1c(=O)c(C(=O)O)cn2C1CC117136CHEMBL583=104000.0IC50nMK+ channel blocking activity in Chinese hamste...Homo sapiensF8HERGCHEMBL240
\n", "
" ], "text/plain": [ " canonical_smiles molregno mol_chembl_id \\\n", "0 COCC(=O)O[C@]1(CCN(C)CCCc2nc3ccccc3[nH]2)CCc2c... 72035 CHEMBL45816 \n", "1 CC(C)COCC(CN(Cc1ccccc1)c1ccccc1)N1CCCC1 112651 CHEMBL1008 \n", "2 COc1c(N2C[C@@H]3CCCN[C@@H]3C2)c(F)cc2c(=O)c(C(... 1788 CHEMBL32 \n", "3 COc1c(N2CCNC(C)C2)c(F)cc2c(=O)c(C(=O)O)cn(C3CC... 1712 CHEMBL31 \n", "4 Cc1c(F)c(N2CCNC(C)C2)cc2c1c(=O)c(C(=O)O)cn2C1CC1 17136 CHEMBL583 \n", "\n", " standard_relation standard_value standard_type standard_units \\\n", "0 = 1430.0 IC50 nM \n", "1 = 550.0 IC50 nM \n", "2 = 129000.0 IC50 nM \n", "3 = 130000.0 IC50 nM \n", "4 = 104000.0 IC50 nM \n", "\n", " description organism assay_type \\\n", "0 K+ channel blocking activity in COS-7 African ... Homo sapiens F \n", "1 K+ channel blocking activity in COS-7 African ... Homo sapiens F \n", "2 K+ channel blocking activity in Chinese hamste... Homo sapiens F \n", "3 K+ channel blocking activity in Chinese hamste... Homo sapiens F \n", "4 K+ channel blocking activity in Chinese hamste... Homo sapiens F \n", "\n", " confidence_score pref_name tgt_chembl_id \n", "0 8 HERG CHEMBL240 \n", "1 9 HERG CHEMBL240 \n", "2 8 HERG CHEMBL240 \n", "3 8 HERG CHEMBL240 \n", "4 8 HERG CHEMBL240 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ok.head()" ] }, { "cell_type": "markdown", "id": "french-caution", "metadata": {}, "source": [ "Aggregate the results by taking the geometric mean of replicates. " ] }, { "cell_type": "code", "execution_count": 6, "id": "eligible-pressing", "metadata": {}, "outputs": [], "source": [ "grouper = df_ok.groupby([\"canonical_smiles\",\"molregno\"])\n", "data_df = grouper['standard_value'].apply(gmean).to_frame(name = 'IC50').reset_index()" ] }, { "cell_type": "markdown", "id": "electoral-fossil", "metadata": {}, "source": [ "Add a new column with the pIC50" ] }, { "cell_type": "code", "execution_count": 7, "id": "satisfied-hamburg", "metadata": {}, "outputs": [], "source": [ "data_df['pIC50'] = -np.log10(data_df.IC50*1e-9)" ] }, { "cell_type": "markdown", "id": "miniature-advocate", "metadata": {}, "source": [ "Set the \"Active\" field to 1 if the pIC50 >= 5 (10uM), otherwise 0" ] }, { "cell_type": "markdown", "id": "exciting-supervisor", "metadata": {}, "source": [ "Look at counts of active and inactive molecules" ] }, { "cell_type": "code", "execution_count": 8, "id": "abroad-measure", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 4191\n", "0 2048\n", "Name: Active, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_df['Active'] = [1 if x >= 5 else 0 for x in data_df.pIC50]\n", "data_df['Active'].value_counts()" ] }, { "cell_type": "markdown", "id": "geographic-annex", "metadata": {}, "source": [ "Visualize the activity distribution." ] }, { "cell_type": "code", "execution_count": 9, "id": "completed-influence", "metadata": {}, "outputs": [ { "data": { "image/png": "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qRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqZQpvIwfP17//Oc/i13/wQcfaPDgwRUuCgAAoDg1brXy+vXrunz5snP5X//6l0JCQhQYGFiob15enj7++GN9//337q8SAADgJyWGl2HDhik1NVWSZLFY9Pzzz+v5558vsr/D4VCPHj3cXyUAAMBPbhle/P39tWzZMh09elQOh0OrV69WSEiIWrduXaivl5eX/P39uWwEAAAq1S3DiyT17t1bvXv3liSdO3dOjz76qDp27FjphQEAABSlxPDyS1FRUZVVBwAAQKmUKbxI0scff6xdu3YpOTlZubm5hdZbLBb97W9/c0txAAAANytTeNm8ebMWL14sSapfv76sVmulFAUAAFCcMoWX119/XW3atNFf//pXNWjQoLJqAgAAKFaZHlJ3/vx5jRkzhuACAAAMU6bw0rx5cyUnJ1dWLQAAACUqU3iJjIzUpk2b9PXXX1dWPQAAALdUpjkvR44cka+vr4YOHaqWLVvK399fFovFpQ93GwEAgMpUpvDyySefSJIaNWqk69ev6+zZs5VSFAAAQHHKFF4++OCDyqoDAACgVMo05wUAAHiOf/7zn2rdurW6deumrKyscu8nJSVFGRkZzuWnn366yPcYeooyjbyMHz++VP1ef/31chUDAABKLzY2VrVr19aVK1f0wQcfaMCAAWXex0cffaS5c+dq+/btql27tiRpzJgx6t69u7vLdZsyhZfvv/++UFteXp4uX76szMxMNWnSRP/zP//jtuIAuEf88QtKScv/rSyooa/B1QBwh6ysLO3du1dDhw5VbGystm/fXq7w8p///EfXrl1zaevcubM6d+7srlLdzi1zXnJzc7V//34tXLhQv/71r91SGAD3SUnL0sVrNyRJ9X15rQdQHXz00Ue6du2aunXrpitXrmjv3r368ccf1bBhQ6NLq3RumfPi7e2t/v3765FHHtGLL77ojl0CAIBb2LVrlywWi+69916FhIQoNzdX7733XqF+X3zxhSZPnqx7771X3bp1U2RkpE6ePCkpf27LqlWrJEkPPfSQxo0b52wvmPOyZ88etW7dWnv37i2073Hjxqlfv37O5QsXLmjevHm677771L59ew0bNkw7d+50+7G7dcJuixYt9NVXX7lzlwAA4CZpaWn68MMP1alTJzVo0EC9e/eW1WrV9u3bXfodPnxYY8eO1bfffqtf//rXmjZtmr755huNHz9e33//vcaMGaOQkBBJ0oIFCzR16tRCn9W3b1/5+voqLi7Opf2HH37Q4cOHNWTIEEnSxYsX9cgjj+jTTz/VuHHjNH/+fNWrV0+/+93vtG7dOrcef5kuG91KVlaWdu7cqfr167trlwAAoAjx8fHKzMxU//79JUl+fn66//779eGHH+o///mPOnToIEl64YUXVLduXf39739XvXr1JEm9e/fWoEGD9Oabb2revHlq3bq1/vGPf6hfv35q2rRpoc+y2WwKCQnR3r17dePGDdlsNknS+++/r7y8PIWFhUmSVqxYoaysLO3atUt33nmnJOmJJ57QnDlz9Je//EXDhw93W0Zwy91GWVlZOn36tK5du6YZM2a4pTAAAFC0Xbt2SZJz1KTgzx9++KG2b9+uDh06KCUlRUePHlV4eLgzuEhSy5Yt9fe//1133XVXqT8vLCxMO3bs0EcffaTQ0FBJ+ZeTgoOD1apVK+Xl5Wnfvn3q1q2batSooUuXLjm37d+/v2JjY3Xo0CE9/PDDFT10SW6420jKn/MSFBSkIUOG6PHHH3dLYQAgSbLwOCrgl3744Qf961//UosWLWSxWJw/m9u0aSOLxaLdu3drwYIFOnv2rBwOhwIDAwvto23btmX6zO7du6tBgwZ6//33FRoaqnPnzunzzz/X/PnzJUmXL19Wamqq9u3bp3379hW5j/Pnz5fxSIvHE3YBeLba/tKJWCn9pzfa+zaQ7h5ibE2Agfbs2aPc3Fx99913euihhwqtv3r1qvbt26fGjRtLkry8Kv4LgLe3twYOHKi///3vunHjhuLi4mSxWDRo0CBJ+XcdS1JoaKgeffTRIvfRrFmzCtdRoFxzXnJzc3Xs2DGdPXtWVqtVd911l4KDg91WFAC4SE+WUt33WxtgZgV3GS1ZskR+fn4u67766itFR0dr+/btWrx4sSQpMTGx0D6WLVumOnXqKDIystSf+/DDD2vTpk06dOiQ4uLi1LVrVwUEBEiS/P39VatWLeXk5Oj+++932e7cuXP68ssvVatWrbIearHKHF4OHDigRYsW6eLFi3I4HJLy3yR955136tlnn1Xfvn3dVhwAAPjZd999p2PHjqlbt24aNmxYofW9e/fW22+/rUOHDknKv5S0e/duTZs2zRl0kpKS9Prrr+uxxx6T9PPITMHP9OJ06NBBLVq00JYtW3T06FE999xzznU1atRQr169tH//fn311Vdq06aNc92SJUsUHx+v2NhYNWjQoELHX6BMY0mHDx/WjBkz5HA4NGvWLK1evVqrVq3SrFmzZLFYNHPmTCUkJLilMAAA4Kpgou6oUaOKXF+zZk2NHDnS+cyXBQsWKDk5WSNHjtS6desUExOjCRMm6I477tDkyZMl5Y+aSNK6deu0f//+W37+kCFD9OGHH8pqtTon7haYO3eu/Pz8NHbsWC1fvlxvv/22pk6dqvj4eI0ZM8atT+AvU3iJjo5WkyZNFBsbq8jISD300EPq16+fIiMjFRsbqyZNmuiVV15xW3EAAOBnsbGxstvtzlukizJ69Gh5eXlp+/btuu+++/S3v/1NjRo10urVq7V27VoFBwfrrbfecj6Jd/Dgwbr//vu1bdu2Eh80W3BbdJ8+fWS3213WNW/eXFu2bFGfPn20ZcsWPf/880pKStKCBQv07LPPVvDIXZXpstF//vMfTZ8+vVDBUv495qNGjdJf//pXtxUHAAB+Fh8fX2KfJk2a6MSJE87le+65R3/729+K7X/HHXdow4YNLm1LlizRkiVLCvVt0aKF8+m8RQkMDNRLL71UYo0V5dZ7EC0Wi7Kzs925SwAAABdlCi8dO3bUu+++q4yMjELr0tLStHXrVrVv395txQEAANysTJeNnnzySY0fP15DhgzRE088oRYtWkiSTp06pTfffFMXL17UokWLKqNOAAAASWUML126dFF0dLT+9Kc/aenSpbJYLM5bqxo2bKgVK1bovvvuq5RCAQAApHI85+Whhx5Snz59dPz4cecjiQMCAtSxY0fVqOG29zwCAAAUqVRzXt544w2FhYUpJydHUv5jgjt06KBBgwZp//79mjFjht54441KLRQAAEAqIbw4HA7NmzdPixcv1g8//KBz584V6tO0aVN5eXnphRde0OzZsyutUAAAAKmE8LJ161bt3LlTjz/+uD7++GM1b968UJ9Zs2Zp//79Gjp0qOLi4rRjx47KqhUAAKDk8HLvvffqD3/4g3x8fIrt5+Pjo+eff15t2rTR22+/7fYiAQAACtwyvHzzzTdFvm67yB15eSk0NPSWT94DAACoqFuGF29v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nirtovT5m8Z9fqfHpXqBFd7NqVOnNGXKFOXk5LihKC4bAQCASpKTk6PNmzdr1KhRyszMdNt+CS8AAKBSHDlyRC+++KIiIiI0d+5ct+2Xy0YAAKBStGrVSvv27VP9+vW1bds2t+2X8AIAACpFgwYNKmW/XDYCAACmQngBAACmQngBAACmQngBAACmwoRdAAA8lV9A/oPijPx8D0R4AQDAU9W0ueUJt9UNl40AAEClGzFihE6ePFnh9xpJhBcAAGAyhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqNYwuAID7xR+/oJS0LElSUENfg6sBAPcivADVUEpali5euyFJqu9rNbgaAHAvLhsBAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAqF4sfK0B1R2vBwBQvdT2l07ESunJ+cu+DaS7hxhbEwC3IrwAqH7Sk6XU80ZXAaCSML4KAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMpYbRBQCouPjjF5SSliVJCmroa3A1AFC5CC9ANZCSlqWL125Ikur7Wg2uBgAqF5eNAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAFRvFr7mgOqGW6UBVG+1/aUTsVJ6slT/V9KNK/l/lgov+zaQ7h5iVKUASsljfiU5ceKEgoODdeHCBZf2gwcPauTIkerYsaP69u2rmJiYQtsePXpU48aNU+fOndWzZ08tX75c2dnZVVU6AE+Xniylnv85qKSeL3q5IMQA8GgeEV5OnTqlKVOmKCcnx6U9ISFBU6dOVVBQkKKjoxUWFqalS5dq/fr1zj6JiYmaOHGifHx89PLLLysiIkIbNmxQVFRUVR8GAACoAoZeNsrJydE777yjl156STVr1iy0fuXKlWrbtq2WLVsmSerVq5dycnL06quvaty4cbJarVq7dq3sdrvWrFkjq9Wq3r17y2az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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.set_style('whitegrid')\n", "sns.set_context('talk')\n", "sns.displot(data=data_df,x='pIC50',hue='Active',height=7);" ] }, { "cell_type": "markdown", "id": "geological-agent", "metadata": {}, "source": [ "Define a function to get a Morgan fingerprint from a SMILES string" ] }, { "cell_type": "code", "execution_count": 10, "id": "lucky-former", "metadata": {}, "outputs": [], "source": [ "def gen_fp(smi):\n", " mol = Chem.MolFromSmiles(smi)\n", " fp = None\n", " if mol:\n", " fp = AllChem.GetMorganFingerprintAsBitVect(mol,2)\n", " return fp" ] }, { "cell_type": "markdown", "id": "fuzzy-study", "metadata": {}, "source": [ "Enable the \"progress_apply\" function that lets us use a progress bar." ] }, { "cell_type": "code", "execution_count": 11, "id": "further-drama", "metadata": {}, "outputs": [], "source": [ "tqdm.pandas()" ] }, { "cell_type": "code", "execution_count": 12, "id": "automotive-simulation", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8265a6c8dcc043b38124f08e230170a9", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/6239 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "prob = lgbm.predict_proba(test_X)[:,1]\n", "false_pos_rate, true_pos_rate, thresholds = roc_curve(test_Y,prob)\n", "ax = sns.lineplot(x=false_pos_rate,y=true_pos_rate)\n", "ax.set_xlabel(\"True Positive Rate\")\n", "ax.set_ylabel(\"False Positive Rate\")\n", "# add the unity line\n", "linemin = 0\n", "linemax = 1\n", "ax.plot([linemin,linemax],[linemin,linemax],color=\"grey\",linewidth=2,linestyle=\"--\");" ] }, { "cell_type": "markdown", "id": "chronic-filename", "metadata": {}, "source": [ "For 10 folds of cross-validation loop over the different model types, train and test models. " ] }, { "cell_type": "code", "execution_count": 16, "id": "finnish-venice", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "34c5b0f64db740f2bf95c930590d8dee", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/10 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.set(rc={'figure.figsize': (6, 6)})\n", "sns.set_style('whitegrid')\n", "sns.set_context('talk')\n", "ax = sns.barplot(x=\"Method\",y=\"AUC\",data=auc_df)\n", "labels = [x.get_text() for x in ax.get_xticklabels()]\n", "ax.set(xticklabels=labels)\n", "ax.set(ylim=[0,1])\n", "_ = ax.set(xlabel=\"\")" ] }, { "cell_type": "markdown", "id": "alone-shadow", "metadata": {}, "source": [ "Here's a somewhat better approach where we represent the distribution of AUC values as box plots. This is somewhat better, but we're still not making an adequate comparison between methods. " ] }, { "cell_type": "code", "execution_count": 19, "id": "charming-transformation", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.boxplot(x=\"Method\",y=\"AUC\",data=auc_df)" ] }, { "cell_type": "markdown", "id": "opposite-double", "metadata": {}, "source": [ "We can calculate a 95% confidence interval around each AUC using [DeLong's method](https://github.com/yandexdataschool/roc_comparison/blob/master/compare_auc_delong_xu.py). " ] }, { "cell_type": "code", "execution_count": 20, "id": "macro-november", "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", " \n", " \n", " \n", " \n", " \n", " \n", "
CycleMethodAUCLBUB
00KNeighbors0.8043460.7824930.826199
10RandomForest0.8400620.8199910.860134
20LGBM0.8384700.8186400.858301
31KNeighbors0.8172920.7954930.839091
41RandomForest0.8461910.8260620.866320
\n", "
" ], "text/plain": [ " Cycle Method AUC LB UB\n", "0 0 KNeighbors 0.804346 0.782493 0.826199\n", "1 0 RandomForest 0.840062 0.819991 0.860134\n", "2 0 LGBM 0.838470 0.818640 0.858301\n", "3 1 KNeighbors 0.817292 0.795493 0.839091\n", "4 1 RandomForest 0.846191 0.826062 0.866320" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "auc_result = []\n", "for cycle, [truth, prob] in enumerate(zip(truth_list,prob_list)):\n", " for name, p in zip(method_name_list, prob):\n", " truth = np.array([int(x) for x in truth])\n", " auc, (lb, ub) = calc_auc_ci(truth,p[:,1])\n", " auc_result.append([cycle,name, auc, lb, ub])\n", "auc_ci_df = pd.DataFrame(auc_result,columns=[\"Cycle\",\"Method\",\"AUC\",\"LB\",\"UB\"])\n", "auc_ci_df.head()" ] }, { "cell_type": "markdown", "id": "south-element", "metadata": {}, "source": [ "Define a routine for displaying the AUC values and the associated 95% confidence intervals." ] }, { "cell_type": "code", "execution_count": 21, "id": "tired-wheat", "metadata": {}, "outputs": [], "source": [ "def ci_pointplot(input_df, x_col=\"Cycle\", y_col=\"AUC\", hue_col=\"Method\", lb_col=\"LB\", ub_col=\"UB\"):\n", " dodge_val = 0.25\n", " palette_name = \"deep\"\n", " cv_cycles = len(input_df[x_col].unique())\n", " ax = sns.pointplot(x=x_col, y=y_col, hue=hue_col, data=input_df, dodge=dodge_val, join=False, palettte=palette_name)\n", " colors = sns.color_palette(palette_name, len(input_df.Method.unique())) * cv_cycles\n", " ax.axvline(0.5, ls=\"--\", c=\"gray\")\n", " for x in np.arange(0.5, cv_cycles, 1):\n", " ax.axvline(x, ls=\"--\", c=\"gray\")\n", " y_val = input_df[y_col]\n", " lb = y_val - input_df[lb_col]\n", " ub = input_df[ub_col] - y_val\n", " x_pos = []\n", " for i in range(0, cv_cycles):\n", " x_pos += [i - dodge_val / 2, i, i + dodge_val / 2]\n", " _ = ax.errorbar(x_pos, y_val, yerr=[lb, ub], fmt=\"none\", capsize=0, color=colors)" ] }, { "cell_type": "code", "execution_count": 22, "id": "pharmaceutical-commerce", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAAG5CAYAAACX7UWbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAB/FElEQVR4nO3deVhUZf8G8BsQBARXzAUERRMLUEwF11TEBdNKstTMJTXN3cxCzMxWJbcXl9Qy9yV3UxNXXEpNRXPNKEUE3BJQFFGBmfn9wY/JieU85sw85+D9uS6vN885c8537ncivnOe8zw2BoPBACIiIiIiIjIbW9kFEBERERERFTdstIiIiIiIiMyMjRYREREREZGZsdEiIiIiIiIyMzZaREREREREZlZCdgFq9eDBA5w9exYVK1aEnZ2d7HKIiIiIiEhldDodbt68CT8/Pzg6OprsY6NViLNnz6Jnz56yyyAiIiIiIpVbsWIFGjZsaLKNjVYhKlasCCA3tMqVK0uuRpvmzp0LABg8eLDkStRt3bp1AICuXbtKrkTdmJMY5qSMGYlhTmKYkxjmpIwZiVFbTtevX0fPnj2NvcOj2GgVIm+4YOXKleHh4SG5Gm1ydXUFAOanoGzZsgCYkxLmJIY5KWNGYpiTGOYkhjkpY0Zi1JpTQY8acTIMIiIiIiIiM2OjRUREREREZGZstIiIiIiIiMyMz2iRxbRo0UJ2CZrw4osvyi5BE5iTGOakjBmJYU5imJMY5qSMGYnRUk5stMhimjVrJrsETfD29pZdgiYwJzHMSRkzEsOcxDAnMcxJGTMSo6Wc2GiRxZw9exYA4OfnJ7kSdbt+/ToAcBkBBcxJDHNSxozEMCcxzEmMUk537tzB33//jezsbGuWpSo6nQ5AwbPX0T+slVOJEiXg6OiIihUr5luIWPgcZq6JyGjr1q0A2Ggp2b59OwCgb9++cgtROeYkhjkpY0ZimJMY5iSmqJzu3LmDGzduwN3dHU5OTrCxsbFydeqQkpICAHBzc5NcibpZIyeDwYCcnBxkZGQgMTERlSpVQpkyZR77PGy0iIiIiEiav//+G+7u7nB2dpZdChEAwMbGBvb29ihXrhxKliyJ69ev/6dGi7MOEhEREZE02dnZcHJykl0GUYGcnJzw8OHD//RaNlpEREREJNXTOlyQ1O9JPptstIiIiIiIiMyMz2iRxYSEhMguQRPatGkjuwRNYE5imJMyZiSGOYlhTmKYk7LSpUvLLkETtJQTGy2ymIYNG8ouQROqVasmuwRNYE5imJMyZiSGOYlhTmKe1pzGjh2LjRs3wtbWFgcPHkT58uULPO7ll19GXFwcunTpgsmTJz/WNVJTU+Hk5GScTKRXr164cuUKYmJinrj+oljrOv/m4OBg1es9CQ4dJIuJjY1FbGys7DJULykpCUlJSbLLUD3mJIY5KWNGYpiTGOYk5mnPSa/XY+/evQXuS0pKQlxcHIB/1ogStX//fnTo0AFpaWlPXKNWZGVlISsrS3YZQthokcXs3r0bu3fvll2GiavLJuDqsgmyyzCxZ88e7NmzR3YZqsecxDAnZcxIDHMSw5zEPO05eXh4FPr+d+/ebbzT9bgLNp8+fRp37tx54vq05M6dO5p5z2y0iIiIiIgsqE2bNjh06BAePHiQb9+uXbsQHBwsoSqyNDZaREREREQWFBISgvv37+PQoUMm21NTU/Hbb7+hXbt2+V7z22+/4e2330b9+vVRv3599OvXD6dPnzbuHzt2LGbPng0gt5Hr1auXyet/+eUXhIWFwd/fH61atcI333wDvV5vckxcXByGDBmChg0bom7dunjjjTcKHI106NAhdO/eHQEBAQgJCcG2bdv+cxZPEzZaREREREQW1KBBA5QrVy7f8ME9e/bAyckJTZo0Mdl+8OBB9OrVC3fv3sXIkSMxePBgXL16FT179jQ+/96tWze0bdsWABAREYF3333X+PqbN29i+PDhaNy4McaNG4eqVasiKioKS5cuNR5z+vRpdOvWDadPn8bbb7+N0aNHIzs7G0OHDsWKFSuMxx06dAjvvPMO7t69i1GjRqFjx4746KOPcO7cObPnVNxw1kEiIiIiIguys7ND69atsXfvXuj1etja5t7r2LVrF1q1amUyk55er8cnn3wCf39/LF++HHZ2dgCAt956C6+++iq++OILbNq0CfXr14ePjw927dqFkJAQeHh4GM+RlZWF6dOnGxuxzp07o2XLlti1axf69u0LAPjiiy9gY2ODdevWoXLlygCAHj16oEePHvj6668RGhqK8uXLY+rUqahYsSJWr14NFxcXAEDTpk3Rp08flC1b1tLRaRobLbKYTp06yS5BEzp06CC7BE1gTmKYkzJmJIY5iWFOYphT7vC+DRs24OTJ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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.set(rc={'figure.figsize': (14, 7)})\n", "sns.set(font_scale=1.5)\n", "sns.set_style('white')\n", "ci_pointplot(auc_ci_df)" ] }, { "cell_type": "markdown", "id": "conceptual-thinking", "metadata": {}, "source": [ "In addition to using an analytic method for calculating confidence intervals, we can also bootstrap an estimate. " ] }, { "cell_type": "code", "execution_count": 23, "id": "identical-musician", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "52c09cb47e0d4717a8b50c8dcf2a9c55", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/10 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ci_pointplot(bootstrap_df)" ] }, { "cell_type": "markdown", "id": "mechanical-hartford", "metadata": {}, "source": [ "[5x2 cross validation](https://sci2s.ugr.es/keel/pdf/algorithm/articulo/dietterich1998.pdf)" ] }, { "cell_type": "code", "execution_count": null, "id": "apart-principle", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Method_1 Method_2 p-value\n" ] } ], "source": [ "X = np.stack(data_df.fp)\n", "y = data_df.Active.values\n", "classifier_list = []\n", "for method, name in zip(method_list, method_name_list):\n", " if name == \"XGB\":\n", " classifier_list.append(method(use_label_encoder=False, eval_metric='logloss', n_jobs=-1))\n", " else:\n", " classifier_list.append(method(n_jobs=-1))\n", "print(f\"{'Method_1':12s} {'Method_2':12s} {'p-value'}\")\n", "for a,b in combinations(zip(classifier_list,method_name_list),2):\n", " clf1,name1 = a\n", " clf2,name2 = b\n", " t, p = paired_ttest_5x2cv(estimator1=clf1,estimator2=clf2,X=X, y=y, scoring=\"roc_auc\")\n", " print(f\"{name1:12s} {name2:12s} {p:.3f}\")" ] }, { "cell_type": "markdown", "id": "imperial-travel", "metadata": {}, "source": [ "McNemar's test" ] }, { "cell_type": "code", "execution_count": null, "id": "integral-album", "metadata": {}, "outputs": [], "source": [ "mc_result = []\n", "for truth, pred in zip(truth_list,pred_list): \n", " for i,j in combinations(range(len(method_list)),2):\n", " mc, mc_pvalue = mcnemar(mcnemar_table(truth, pred[i], pred[j]))\n", " mc_result.append([method_name_list[i],method_name_list[j], mc_pvalue])\n", "mc_df = pd.DataFrame(mc_result,columns=[\"Method_1\",\"Method_2\",\"p_value\"])\n", "mc_df['Combo'] = mc_df.Method_1 + \"_\" + mc_df.Method_2\n", "for k,v in mc_df.groupby(\"Combo\"):\n", " print(k,v.p_value.mean())" ] }, { "cell_type": "code", "execution_count": null, "id": "stuffed-marina", "metadata": {}, "outputs": [], "source": [ "len(mc_result)" ] }, { "cell_type": "code", "execution_count": null, "id": "preceding-europe", "metadata": {}, "outputs": [], "source": [ "alpha = 0.05/len(pred_list[0])\n", "alpha" ] }, { "cell_type": "code", "execution_count": null, "id": "parliamentary-edinburgh", "metadata": {}, "outputs": [], "source": [ "ax = sns.boxplot(x=\"p_value\",y=\"Combo\",data=mc_df)\n", "ax.set(ylabel=\"\",xlabel=\"p value\")\n", "_ = ax.axvline(alpha,c=\"red\",ls=\"--\")" ] }, { "cell_type": "code", "execution_count": null, "id": "patient-mobile", "metadata": {}, "outputs": [], "source": [] } ], "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.9.1" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 5 }