Skip to content
Snippets Groups Projects
IEDB exploration.ipynb 41.2 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import tensorflow as tf\n",
    "import seaborn as sns\n",
    "\n",
    "from mhcflurry.dataset import Dataset\n",
    "from mhcflurry.peptide_encoding import indices_to_hotshot_encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "file_to_explore=\"/root/.local/share/mhcflurry/2/class1_data/combined_human_class1_dataset.csv\"\n",
    "dataset = Dataset.from_csv(\n",
    "        filename=file_to_explore,\n",
    "        sep=\",\",\n",
    "        peptide_column_name=\"peptide\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([u'species', u'allele', u'peptide', u'peptide_length', u'affinity', u'sample_weight'], dtype='object')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = dataset.to_dataframe()\n",
    "df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "affinity\n",
       "77922.077922      530\n",
       "69767.441860      656\n",
       "70000.000000      761\n",
       "77777.777778      796\n",
       "50000.000000      809\n",
       "70422.535211      816\n",
       "78125.000000     1382\n",
       "5000.000000      2124\n",
       "1.000000         3204\n",
       "20000.000000    48651\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.species == 'human'].groupby('affinity').size().order().tail(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "df_reduced = df[df.allele.isin(['HLA-A0201', 'HLA-A2301', 'HLA-A2402', 'HLA-A1101'])][['allele','affinity']].reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes.AxesSubplot at 0x7f2e61cac310>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2e619840d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.violinplot(x=df_reduced['allele'], y=np.log(df_reduced['affinity']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "allele\n",
       "HLA-A0201    12215\n",
       "HLA-A1101     6343\n",
       "HLA-A2301     2509\n",
       "HLA-A2402     3320\n",
       "dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_reduced.groupby('allele').size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df_kmers = dataset.kmer_index_encoding()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "training_hotshot = indices_to_hotshot_encoding(df_kmers[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers import Dense, Activation\n",
    "model = Sequential()\n",
    "model.add(Dense(input_dim=9*21, output_dim=1))\n",
    "model.add(Activation(\"sigmoid\"))\n",
    "model.compile(loss=\"mse\", optimizer=\"rmsprop\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "u'theano'"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras import backend\n",
    "backend._BACKEND"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      " 74449/688472 [==>...........................] - ETA: 638s - loss: 2214902270.2741"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "I/O operation on closed file",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-113-abfac20bed23>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtraining_hotshot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_kmers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnb_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/models.pyc\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, **kwargs)\u001b[0m\n\u001b[1;32m    407\u001b[0m                               \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    408\u001b[0m                               \u001b[0mclass_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mclass_weight\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 409\u001b[0;31m                               sample_weight=sample_weight)\n\u001b[0m\u001b[1;32m    410\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    411\u001b[0m     def evaluate(self, x, y, batch_size=32, verbose=1,\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight)\u001b[0m\n\u001b[1;32m   1050\u001b[0m                               \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcallbacks\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1051\u001b[0m                               \u001b[0mval_f\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mval_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval_ins\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mval_ins\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1052\u001b[0;31m                               callback_metrics=callback_metrics)\n\u001b[0m\u001b[1;32m   1053\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1054\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m32\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, nb_epoch, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics)\u001b[0m\n\u001b[1;32m    794\u001b[0m                     \u001b[0mbatch_logs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    795\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 796\u001b[0;31m                 \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_batch_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_index\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_logs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    797\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    798\u001b[0m                 \u001b[0mepoch_logs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/callbacks.pyc\u001b[0m in \u001b[0;36mon_batch_end\u001b[0;34m(self, batch, logs)\u001b[0m\n\u001b[1;32m     58\u001b[0m         \u001b[0mt_before_callbacks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     59\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mcallback\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcallbacks\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m             \u001b[0mcallback\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_batch_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     61\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_delta_ts_batch_end\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mt_before_callbacks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     62\u001b[0m         \u001b[0mdelta_t_median\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmedian\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_delta_ts_batch_end\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/callbacks.pyc\u001b[0m in \u001b[0;36mon_batch_end\u001b[0;34m(self, batch, logs)\u001b[0m\n\u001b[1;32m    186\u001b[0m         \u001b[0;31m# will be handled by on_epoch_end\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    187\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mverbose\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseen\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'nb_sample'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 188\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprogbar\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseen\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    190\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mon_epoch_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepoch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/keras/utils/generic_utils.pyc\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self, current, values)\u001b[0m\n\u001b[1;32m     66\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mverbose\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     67\u001b[0m             \u001b[0mprev_total_width\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtotal_width\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 68\u001b[0;31m             \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstdout\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"\\b\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mprev_total_width\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     69\u001b[0m             \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstdout\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"\\r\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     70\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/ipykernel/iostream.pyc\u001b[0m in \u001b[0;36mwrite\u001b[0;34m(self, string)\u001b[0m\n\u001b[1;32m    315\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    316\u001b[0m             \u001b[0mis_child\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_master_process\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 317\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    318\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mis_child\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    319\u001b[0m                 \u001b[0;31m# newlines imply flush in subprocesses\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: I/O operation on closed file"
     ]
    }
   ],
   "source": [
    "model.fit(training_hotshot, df_kmers[1], nb_epoch=5, batch_size=1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}