1574 lines (1573 with data), 138.2 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deep learning in genomics - Basic model with PyTorch"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is based on the [jupyter notebook](https://nbviewer.jupyter.org/github/abidlabs/deep-learning-genomics-primer/blob/master/A_Primer_on_Deep_Learning_in_Genomics_Public.ipynb) from the publication [\"A primer on deep learning in genomics\"](https://www.nature.com/articles/s41588-018-0295-5) but uses the [PyTorch](https://pytorch.org) library."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Notebook setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%reload_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from fastai import *\n",
"from fastai.vision import *"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import LabelEncoder, OneHotEncoder"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import pdb"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import confusion_matrix"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.0.39.dev0'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# fastai version\n",
"__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data setup"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Load data from the web, generate dataframe, and save to disk"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"import requests"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"URL_seq = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/sequences.txt'"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# get sequence data from URL\n",
"seq_raw = requests.get(URL_seq).text.split('\\n')\n",
"seq_raw = list(filter(None, seq_raw)) # Removes empty lists"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check length\n",
"len(seq_raw)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# setup df from list\n",
"seq_df = pd.DataFrame(seq_raw, columns=['Sequences'])"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# show head of dataframe\n",
"#seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"URL_labels = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/labels.txt'"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# get sequence labels from URL\n",
"seq_labels = requests.get(URL_labels).text.split('\\n')\n",
"seq_labels = list(filter(None, seq_labels)) # Removes empty entries"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check length\n",
"len(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# setup pandas series\n",
"seq_label_series = pd.Series(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# add pandas series to pandas dataframe\n",
"seq_df['Target'] = seq_label_series.astype('int')"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sequences</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sequences</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# show head\n",
"seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# save to csv file\n",
"seq_df.to_csv('seq_df.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data frame setup"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# load csv file into pandas data frame\n",
"seq_df = pd.read_csv('seq_df.csv', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sequences</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# show pandas data frame head\n",
"seq_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Target variables setup"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 0, 1, ..., 1, 0, 1, 1])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# setup target a\n",
"targA = seq_df['Target'].values; targA"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, 0, ..., 0, 1, 0, 0])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# setup target b = not(target a)\n",
"targB = np.logical_not(seq_df['Target'].values).astype(int); targB"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([[0, 1], [0, 1], [0, 1], [1, 0]], '...', [[1, 0], [0, 1], [1, 0], [1, 0]])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# zip together target a and target b to get target\n",
"targ = [[a,b] for a, b in zip(targA, targB)]; targ[:4], '...', targ[-4:]#, len(targ)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset setup for training with basic PyTorch"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup sqeuence to array function"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# open sequence array function\n",
"def open_seq_array(seq:str)->List:\n",
" \"Return `List` object with np.array created from sequence string `seq`.\"\n",
" \n",
" int_enc = LabelEncoder() # setup class instance to encode the four different bases to integer values (1D)\n",
" one_hot_enc = OneHotEncoder(categories=[range(4)]) # setup one hot encoder to encode integer encoded classes (1D) to one hot encoded array (4D)\n",
" \n",
" enc = int_enc.fit_transform(list(seq)) # bases (ACGT) to int (0,1,2,3)\n",
" enc = np.array(enc).reshape(-1,1) # reshape to get rank 2 array (from rank 1 array)\n",
" enc = one_hot_enc.fit_transform(enc) # encoded integer encoded bases to sparse matrix (sparse matrix dtype)\n",
" enc = enc.toarray().T # export sparse matrix to np array\n",
" \n",
" return enc"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([[0., 0., 0., 1., ..., 0., 1., 0., 0.],\n",
" [1., 1., 0., 0., ..., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., ..., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., ..., 0., 0., 0., 0.]]), (4, 50))"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test open sequence function\n",
"test_arr = open_seq_array('CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGACACC'); test_arr, test_arr.shape"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAA9CAYAAABWdClAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAAbhJREFUeJzt3cFNwzAYhmESMQTizp0lEBMwJRMgluDeO2KKhgmcguXEzpfnubZq3Ch5Val/3WlZljsAssy9FwBAe+IOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA970O/DK/Nf1p7Mf3V/Gx18fnloeqMvr6trD2nktan4ua816z7rXXI0PtPdz63v+8vk9/eZ5P7gCBxB0gkLgDBBJ3gEDiDhBI3AECTb3+rOP68/TvA48yanbGsUZuqx2hLBnhWtriWi+9Zutxwj3v0y3GJEvmh4tRSICzEneAQOIOEEjcAQKJO0CgbtMyNRuH7fmN9Jo9pxhG33yr9TpGmHAYYUrlltbXdMmRz0XrJoxyLmwcBnBi4g4QSNwBAok7QCBxBwgk7gCBDjUKeQR7bYpUs4Zao4yAHXl8rcboG9S1HpEd/f2OwigkwImJO0AgcQcIJO4AgcQdIJC4AwTqNgoJwHZ8cgcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQL9Al/6fGlF2Jm2AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# visualize opened sequence as 2D image\n",
"plt.imshow(test_arr)\n",
"plt.axis('off');"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 1., 1., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],\n",
" [1., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 1.,\n",
" 0., 0., 1., 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 1.,\n",
" 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0.,\n",
" 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 1., 1., 0., 0.,\n",
" 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,\n",
" 1., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_ten = tensor(test_arr).type(torch.float); test_ten"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# run test data through network\n",
"#net_basic(test_ten[None])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup datasets"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# generate sequence array float tensor for every sequence in pandas data frame column Sequences (x data)\n",
"x = [tensor(open_seq_array(s)).type(torch.float) for s in seq_df['Sequences'].values]; len(x)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([2000, 4, 50])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# stack all tensors together in a single tensor\n",
"x = torch.stack(x); x.shape"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[0., 1.],\n",
" [0., 1.],\n",
" [0., 1.],\n",
" ...,\n",
" [0., 1.],\n",
" [1., 0.],\n",
" [1., 0.]])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# setup target data floar tensor (y data)\n",
"y = tensor(targ).view(-1,2).type(torch.float); y # multi-label\n",
"#y = tensor(targA).type(torch.float); y # classification with single label"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2000, 2000)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# verify total dataset length\n",
"len(x), len(y)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor([[0., 1., 0., 0., 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 1., 1., 1.,\n",
" 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 1., 0.,\n",
" 0., 0., 1., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
" [0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,\n",
" 1., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 1., 1., 0., 1., 0., 0.,\n",
" 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 0.],\n",
" [1., 0., 0., 0., 0., 1., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 1., 0., 0., 0.],\n",
" [0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,\n",
" 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.]]),\n",
" tensor([0., 1.]))"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check x and y data\n",
"i = 2\n",
"x[i], y[i]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"# split dataset into train and valid TensorDataset for NN training\n",
"train_ds = TensorDataset(x[:1500],y[:1500]) # FIRST 1500 data points\n",
"valid_ds = TensorDataset(x[-500:],y[-500:])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"# split dataset into train and valid TensorDataset for NN training\n",
"train_ds = TensorDataset(x[500:],y[500:]) # LAST 1500 data points\n",
"valid_ds = TensorDataset(x[:500],y[:500])"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1500, 500)"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# verify train and valid dataset length\n",
"len(train_ds), len(valid_ds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model setup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic model for PyTorch training"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
"# set dropout\n",
"drop_p = 0.2"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [],
"source": [
"# inplace=True seems to generate problems?"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"net_basic = nn.Sequential(nn.Conv1d(in_channels=4, out_channels=32, kernel_size=12),\n",
" nn.MaxPool1d(kernel_size=4),\n",
" Flatten(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=288, out_features=16),\n",
" nn.ReLU(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=16, out_features=2),\n",
" #Debugger() # optional debugger layer\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Sequential(\n",
" (0): Conv1d(4, 32, kernel_size=(12,), stride=(1,))\n",
" (1): MaxPool1d(kernel_size=4, stride=4, padding=0, dilation=1, ceil_mode=False)\n",
" (2): Lambda()\n",
" (3): Dropout(p=0.2)\n",
" (4): Linear(in_features=288, out_features=16, bias=True)\n",
" (5): ReLU()\n",
" (6): Dropout(p=0.2)\n",
" (7): Linear(in_features=16, out_features=2, bias=True)\n",
")"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check network architecture\n",
"net_basic"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [],
"source": [
"# initialize weights with kaiming normal initialization\n",
"apply_init(net_basic, nn.init.kaiming_normal_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model training"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train basic model with PyTorch"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [],
"source": [
"# set batch size\n",
"bs = 64"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [],
"source": [
"# setup DataLoader for NN training from TensorDatasets for NN training\n",
"train_dl = DataLoader(train_ds, batch_size=bs, shuffle=True)\n",
"valid_dl = DataLoader(valid_ds, batch_size=bs*2, shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [],
"source": [
"# set optimizer type, parameters, and hyperparameters\n",
"opt = optim.SGD(net_basic.parameters(), lr=1e-3, momentum=0.9)"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {},
"outputs": [],
"source": [
"# training loop extended from https://github.com/fastai/fastai_docs/blob/master/dev_nb/mnist_sample.py\n",
"\n",
"\n",
"# simple loss function for batch\n",
"def simple_loss_batch(model, loss_func, xb, yb, opt=None):\n",
" loss = loss_func(model(xb), yb)\n",
"\n",
" if opt is not None:\n",
" loss.backward()\n",
" opt.step()\n",
" opt.zero_grad()\n",
"\n",
" return loss.item(), len(xb)\n",
"\n",
"\n",
"# simple fit function\n",
"def simple_fit(epochs, model, loss_func, opt, train_dl, valid_dl):\n",
" \n",
" epoch_list = []\n",
" train_loss_list = []\n",
" valid_loss_list = []\n",
" acc_list = []\n",
" y_hat_list = []\n",
" y_true_list = []\n",
" \n",
" print('epoch\\ttrain loss\\tvalid loss\\taccuaracy')\n",
" \n",
" for epoch in range(epochs):\n",
" \n",
" model.train()\n",
" train_losses, train_nums = zip(*[simple_loss_batch(model, loss_func, xb, yb, opt) for xb, yb in train_dl])\n",
" \n",
" # loss calculation for every epoch\n",
" train_loss = np.sum(np.multiply(train_losses, train_nums)) / np.sum(train_nums)\n",
" train_loss_list.append(train_loss)\n",
" \n",
" model.eval()\n",
" with torch.no_grad():\n",
" valid_losses, valid_nums = zip(*[simple_loss_batch(model, loss_func, xb, yb)\n",
" for xb,yb in valid_dl])\n",
" \n",
" # calculations for accuracy_thres metric: \n",
" y_hat = [model(xb) for xb, _ in valid_dl]\n",
" y_true = [yb for _, yb in valid_dl]\n",
" \n",
" y_hat_list.append(torch.cat(y_hat).cpu().numpy())\n",
" y_true_list.append(torch.cat(y_true).cpu().numpy())\n",
" \n",
" \n",
" valid_loss = np.sum(np.multiply(valid_losses, valid_nums)) / np.sum(valid_nums)\n",
" acc = accuracy_thresh(torch.cat(y_hat), torch.cat(y_true))\n",
" \n",
" epoch_list.append(epoch)\n",
" valid_loss_list.append(valid_loss)\n",
" acc_list.append(acc.item())\n",
" \n",
" print(f'{epoch}\\t{train_loss:.6f}\\t{valid_loss:.6f}\\t{acc.detach().item():.3f}')\n",
" \n",
" # print training (https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py)\n",
" #pdb.set_trace()\n",
" plt.subplot(2,1,1)\n",
" plt.title('Training')\n",
" plt.ylabel('Loss')\n",
" plt.plot(train_loss_list, label='Train loss')\n",
" plt.plot(valid_loss_list, label='Valid loss')\n",
" plt.legend(loc=1)\n",
" \n",
" plt.subplot(2,1,2)\n",
" plt.xlabel('Training batch')\n",
" plt.ylabel('Accuracy')\n",
" plt.plot(acc_list, label='Accuracy metric')\n",
" plt.legend(loc=1)\n",
" \n",
" plt.show()\n",
" \n",
" #pdb.set_trace()\n",
" \n",
" return epoch_list, train_loss_list, valid_loss_list, acc_list, y_hat_list, y_true_list"
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch\ttrain loss\tvalid loss\taccuaracy\n",
"0\t0.694222\t0.695738\t0.476\n",
"1\t0.693519\t0.695121\t0.486\n",
"2\t0.693069\t0.694395\t0.508\n",
"3\t0.691722\t0.693777\t0.513\n",
"4\t0.692202\t0.693209\t0.521\n",
"5\t0.691258\t0.692685\t0.524\n",
"6\t0.690921\t0.691937\t0.534\n",
"7\t0.691045\t0.691363\t0.537\n",
"8\t0.690861\t0.690807\t0.546\n",
"9\t0.689642\t0.690297\t0.555\n",
"10\t0.689251\t0.689815\t0.565\n",
"11\t0.687875\t0.689231\t0.570\n",
"12\t0.686911\t0.688471\t0.583\n",
"13\t0.687394\t0.687868\t0.591\n",
"14\t0.686514\t0.687217\t0.609\n",
"15\t0.685469\t0.686604\t0.614\n",
"16\t0.685616\t0.685909\t0.610\n",
"17\t0.684902\t0.685263\t0.615\n",
"18\t0.684276\t0.684609\t0.617\n",
"19\t0.683051\t0.683790\t0.613\n",
"20\t0.683000\t0.682929\t0.614\n",
"21\t0.682143\t0.682141\t0.618\n",
"22\t0.681432\t0.681397\t0.622\n",
"23\t0.678602\t0.680407\t0.623\n",
"24\t0.680064\t0.679440\t0.621\n",
"25\t0.679956\t0.678381\t0.625\n",
"26\t0.677532\t0.677434\t0.630\n",
"27\t0.676672\t0.676419\t0.640\n",
"28\t0.676126\t0.675386\t0.662\n",
"29\t0.673430\t0.674054\t0.659\n",
"30\t0.672878\t0.672758\t0.667\n",
"31\t0.672011\t0.671259\t0.665\n",
"32\t0.669940\t0.669668\t0.659\n",
"33\t0.667821\t0.668107\t0.667\n",
"34\t0.664912\t0.666099\t0.659\n",
"35\t0.664551\t0.664352\t0.666\n",
"36\t0.664129\t0.662225\t0.670\n",
"37\t0.661758\t0.660346\t0.677\n",
"38\t0.656489\t0.658044\t0.679\n",
"39\t0.655833\t0.655525\t0.676\n",
"40\t0.653618\t0.652955\t0.680\n",
"41\t0.650208\t0.650386\t0.696\n",
"42\t0.650381\t0.647420\t0.692\n",
"43\t0.648084\t0.644640\t0.709\n",
"44\t0.641679\t0.641368\t0.710\n",
"45\t0.639070\t0.638061\t0.718\n",
"46\t0.634926\t0.634361\t0.715\n",
"47\t0.632366\t0.630884\t0.735\n",
"48\t0.627536\t0.626566\t0.719\n",
"49\t0.622901\t0.622494\t0.727\n",
"50\t0.619619\t0.618265\t0.739\n",
"51\t0.615184\t0.613723\t0.735\n",
"52\t0.609325\t0.609483\t0.769\n",
"53\t0.606594\t0.604512\t0.765\n",
"54\t0.604054\t0.599553\t0.766\n",
"55\t0.596065\t0.594620\t0.772\n",
"56\t0.594460\t0.589350\t0.777\n",
"57\t0.585098\t0.584272\t0.786\n",
"58\t0.579201\t0.578407\t0.782\n",
"59\t0.574930\t0.572841\t0.787\n",
"60\t0.570162\t0.567380\t0.791\n",
"61\t0.567779\t0.561880\t0.796\n",
"62\t0.561186\t0.555433\t0.795\n",
"63\t0.554286\t0.549111\t0.795\n",
"64\t0.544096\t0.543309\t0.811\n",
"65\t0.539315\t0.536085\t0.801\n",
"66\t0.529294\t0.529415\t0.805\n",
"67\t0.524270\t0.522611\t0.814\n",
"68\t0.522201\t0.515779\t0.819\n",
"69\t0.513689\t0.509575\t0.826\n",
"70\t0.505873\t0.501390\t0.824\n",
"71\t0.497414\t0.494311\t0.832\n",
"72\t0.490741\t0.486686\t0.832\n",
"73\t0.485485\t0.479256\t0.836\n",
"74\t0.476822\t0.472005\t0.843\n",
"75\t0.469124\t0.463912\t0.840\n",
"76\t0.465801\t0.456313\t0.854\n",
"77\t0.451328\t0.448350\t0.855\n",
"78\t0.446896\t0.440338\t0.857\n",
"79\t0.440696\t0.432653\t0.860\n",
"80\t0.433816\t0.425793\t0.862\n",
"81\t0.429183\t0.417571\t0.870\n",
"82\t0.413821\t0.410129\t0.872\n",
"83\t0.407221\t0.402355\t0.872\n",
"84\t0.404904\t0.395205\t0.876\n",
"85\t0.393197\t0.387507\t0.878\n",
"86\t0.389764\t0.381109\t0.878\n",
"87\t0.393883\t0.374057\t0.879\n",
"88\t0.369313\t0.367231\t0.881\n",
"89\t0.371093\t0.360113\t0.884\n",
"90\t0.365672\t0.353798\t0.885\n",
"91\t0.350463\t0.347698\t0.888\n",
"92\t0.341844\t0.340967\t0.888\n",
"93\t0.350419\t0.334646\t0.894\n",
"94\t0.335820\t0.328910\t0.891\n",
"95\t0.331956\t0.322893\t0.902\n",
"96\t0.320030\t0.317673\t0.892\n",
"97\t0.321020\t0.311269\t0.899\n",
"98\t0.322001\t0.307216\t0.895\n",
"99\t0.312295\t0.301597\t0.897\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"epoch_list, train_loss_list, valid_loss_list, acc_list, y_hat_list, y_true_list = \\\n",
"simple_fit(100, net_basic, F.binary_cross_entropy_with_logits, opt, train_dl, valid_dl)"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [],
"source": [
"cnf_matrix = confusion_matrix(np.concatenate(y_true_list)[:,0], (np.concatenate(y_hat_list)>0).astype('int')[:,0])"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [],
"source": [
"# From https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py\n",
"\n",
"def plot_confusion_matrix(cm, classes,\n",
" normalize=False,\n",
" title='Confusion matrix',\n",
" cmap=plt.cm.Blues):\n",
" \"\"\"\n",
" This function prints and plots the confusion matrix.\n",
" Normalization can be applied by setting `normalize=True`.\n",
" \"\"\"\n",
" if normalize:\n",
" cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
" print(\"Normalized confusion matrix\")\n",
" else:\n",
" print('Confusion matrix, without normalization')\n",
"\n",
" print(cm)\n",
"\n",
" plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
" plt.title(title)\n",
" plt.colorbar()\n",
" tick_marks = np.arange(len(classes))\n",
" plt.xticks(tick_marks, classes, rotation=45)\n",
" plt.yticks(tick_marks, classes)\n",
"\n",
" fmt = '.2f' if normalize else 'd'\n",
" thresh = cm.max() / 2.\n",
" for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
" plt.text(j, i, format(cm[i, j], fmt),\n",
" horizontalalignment=\"center\",\n",
" color=\"white\" if cm[i, j] > thresh else \"black\")\n",
"\n",
" plt.ylabel('True label')\n",
" plt.xlabel('Predicted label')\n",
" plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Confusion matrix, without normalization\n",
"[[21482 4718]\n",
" [ 9406 14394]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_confusion_matrix(cnf_matrix, classes=[0,1])"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Normalized confusion matrix\n",
"[[0.819924 0.180076]\n",
" [0.39521 0.60479 ]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_confusion_matrix(cnf_matrix, classes=[0,1], normalize=True)"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch\ttrain loss\tvalid loss\taccuaracy\n",
"0\t0.304433\t0.295522\t0.907\n",
"1\t0.300858\t0.291783\t0.902\n",
"2\t0.297874\t0.285750\t0.910\n",
"3\t0.299339\t0.281660\t0.908\n",
"4\t0.287686\t0.276749\t0.909\n",
"5\t0.294374\t0.273198\t0.909\n",
"6\t0.283189\t0.268968\t0.910\n",
"7\t0.286653\t0.263975\t0.913\n",
"8\t0.271865\t0.260919\t0.913\n",
"9\t0.267071\t0.255737\t0.914\n",
"10\t0.254884\t0.251625\t0.915\n",
"11\t0.259390\t0.247457\t0.915\n",
"12\t0.257554\t0.246577\t0.917\n",
"13\t0.245631\t0.241936\t0.915\n",
"14\t0.250108\t0.239530\t0.919\n",
"15\t0.240492\t0.233500\t0.919\n",
"16\t0.235995\t0.230430\t0.920\n",
"17\t0.231895\t0.228925\t0.922\n",
"18\t0.225211\t0.223859\t0.923\n",
"19\t0.229606\t0.223237\t0.925\n",
"20\t0.217485\t0.217387\t0.923\n",
"21\t0.220375\t0.214575\t0.926\n",
"22\t0.218546\t0.212840\t0.929\n",
"23\t0.224213\t0.209446\t0.927\n",
"24\t0.227428\t0.207487\t0.926\n",
"25\t0.206433\t0.205036\t0.928\n",
"26\t0.213943\t0.204338\t0.930\n",
"27\t0.200320\t0.199454\t0.929\n",
"28\t0.209334\t0.197659\t0.930\n",
"29\t0.206235\t0.195923\t0.930\n",
"30\t0.202274\t0.193687\t0.933\n",
"31\t0.203532\t0.191406\t0.934\n",
"32\t0.200202\t0.190316\t0.936\n",
"33\t0.201764\t0.187595\t0.935\n",
"34\t0.196619\t0.187278\t0.934\n",
"35\t0.187045\t0.183769\t0.938\n",
"36\t0.192743\t0.182196\t0.938\n",
"37\t0.184870\t0.178925\t0.935\n",
"38\t0.185058\t0.179830\t0.942\n",
"39\t0.184598\t0.175455\t0.936\n",
"40\t0.173776\t0.174146\t0.939\n",
"41\t0.165177\t0.172204\t0.939\n",
"42\t0.178341\t0.169955\t0.942\n",
"43\t0.176799\t0.168768\t0.944\n",
"44\t0.169154\t0.172153\t0.941\n",
"45\t0.169707\t0.166348\t0.944\n",
"46\t0.161116\t0.164820\t0.949\n",
"47\t0.168693\t0.167292\t0.942\n",
"48\t0.172523\t0.162663\t0.946\n",
"49\t0.169571\t0.161583\t0.948\n",
"50\t0.161971\t0.160192\t0.946\n",
"51\t0.160429\t0.158464\t0.951\n",
"52\t0.161642\t0.158196\t0.943\n",
"53\t0.148734\t0.155804\t0.952\n",
"54\t0.166915\t0.157587\t0.942\n",
"55\t0.163627\t0.154601\t0.949\n",
"56\t0.150587\t0.155916\t0.941\n",
"57\t0.158432\t0.151608\t0.954\n",
"58\t0.154330\t0.150505\t0.953\n",
"59\t0.154275\t0.153729\t0.940\n",
"60\t0.142802\t0.148526\t0.953\n",
"61\t0.157795\t0.147329\t0.954\n",
"62\t0.145131\t0.147871\t0.951\n",
"63\t0.146706\t0.145618\t0.956\n",
"64\t0.144037\t0.146369\t0.949\n",
"65\t0.151470\t0.146819\t0.945\n",
"66\t0.136995\t0.142847\t0.958\n",
"67\t0.137883\t0.142801\t0.954\n",
"68\t0.139338\t0.142872\t0.951\n",
"69\t0.137459\t0.140670\t0.956\n",
"70\t0.143877\t0.140744\t0.952\n",
"71\t0.135232\t0.139196\t0.956\n",
"72\t0.135298\t0.137887\t0.958\n",
"73\t0.136378\t0.137930\t0.954\n",
"74\t0.138816\t0.136840\t0.956\n",
"75\t0.129663\t0.135264\t0.958\n",
"76\t0.125267\t0.135494\t0.957\n",
"77\t0.127975\t0.133009\t0.959\n",
"78\t0.132843\t0.133449\t0.956\n",
"79\t0.128171\t0.133982\t0.959\n",
"80\t0.127459\t0.130704\t0.960\n",
"81\t0.129331\t0.130088\t0.959\n",
"82\t0.130411\t0.130875\t0.956\n",
"83\t0.122927\t0.132964\t0.959\n",
"84\t0.123464\t0.128636\t0.960\n",
"85\t0.124239\t0.127542\t0.959\n",
"86\t0.134634\t0.127646\t0.961\n",
"87\t0.115869\t0.127349\t0.959\n",
"88\t0.120300\t0.125987\t0.959\n",
"89\t0.115645\t0.125750\t0.960\n",
"90\t0.115870\t0.125944\t0.957\n",
"91\t0.121126\t0.128536\t0.960\n",
"92\t0.119672\t0.123487\t0.961\n",
"93\t0.106539\t0.122730\t0.961\n",
"94\t0.118286\t0.122656\t0.961\n",
"95\t0.110948\t0.122324\t0.959\n",
"96\t0.108884\t0.121707\t0.960\n",
"97\t0.117829\t0.120869\t0.961\n",
"98\t0.115287\t0.120569\t0.960\n",
"99\t0.111039\t0.119513\t0.961\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"epoch_list, train_loss_list, valid_loss_list, acc_list, y_hat_list, y_true_list = \\\n",
"simple_fit(100, net_basic, F.binary_cross_entropy_with_logits, opt, train_dl, valid_dl)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [],
"source": [
"cnf_matrix2 = confusion_matrix(np.concatenate(y_true_list)[:,0], (np.concatenate(y_hat_list)>0).astype('int')[:,0])"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Normalized confusion matrix\n",
"[[0.937824 0.062176]\n",
" [0.05521 0.94479 ]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_confusion_matrix(cnf_matrix2, classes=[0,1], normalize=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"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.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}