diff --git "a/2ct.ipynb" "b/2ct.ipynb" new file mode 100644--- /dev/null +++ "b/2ct.ipynb" @@ -0,0 +1,4090 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18006c0aaa084a66881f449951637e16", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Resolving data files: 0%| | 0/400 [00:00\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m labels \u001b[39m=\u001b[39m data[\u001b[39m'\u001b[39m\u001b[39mtrain\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m.\u001b[39mfeatures[\u001b[39m'\u001b[39m\u001b[39mlabel\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m.\u001b[39mnames\n", + "\u001b[1;31mNameError\u001b[0m: name 'data' is not defined" + ] + } + ], + "source": [ + "labels = data['train'].features['label'].names" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['adenocarcinoma_left.lower.lobe_T2_N0_M0_Ib',\n", + " 'large.cell.carcinoma_left.hilum_T2_N2_M0_IIIa',\n", + " 'normal',\n", + " 'squamous.cell.carcinoma_left.hilum_T1_N2_M0_IIIa']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import BeitImageProcessor, BeitForImageClassification\n", + "model_name_or_path = \"./model/vit-LungCancer2e-5_cp4710/checkpoint-4710/\"\n", + "feature_extractor = BeitImageProcessor.from_pretrained(model_name_or_path)\n", + "\n", + "labels = ['adenocarcinoma',\n", + " 'large.cell',\n", + " 'normal',\n", + " 'squamous.cell']\n", + "\n", + "model = BeitForImageClassification.from_pretrained(\n", + " model_name_or_path,\n", + " num_labels=len(labels),\n", + " id2label={str(i): c for i, c in enumerate(labels)},\n", + " label2id={c: str(i) for i, c in enumerate(labels)}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from PIL import Image\n", + "\n", + "from torch import nn\n", + "\n", + "image = Image.open(\"000108 (3).png\")\n", + "\n", + "encoding = feature_extractor(image, return_tensors=\"pt\")\n", + "outputs = model(**encoding)\n", + "logits = outputs.logits\n", + "pred_logis = nn.functional.softmax(logits, dim=-1)[0][outputs.logits.argmax(-1).item()].item()\n", + "pred = logits.argmax(-1)[0].item()\n", + "print(pred_logis)\n", + "print(pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ROC Curve" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "976bb6aca5144141b09c80551ff378cc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Resolving data files: 0%| | 0/315 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
y_truey_pred
\n", + "" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [y_true, y_pred]\n", + "Index: []" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Import pandas library\n", + "import pandas as pd\n", + " \n", + "df = pd.DataFrame(columns = ['y_true', 'y_pred',]) \n", + "df\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(5): \n", + " new_row = pd.Series({'y_true': i, 'y_pred': i**2})\n", + " pd.concat([df, new_row.to_frame().T], ignore_index=True) " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 out of 400\n", + "1 out of 400\n", + "2 out of 400\n", + "3 out of 400\n", + "4 out of 400\n", + "5 out of 400\n", + "6 out of 400\n", + "7 out of 400\n", + "8 out of 400\n", + "9 out of 400\n", + "10 out of 400\n", + "11 out of 400\n", + "12 out of 400\n", + "13 out of 400\n", + "14 out of 400\n", + "15 out of 400\n", + "16 out of 400\n", + "17 out of 400\n", + "18 out of 400\n", + "19 out of 400\n", + "20 out of 400\n", + "21 out of 400\n", + "22 out of 400\n", + "23 out of 400\n", + "24 out of 400\n", + "25 out of 400\n", + "26 out of 400\n", + "27 out of 400\n", + "28 out of 400\n", + "29 out of 400\n", + "30 out of 400\n", + "31 out of 400\n", + "32 out of 400\n", + "33 out of 400\n", + "34 out of 400\n", + "35 out of 400\n", + "36 out of 400\n", + "37 out of 400\n", + "38 out of 400\n", + "39 out of 400\n", + "40 out of 400\n", + "41 out of 400\n", + "42 out of 400\n", + "43 out of 400\n", + "44 out of 400\n", + "45 out of 400\n", + "46 out of 400\n", + "47 out of 400\n", + "48 out of 400\n", + "49 out of 400\n", + "50 out of 400\n", + "51 out of 400\n", + "52 out of 400\n", + "53 out of 400\n", + "54 out of 400\n", + "55 out of 400\n", + "56 out of 400\n", + "57 out of 400\n", + "58 out of 400\n", + "59 out of 400\n", + "60 out of 400\n", + "61 out of 400\n", + "62 out of 400\n", + "63 out of 400\n", + "64 out of 400\n", + "65 out of 400\n", + "66 out of 400\n", + "67 out of 400\n", + "68 out of 400\n", + "69 out of 400\n", + "70 out of 400\n", + "71 out of 400\n", + "72 out of 400\n", + "73 out of 400\n", + "74 out of 400\n", + "75 out of 400\n", + "76 out of 400\n", + "77 out of 400\n", + "78 out of 400\n", + "79 out of 400\n", + "80 out of 400\n", + "81 out of 400\n", + "82 out of 400\n", + "83 out of 400\n", + "84 out of 400\n", + "85 out of 400\n", + "86 out of 400\n", + "87 out of 400\n", + "88 out of 400\n", + "89 out of 400\n", + "90 out of 400\n", + "91 out of 400\n", + "92 out of 400\n", + "93 out of 400\n", + "94 out of 400\n", + "95 out of 400\n", + "96 out of 400\n", + "97 out of 400\n", + "98 out of 400\n", + "99 out of 400\n", + "100 out of 400\n", + "101 out of 400\n", + "102 out of 400\n", + "103 out of 400\n", + "104 out of 400\n", + "105 out of 400\n", + "106 out of 400\n", + "107 out of 400\n", + "108 out of 400\n", + "109 out of 400\n", + "110 out of 400\n", + "111 out of 400\n", + "112 out of 400\n", + "113 out of 400\n", + "114 out of 400\n", + "115 out of 400\n", + "116 out of 400\n", + "117 out of 400\n", + "118 out of 400\n", + "119 out of 400\n", + "120 out of 400\n", + "121 out of 400\n", + "122 out of 400\n", + "123 out of 400\n", + "124 out of 400\n", + "125 out of 400\n", + "126 out of 400\n", + "127 out of 400\n", + "128 out of 400\n", + "129 out of 400\n", + "130 out of 400\n", + "131 out of 400\n", + "132 out of 400\n", + "133 out of 400\n", + "134 out of 400\n", + "135 out of 400\n", + "136 out of 400\n", + "137 out of 400\n", + "138 out of 400\n", + "139 out of 400\n", + "140 out of 400\n", + "141 out of 400\n", + "142 out of 400\n", + "143 out of 400\n", + "144 out of 400\n", + "145 out of 400\n", + "146 out of 400\n", + "147 out of 400\n", + "148 out of 400\n", + "149 out of 400\n", + "150 out of 400\n", + "151 out of 400\n", + "152 out of 400\n", + "153 out of 400\n", + "154 out of 400\n", + "155 out of 400\n", + "156 out of 400\n", + "157 out of 400\n", + "158 out of 400\n", + "159 out of 400\n", + "160 out of 400\n", + "161 out of 400\n", + "162 out of 400\n", + "163 out of 400\n", + "164 out of 400\n", + "165 out of 400\n", + "166 out of 400\n", + "167 out of 400\n", + "168 out of 400\n", + "169 out of 400\n", + "170 out of 400\n", + "171 out of 400\n", + "172 out of 400\n", + "173 out of 400\n", + "174 out of 400\n", + "175 out of 400\n", + "176 out of 400\n", + "177 out of 400\n", + "178 out of 400\n", + "179 out of 400\n", + "180 out of 400\n", + "181 out of 400\n", + "182 out of 400\n", + "183 out of 400\n", + "184 out of 400\n", + "185 out of 400\n", + "186 out of 400\n", + "187 out of 400\n", + "188 out of 400\n", + "189 out of 400\n", + "190 out of 400\n", + "191 out of 400\n", + "192 out of 400\n", + "193 out of 400\n", + "194 out of 400\n", + "195 out of 400\n", + "196 out of 400\n", + "197 out of 400\n", + "198 out of 400\n", + "199 out of 400\n", + "200 out of 400\n", + "201 out of 400\n", + "202 out of 400\n", + "203 out of 400\n", + "204 out of 400\n", + "205 out of 400\n", + "206 out of 400\n", + "207 out of 400\n", + "208 out of 400\n", + "209 out of 400\n", + "210 out of 400\n", + "211 out of 400\n", + "212 out of 400\n", + "213 out of 400\n", + "214 out of 400\n", + "215 out of 400\n", + "216 out of 400\n", + "217 out of 400\n", + "218 out of 400\n", + "219 out of 400\n", + "220 out of 400\n", + "221 out of 400\n", + "222 out of 400\n", + "223 out of 400\n", + "224 out of 400\n", + "225 out of 400\n", + "226 out of 400\n", + "227 out of 400\n", + "228 out of 400\n", + "229 out of 400\n", + "230 out of 400\n", + "231 out of 400\n", + "232 out of 400\n", + "233 out of 400\n", + "234 out of 400\n", + "235 out of 400\n", + "236 out of 400\n", + "237 out of 400\n", + "238 out of 400\n", + "239 out of 400\n", + "240 out of 400\n", + "241 out of 400\n", + "242 out of 400\n", + "243 out of 400\n", + "244 out of 400\n", + "245 out of 400\n", + "246 out of 400\n", + "247 out of 400\n", + "248 out of 400\n", + "249 out of 400\n", + "250 out of 400\n", + "251 out of 400\n", + "252 out of 400\n", + "253 out of 400\n", + "254 out of 400\n", + "255 out of 400\n", + "256 out of 400\n", + "257 out of 400\n", + "258 out of 400\n", + "259 out of 400\n", + "260 out of 400\n", + "261 out of 400\n", + "262 out of 400\n", + "263 out of 400\n", + "264 out of 400\n", + "265 out of 400\n", + "266 out of 400\n", + "267 out of 400\n", + "268 out of 400\n", + "269 out of 400\n", + "270 out of 400\n", + "271 out of 400\n", + "272 out of 400\n", + "273 out of 400\n", + "274 out of 400\n", + "275 out of 400\n", + "276 out of 400\n", + "277 out of 400\n", + "278 out of 400\n", + "279 out of 400\n", + "280 out of 400\n", + "281 out of 400\n", + "282 out of 400\n", + "283 out of 400\n", + "284 out of 400\n", + "285 out of 400\n", + "286 out of 400\n", + "287 out of 400\n", + "288 out of 400\n", + "289 out of 400\n", + "290 out of 400\n", + "291 out of 400\n", + "292 out of 400\n", + "293 out of 400\n", + "294 out of 400\n", + "295 out of 400\n", + "296 out of 400\n", + "297 out of 400\n", + "298 out of 400\n", + "299 out of 400\n", + "300 out of 400\n", + "301 out of 400\n", + "302 out of 400\n", + "303 out of 400\n", + "304 out of 400\n", + "305 out of 400\n", + "306 out of 400\n", + "307 out of 400\n", + "308 out of 400\n", + "309 out of 400\n", + "310 out of 400\n", + "311 out of 400\n", + "312 out of 400\n", + "313 out of 400\n", + "314 out of 400\n", + "315 out of 400\n", + "316 out of 400\n", + "317 out of 400\n", + "318 out of 400\n", + "319 out of 400\n", + "320 out of 400\n", + "321 out of 400\n", + "322 out of 400\n", + "323 out of 400\n", + "324 out of 400\n", + "325 out of 400\n", + "326 out of 400\n", + "327 out of 400\n", + "328 out of 400\n", + "329 out of 400\n", + "330 out of 400\n", + "331 out of 400\n", + "332 out of 400\n", + "333 out of 400\n", + "334 out of 400\n", + "335 out of 400\n", + "336 out of 400\n", + "337 out of 400\n", + "338 out of 400\n", + "339 out of 400\n", + "340 out of 400\n", + "341 out of 400\n", + "342 out of 400\n", + "343 out of 400\n", + "344 out of 400\n", + "345 out of 400\n", + "346 out of 400\n", + "347 out of 400\n", + "348 out of 400\n", + "349 out of 400\n", + "350 out of 400\n", + "351 out of 400\n", + "352 out of 400\n", + "353 out of 400\n", + "354 out of 400\n", + "355 out of 400\n", + "356 out of 400\n", + "357 out of 400\n", + "358 out of 400\n", + "359 out of 400\n", + "360 out of 400\n", + "361 out of 400\n", + "362 out of 400\n", + "363 out of 400\n", + "364 out of 400\n", + "365 out of 400\n", + "366 out of 400\n", + "367 out of 400\n", + "368 out of 400\n", + "369 out of 400\n", + "370 out of 400\n", + "371 out of 400\n", + "372 out of 400\n", + "373 out of 400\n", + "374 out of 400\n", + "375 out of 400\n", + "376 out of 400\n", + "377 out of 400\n", + "378 out of 400\n", + "379 out of 400\n", + "380 out of 400\n", + "381 out of 400\n", + "382 out of 400\n", + "383 out of 400\n", + "384 out of 400\n", + "385 out of 400\n", + "386 out of 400\n", + "387 out of 400\n", + "388 out of 400\n", + "389 out of 400\n", + "390 out of 400\n", + "391 out of 400\n", + "392 out of 400\n", + "393 out of 400\n", + "394 out of 400\n", + "395 out of 400\n", + "396 out of 400\n", + "397 out of 400\n", + "398 out of 400\n", + "399 out of 400\n" + ] + } + ], + "source": [ + "# Confusion Matrix\n", + "import torch\n", + "import torch.nn.functional as F\n", + "from sklearn import metrics\n", + "import copy\n", + "\n", + "classes = ['adenocarcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'normal',\n", + " 'squamous.cell']\n", + "df = pd.DataFrame(columns = ['y_true', 'y_pred', 'y_pred_proba']) \n", + " \n", + "y_preds = []\n", + "y_trues = []\n", + "for index,val_item in enumerate(dataset[\"train\"]):\n", + " img = val_item[\"image\"]\n", + " encoding = feature_extractor(images=img, return_tensors=\"pt\").to(\"cuda\")\n", + " outputs = model(**encoding)\n", + " y_pred = outputs.logits.argmax(-1).item()\n", + " y_true = classes[val_item[\"label\"]]\n", + " y_preds.append(y_pred)\n", + " y_trues.append(y_true)\n", + " logits = outputs.logits\n", + " pred_logis = nn.functional.softmax(logits, dim=-1)[0].tolist()\n", + " df=df.append({'y_true': y_true, 'y_pred': classes[y_pred], 'y_pred_proba':pred_logis}, ignore_index=True)\n", + " print(f\"{index} out of {len(dataset['train'])}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "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", + "
y_truey_predy_pred_proba
0adenocarcinomaadenocarcinoma[0.9999998807907104, 2.589297443122973e-09, 1....
1adenocarcinomaadenocarcinoma[0.9999997615814209, 1.7878223346201594e-09, 2...
2adenocarcinomaadenocarcinoma[0.999987006187439, 1.273893990294539e-09, 9.7...
3adenocarcinomaadenocarcinoma[0.9996687173843384, 7.39485039957799e-05, 1.2...
4adenocarcinomaadenocarcinoma[0.999997615814209, 7.082943120906293e-10, 9.2...
............
395squamous.cellsquamous.cell[3.566479733763117e-07, 7.594385920128843e-08,...
396squamous.cellsquamous.cell[8.275717888750478e-09, 1.1342042682827014e-07...
397squamous.cellsquamous.cell[5.943781911099677e-09, 1.158784002086577e-07,...
398squamous.cellsquamous.cell[7.160911863479669e-09, 2.4028065581660485e-07...
399squamous.cellsquamous.cell[2.003145382900584e-08, 1.1175397673923726e-07...
\n", + "

400 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " y_true y_pred \\\n", + "0 adenocarcinoma adenocarcinoma \n", + "1 adenocarcinoma adenocarcinoma \n", + "2 adenocarcinoma adenocarcinoma \n", + "3 adenocarcinoma adenocarcinoma \n", + "4 adenocarcinoma adenocarcinoma \n", + ".. ... ... \n", + "395 squamous.cell squamous.cell \n", + "396 squamous.cell squamous.cell \n", + "397 squamous.cell squamous.cell \n", + "398 squamous.cell squamous.cell \n", + "399 squamous.cell squamous.cell \n", + "\n", + " y_pred_proba \n", + "0 [0.9999998807907104, 2.589297443122973e-09, 1.... \n", + "1 [0.9999997615814209, 1.7878223346201594e-09, 2... \n", + "2 [0.999987006187439, 1.273893990294539e-09, 9.7... \n", + "3 [0.9996687173843384, 7.39485039957799e-05, 1.2... \n", + "4 [0.999997615814209, 7.082943120906293e-10, 9.2... \n", + ".. ... \n", + "395 [3.566479733763117e-07, 7.594385920128843e-08,... \n", + "396 [8.275717888750478e-09, 1.1342042682827014e-07... \n", + "397 [5.943781911099677e-09, 1.158784002086577e-07,... \n", + "398 [7.160911863479669e-09, 2.4028065581660485e-07... \n", + "399 [2.003145382900584e-08, 1.1175397673923726e-07... \n", + "\n", + "[400 rows x 3 columns]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from scipy import stats" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import roc_auc_score\n", + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_tpr_fpr(y_real, y_pred):\n", + " '''\n", + " Calculates the True Positive Rate (tpr) and the True Negative Rate (fpr) based on real and predicted observations\n", + " \n", + " Args:\n", + " y_real: The list or series with the real classes\n", + " y_pred: The list or series with the predicted classes\n", + " \n", + " Returns:\n", + " tpr: The True Positive Rate of the classifier\n", + " fpr: The False Positive Rate of the classifier\n", + " '''\n", + " \n", + " # Calculates the confusion matrix and recover each element\n", + " cm = confusion_matrix(y_real, y_pred)\n", + " TN = cm[0, 0]\n", + " FP = cm[0, 1]\n", + " FN = cm[1, 0]\n", + " TP = cm[1, 1]\n", + " \n", + " # Calculates tpr and fpr\n", + " tpr = TP/(TP + FN) # sensitivity - true positive rate\n", + " fpr = 1 - TN/(TN+FP) # 1-specificity - false positive rate\n", + " \n", + " return tpr, fpr" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "def get_all_roc_coordinates(y_real, y_proba):\n", + " '''\n", + " Calculates all the ROC Curve coordinates (tpr and fpr) by considering each point as a threshold for the predicion of the class.\n", + " \n", + " Args:\n", + " y_real: The list or series with the real classes.\n", + " y_proba: The array with the probabilities for each class, obtained by using the `.predict_proba()` method.\n", + " \n", + " Returns:\n", + " tpr_list: The list of TPRs representing each threshold.\n", + " fpr_list: The list of FPRs representing each threshold.\n", + " '''\n", + " tpr_list = [0]\n", + " fpr_list = [0]\n", + " for i in range(len(y_proba)):\n", + " threshold = y_proba[i]\n", + " y_pred = y_proba >= threshold\n", + " tpr, fpr = calculate_tpr_fpr(y_real, y_pred)\n", + " tpr_list.append(tpr)\n", + " fpr_list.append(fpr)\n", + " return tpr_list, fpr_list" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_roc_curve(tpr, fpr, scatter = True, ax = None):\n", + " '''\n", + " Plots the ROC Curve by using the list of coordinates (tpr and fpr).\n", + " \n", + " Args:\n", + " tpr: The list of TPRs representing each coordinate.\n", + " fpr: The list of FPRs representing each coordinate.\n", + " scatter: When True, the points used on the calculation will be plotted with the line (default = True).\n", + " '''\n", + " if ax == None:\n", + " plt.figure(figsize = (5, 5))\n", + " ax = plt.axes()\n", + " \n", + " if scatter:\n", + " sns.scatterplot(x = fpr, y = tpr, ax = ax)\n", + " sns.lineplot(x = fpr, y = tpr, ax = ax)\n", + " sns.lineplot(x = [0, 1], y = [0, 1], color = 'green', ax = ax)\n", + " plt.xlim(-0.05, 1.05)\n", + " plt.ylim(-0.05, 1.05)\n", + " plt.xlabel(\"False Positive Rate\")\n", + " plt.ylabel(\"True Positive Rate\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Ka6++urcaQ0bNqR58+Z7zbds2TKaN29O48aNady4MR9++CEAq1evpkWLFjRq1Ij69evz3nvvkZWVRf/+/alfvz4NGjTg8ccfL7SGgpbtnOP666/nuOOOo02bNqxduzb3NfPmzaNly5accsopnHPOOaz2O+2tWrXitttuo1mzZhx77LG89957gDeA2qWXXkqDBg04+eSTmTlzJuBtcNxyyy3Ur1+fk046iaeffhqA++67j6ZNm1K/fn2uuuoqcvoMrVq14uabb6ZJkyY8+eSTfPbZZ5xxxhk0bNiQZs2asXnzZmbNmkWnTp0AGDBgAJdddhmtWrXiqKOO2uuonscee4z69etTv359nnjiidyfxfHHH0///v059thj6d27N9OmTePMM8+kbt26fPrppwB8+umnnH766Zx88smcccYZfPvtt9H+yhNGmZNakiErIhX0GRg8eDCdO3emdevWZGZmsnXrVrp3786JJ55It27dOPXUU5k719uwnTJlCqeffjqNGzfmoosuyvdom19++YVu3brRsGFDGjZsmPt+hg8fTrNmzWjUqBF/+ctfyMrKirr2SZMm0bhxYxo2bEhmZmax3s+WLVtys+ykk05i3LhxgHfk0Pr161m2bBknnHACV155JfXq1aNdu3Zs27YNgPnz53Paaadx0kkn0a1bN3799VfAy7W//vWvNGnShBNOOIHPPvuM888/n7p163LXXXfl1t21a1dOOeUU6tWrx6BBg6J+v4nknMtyzjXC26lqRoy+TXfONXHONalWrVpUr1HmSCwlQ/4OHjyY888/n/bt21O3bl3+8Y9/5D43atQoGjRoQP369bnttttyp1eoUIG///3vNGzYkI8++ogKFSpw6623Uq9ePdq0acOnn36au300YcKEQt9DMjKzav6RO5hZOaAtsAiYCeQcbt4PeNO/P8F/jP/8jFgeMRht7ihzkksyfL6/+eab3G2ak046iSVLlgDwwAMPcOyxx3LWWWfRq1cvHnnkEcDbbsjZllq/fj21a9cutMZZs2bRsmVLunTpwlFHHcXtt9/OiBEjaNasGQ0aNOD777/PfX3r1q056aSTyMzM5KeffgK8szjGjh2bW2+FChUKfO95LV26lDZt2tCwYUMaN26cu66HH36Ypk2bctJJJ3HPPfcU9WvaZ3H9mlGHEEp+FixYwCmnnFLkfIcccghTp06lbNmyLFmyhF69ejF37lxGjhzJOeecw5133klWVhZbt25l/vz5rFq1KveQtt9++w2AgQMHAuwVYIUte/z48Xz77bcsXLiQX375hRNPPJHLLruMXbt2ccMNN/Dmm29SrVo1xowZw5133snLL78MeN9yf/rpp7zzzjvce++9TJs2jWeffRYz4+uvv2bx4sW0a9eO7777jldeeYVly5Yxf/58SpYsycaNGwG4/vrrufvuuwHo06cPEydO5LzzzgNg586dzJ07l507d3L88cczZswYmjZtyu+//065cuX+9LNbvHgxM2fOZPPmzRx33HFcc801fPXVV7zyyit88sknOOc49dRTadmyJZUrV2bp0qW89tprvPzyyzRt2pSRI0fy/vvvM2HCBP7zn//wxhtvcPzxx/Pee+9RsmRJpk2bxh133JG7o5cslDmpJRmyIlJhn4HPP/+cr776iipVqvDII49QuXJlFi5cyIIFC2jUqBHgbZDcf//9TJs2jQMOOICHHnqIxx57LPdzn+PGG2+kZcuWjB8/nqysLLZs2cKiRYsYM2YMH3zwAaVKleLaa69lxIgR9O3bt8ifz7p167jyyiuZM2cOderUyc2caN/PbbfdxkEHHcTXX38NkNukibRkyRJGjRrFCy+8QPfu3Rk3bhyXXHIJffv25emnn6Zly5bcfffd3HvvvbnN5dKlSzN37lyefPJJunTpwrx586hSpQpHH300f/3rXzn44IN5+eWXqVKlCtu2baNp06ZccMEFHHzwn/qwSSEZvk0XiZVkyd/58+fzxRdfUKZMGY477jhuuOEGMjIyuO2225g3bx6VK1emXbt2vPHGG3Tt2pU//viDU089lUcffRSAP/74g9atW/Pwww/TrVs37rrrLqZOncrChQvp168fnTt3LvA9JKkawBD/yMESwKvOuYlmthAYbWb3A18AL/nzvwQMM7OlwEagZxBFS3JJhs/3wIEDuemmm+jduzc7d+4kKyuLefPmMXr0aObPn8/u3btp3LhxkXUW9vn98ssvWbRoEVWqVOGoo47iiiuu4NNPP+XJJ5/k6aef5oknnuCGG26gX79+9OvXj5dffpkbb7yRN954o8D15ffe8+rduze333473bp1Y/v27WRnZzNlyhSWLFnCp59+inOOzp07M2fOHFq0aFHk76G4EnIcuTZ6ZF/s2rWL66+/nvnz55ORkcF3330HQNOmTXObLl27dqVRo0YcddRR/PDDD9xwww2ce+65tGvXDih4Z62gZc+ZM4devXqRkZHBYYcdRuvWrQH49ttvWbBgAW3btgW8o3Bq1KiRu7zzzz8fgFNOOYVly5YB8P7773PDDTcA3o7UkUceyXfffce0adO4+uqrc097qFKlCuB10//3v/+xdetWNm7cSL169XIbPD169Mito0aNGjRt2hSAAw88MN/3d+6551KmTBnKlCnDIYccwi+//ML7779Pt27dOOCAA3Jrfu+99+jcuTN16tShQYMGANSrV4/MzEzMjAYNGuS+n02bNtGvXz+WLFmCmbFr164ofovBUOakl3hmRaTCPgNt27bN/Sy///773HTTTQC5R+oBfPzxxyxcuJAzzzwT8Bq3p59++p/WM2PGDIYOHQpARkYGBx10EMOGDWPevHm5n/1t27ZxyCGHRPXz+fjjj2nRogV16tQB9mROtO9n2rRpuYdwA1SuXPlP66hTp05uIysnBzdt2sRvv/1Gy5YtAejXrx8XXXRR7ms6d+4MQIMGDahXr15uph511FGsWLGCgw8+mKeeeorx48cDsGLFCpYsWZJUDR4zqwbs8jMn59v0h9jzbfpo8v82/SPi8G26SKLFO38zMzM56KCDADjxxBNZvnw5GzZsoFWrVuQc3da7d2/mzJlD165dycjI4IILLsh9fenSpWnfvj3gZU2ZMmUoVarUXts3Bb2HZOSc+wo4OZ/pP+AdQZh3+nbgorzTRaIRz8/36aefzgMPPMDKlStzj+B977336NatG+XLlwf2bCfsS405deZsWxx99NG5NTVo0CD3zIqPPvqI119/HfC+YI88UjA/+b33SJs3b2bVqlV069YNgLJlywLeEdxTpkzh5JO9j++WLVtYsmRJXBo88byKVlIdQijJo169esybN6/I+R5//HEOPfRQvvzyy9yjVwBatGjBnDlzOPzww+nfvz9Dhw6lcuXKfPnll7Rq1YqBAwdyxRVX7NOyC+Kco169esyfP5/58+fz9ddfM2XKlNzny5QpA3g7Y7t37y5oMQXavn071157LWPHjuXrr7/myiuvZPv27bnP5zRlopVTT7Q1Rc5fokSJ3MclSpTIfe2//vUvzj77bBYsWMBbb721V33JQJmTepIhKyIV9hmI5jPqnKNt27a5ObJw4UJeeumlIl+X89p+/frlvvbbb79lwIABUdeen/19P5GKmzmRr4nMnJzHu3fvZtasWUybNo2PPvqIL7/8kpNPPjnpcgfv2/SZZvYV8Bkw1Tk3EbgN+Jv/rfnB7P1t+sH+9L8BtwdQs0iRkiV/i5stZcuW3WvcnVKlSuVeYrig7ZvibhOKhF0yfL4vvvhiJkyYQLly5ejYsSMzZswodP6SJUuSnZ0NsNe2QGGf32j2b6JZX3Z2dqHvPRrOOf75z3/mbsctXbqUyy+/vOgX7oN4jsGjjR7JV+vWrdmxY8de4yl89dVXfzqHcdOmTdSoUYMSJUowbNiw3PEmli9fzqGHHsqVV17JFVdcweeff8769evJzs7mggsu4P777+fzzz8vtIaClt2iRQvGjBlDVlYWq1evzu3uHnfccaxbt46PPvoI8LrF33zzTaHraN68OSNGjADgu+++46effuK4446jbdu2/N///V9usGzcuDE3qKpWrcqWLVv2Oucz0nHHHcfq1av57LPPAK9LHG1DqXnz5rzxxhts3bqVP/74g/Hjx//pXNvCbNq0icMP94avGTx4cNSvSyBlTopJhqzIu55oPgNnnnkmr776KgALFy7MPbXptNNO44MPPmDp0qWAd+pAft8UZ2Zm8vzzzwPe0YKbNm0iMzOTsWPH5o4LtnHjRpYvXx5V3aeddhpz5szhxx9/zH1tcd5P27ZtefbZZ3Mf53eKVn4OOuggKleunPv7GjZsWO7RPNHYtGkTlStXpnz58ixevJiPP/446tcminPuK+fcyc65k5xz9Z1z9/nTf3DONXPOHeOcu8g5t8Ofvt1/fIz//A/BvgOR/CVb/kZq1qwZs2fPZv369WRlZTFq1KhiZUteBb0HkVSVDJ/vH374gaOOOoobb7yRLl268NVXX9GiRQveeOMNtm3bxubNm3nrrbdy569du3ZuUypyP2l/P79nnHFG7lHKI0aMyN03ilzfhAkTco9yzu+9R6pYsSI1a9bMPc1rx44dbN26lXPOOYeXX345d+zFVatW7TXWayzF8ypaOoQwJKrXqFHkaOvFXV5hzIzx48dz880389BDD1G2bFlq166dOy5DjmuvvZYLLriAoUOH0r59+9xvlGfNmsXDDz9MqVKlqFChAkOHDmXVqlVceumluZ3W//73v0DB530WtOxu3boxY8YMTjzxRGrVqpV7+kTp0qUZO3YsN954I5s2bWL37t3cfPPN1KtXr8D3ee2113LNNdfQoEEDSpYsyeDBgylTpgxXXHEF3333HSeddBKlSpXiyiuv5Prrr+fKK6+kfv36VK9ePfc0jLxKly7NmDFjuOGGG9i2bRvlypVj2rRphf68czRu3Jj+/fvTrJn38bviiis4+eSTcw9RLso//vEP+vXrx/3338+5554b1WsSSZkTf+mYFZGi/Qxce+219OvXjxNPPJHjjz+eevXqcdBBB1GtWjUGDx5Mr1692LFjBwD3338/xx57LHfffTdNmjShc+fOPPnkk1x11VW89NJLZGRk8Pzzz3P66adz//33065dO7KzsylVqhTPPvssRx55ZIF1NGrUiPnz51OtWjUGDRrE+eefT3Z2du756tG+n7vuuovrrruO+vXrk5GRwT333JN7WmpRhgwZwtVXX83WrVs56qijeOWVV6J6HUD79u0ZOHAgJ5xwAscddxynnXZa1K8VSTXpnr+RatSowYMPPsjZZ5+Nc45zzz2XLl26FOftR/UeRBIlHT/fr776KsOGDaNUqVJUr16dO+64gypVqtCjRw8aNmzIIYccstf+0C233EL37t0ZNGjQXtss+/v5ffrpp7n00kt5+OGHqVatWu52ypVXXkmXLl1o2LBhke8dvP2qq6++miZNmjBs2DD+8pe/cPfdd1OqVClee+012rVrx6JFi3L3LStUqMDw4cOjPt2+OCzMZyQ0adLERTsIWvXDanLbkMIP/crxUL/WrPl55f6UltQWLVrECSecEHQZkqLy+/sys3nOudBfxz3dMkdZsW+ysrLYtWsXZcuW5fvvv6dNmzZ8++23lC5dOujSUlIqZw5EnzupkDmyh/I3eSlz9og2d5Q5e9PnOzoDBgygQoUK3HLLLUGXErji5E5CBlkWERFJF1u3buXss89m165dOOd47rnn1NwRERERkbhTg0dERCSGKlasmMyX2BURERFJevt7MYl0Fc9BlkVEREREREREJAHU4BERERERERERCTk1eEREREREREREQk4NHhERERERERGRkNMgy0Kjxk1Ys2ZNzJZXvXp15n9e+ACjGRkZNGjQgN27d1OnTh2GDRtGpUqVirWe+fPn8/PPP9OxY8f9qFZEoqWsEBEJhvJXJHXp8y2xpAaPsGbNGm4bMiNmy3uoX+si5ylXrhzz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ri4w3X8M0AGo69+uAp5PfMkikkhxa/Boo0dEEkmZIyIB0M6WiCSMc261c+5z//5mYBFwONAFGOLPNgTo6t/vAgx1no+BSmZWI7FVi0gixfMIHm30iEgiKXNEJKG0syUiQTGz2sDJwCfAoc651f5Ta4BD/fuHAysiXrbSn5Z3WVeZ2Vwzm7tu3br4FS0icRe3Bo82ekQkkZQ5IhIk7WyJSKKYWQVgHHCzc+73yOeccw5wxVmec26Qc66Jc65JtWrVYlipiCRaQsbg0UaPiCSSMkdEEkk7WyKSKGZWCi9vRjjnXvcn/5LzJZX/71p/+irgiIiX1/SniUiKinuDRxs9IpJIyhwRSSTtbIlIopiZAS8Bi5xzj0U8NQHo59/vB7wZMb2vP+7gacCmiC+9RCQFxbXBo40eEUkkZY6IJJJ2tkQkwc4E+gCtzWy+f+sIPAi0NbMlQBv/McA7wA/AUuAF4NoAahaRBCoZrwVHsdHzIH/e6LnezEYDp6KNHhEpBmWOiAQgZ2frazOb70+7Ay9vXjWzy4HlQHf/uXeAjng7W1uBSxNarYiEmnPufcAKeDozn/kdcF1cixKRpBK3Bg/a6BGRxFLmiEhCaWdLREREkkncGjza6BGRRFLmiIiIiIhIOkvIVbRERERERERERCR+1OAREREREREREQk5NXhEREREREREREJODR4RERERERERkZBTg0dEREREREREJOTU4BERERERERERCTk1eEREREREREREQk4NHhERERERERGRkFODR0REREREREQk5NTgEREREREREREJOTV4RERERERERERCLqoGj5mdGc00EZFYUOaISCIpc0Qk0ZQ7IhIP0R7B83SU00REYkGZIyKJpMwRkURT7ohIzJUs7EkzOx04A6hmZn+LeOpAICOehYlI+lHmiEgiKXNEJNGUOyIST4U2eIDSQAV/vooR038HLoxXUSKStpQ5IpJIyhwRSTTljojETaENHufcbGC2mQ12zi1PUE0ikqaUOSKSSMocEUk05Y6IxFNRR/DkKGNmg4Daka9xzrWOR1EikvaUOSKSSMocEUk05Y6IxFy0DZ7XgIHAi0BW/MoREQGUOSKSWMocEUk05Y6IxFy0DZ7dzrnn41qJiMgeyhwRSSRljogkmnJHRGIu2sukv2Vm15pZDTOrknOLa2Uiks6UOSKSSMocEUk05Y6IxFy0R/D08/+9NWKaA46KbTkiIoAyR0QSS5kjIomm3BGRmIuqweOcqxPvQkREcihzRCSRlDkikmjKHRGJh6gaPGbWN7/pzrmhsS1HRESZIyKJpcwRkURT7ohIPER7ilbTiPtlgUzgc0ABJCLxoMwRkURS5ohIoil3RCTmoj1F64bIx2ZWCRgdj4JERJQ5IpJIyhwRSTTljojEQ7RX0crrD0DnjYpIoihzRCSRlDkikmhF5o6ZvWxma81sQcS0AWa2yszm+7eOEc/908yWmtm3ZnZOHGsXkSQRVYPHzN4yswn+7W3gW2B8Ea9RAInIPtmXzPFfp9wRkWJT5ohIou1j7gwG2ucz/XHnXCP/9o6//BOBnkA9/zXPmVlG7N6BiCSjaMfgeSTi/m5guXNuZRGvGQw8w5/PI33cORe5vLwBdBgwzcyOdc5lRVmfiKSWfckcUO6IyL5R5ohIohU7d5xzc8ysdpTL7wKMds7tAH40s6VAM+CjfSlWRMIhqiN4nHOzgcVARaAysDOK18wBNkZZR24AOed+BHICSETS0L5kjv865Y6IFJsyR0QSbV9zpwDXm9lX/lGFlf1phwMrIuZZ6U/7EzO7yszmmtncdevW7UcZIhK0aE/R6g58ClwEdAc+MbML93Gd+xVAIpL6Ypw5oNwRkUIkW+ZoZ0sk9cUwd54HjgYaAauBR4u7AOfcIOdcE+dck2rVqu1DCSKSLKIdZPlOoKlzrp9zri/eN07/2of17XcAaaNHJC3EKnNgP3NHmSOSFpImc0A7WyJpIia545z7xTmX5ZzLBl5gz5GBq4AjImat6U8TkRQWbYOnhHNubcTjDcV4ba5YBJA2ekTSQkwyB/Y/d5Q5ImkhaTJHRNJGTHLHzGpEPOwG5Az6PgHoaWZlzKwOUBfviCERSWHRDrI8ycwmA6P8xz2Ad4q7MjOr4Zxb7T/MG0AjzewxvIEHFUAi6S0mmQPKHRGJijJHRBKt2LljZqOAVkBVM1sJ3AO0MrNGgAOWAX8BcM59Y2avAgvxBnG+ToO6i6S+Qhs8ZnYMcKhz7lYzOx84y3/qI2BEEa9VAIlIsexP5vivV+6ISNSUOSKSaPuTO865XvlMfqmQ+R8AHtjXWkUkfIo6gucJ4J8AzrnXgdcBzKyB/9x5Bb1QASQi++AJ9jFz/Ncod0SkOJ5AmSMiifUE+5E7IiKFKeo8z0Odc1/nnehPqx2XikQknSlzRCSRlDkikmjKHRGJm6IaPJUKea5cDOsQEQFljogkVqVCnlPmiEg8VCrkOeWOiOyXoho8c83syrwTzewKYF58ShKRNKbMEZFEUuaISKIpd0Qkbooag+dmYLyZ9WZP4DQBSuNdGUJEJJZuRpkjIolzM8ocEUmsm1HuiEicFNrgcc79ApxhZmcD9f3JbzvnZsS9MhFJO8ocEUkkZY6IJJpyR0TiqagjeABwzs0EZsa5FhERQJkjIomlzBGRRFPuiEg8FDUGj4iIiIiIiIiIJDk1eEREREREREREQk4NHhERERERERGRkFODR0REREREREQk5NTgEREREREREREJOTV4RERERERERERCTg0eEREREREREZGQU4NHRERERERERCTk1OAREREREREREQk5NXhEREREREREREJODR4RERERERERkZBTg0dEREREREREJOTU4BERERERERERCTk1eEREREREREREQk4NHhERERERERGRkFODR0REREREREQk5NTgEREREREREREJOTV4RERERERERERCTg0eEREREREREZGQU4NHRERERERERCTk1OARERERERFJcmb2spmtNbMFEdOqmNlUM1vi/1vZn25m9pSZLTWzr8yscXCVi0iixK3BowASkURT7ohIIilzRCTBBgPt80y7HZjunKsLTPcfA3QA6vq3q4DnE1SjiAQonkfwDEYBJCKJNRjljogkzmCUOSKSIM65OcDGPJO7AEP8+0OArhHThzrPx0AlM6uRkEJFJFezUxpR67BDo7o1O6XRfq+v5P6XnD/n3Bwzq51ncheglX9/CDALuI2IAAI+NrNKZlbDObc6XvWJSOpR7ohIIilzRCQJHBqRI2uAQ/37hwMrIuZb6U/7U+aY2VV4jWdq1aoVv0pF0tCa1av5acTNUc1bq/cT+72+uDV4CqAAEpFE26/cUeaISDFpW0ckiTU7pRFrVkfXV61eowafzpsf34JiyDnnzMztw+sGAYMAmjRpUuzXi0jySHSDJ5cCSCT5pPJGD+xb7ihzROIr2txJl8zxX6fcEYmTRH+bngC/5BwN6J+Ctdafvgo4ImK+mv40EUlhiW7wKIBEklgKbvSAckckqUWbO8ocEZF8TQD6AQ/6/74ZMf16MxsNnAps0imhIqkv0ZdJzwkg+HMA9fWvMHEaCiARiR3ljogkkjJHROLCzEYBHwHHmdlKM7scr7HT1syWAG38xwDvAD8AS4EXgGsDKFlEEixuR/D4AdQKqGpmK4F78ALnVT+MlgPd/dnfATriBdBW4NJ41SUiqUu5IyKJpMwRkURyzvUq4KnMfOZ1wHXxrUhEkk08r6KlABKRhFLuiEgiKXNEREQkmST6FC0REREREREREYkxNXhEREREREREREJODR4RERERERERkZBTg0dEREREREREJOTU4BERERERERERCTk1eEREREREREREQk4NHhERERERERGRkFODR0REREREREQk5NTgEREREREREREJOTV4RERERERERERCTg0eEREREREREZGQU4NHRERERERERCTk1OAREREREREREQk5NXhEREREREREREJODR4RERERERERkZBTg0dEREREREREJOTU4BERERERERERCTk1eEREREREREREQk4NHhERERERERGRkFODR0REREREREQk5NTgEREREREREREJOTV4RERERERERERCTg0eEREREREREZGQU4NHRERERERERCTk1OAREREREREREQk5NXhEREREREREREKuZBArNbNlwGYgC9jtnGtiZlWAMUBtYBnQ3Tn3axD1iUjqUe6ISCIpc0QkkZQ5IgLBHsFztnOukXOuif/4dmC6c64uMN1/LCISS8odEUkkZY6IJJIyRyTNJdMpWl2AIf79IUDX4EoRkTSh3BGRRFLmiEgiKXNE0kxQDR4HTDGzeWZ2lT/tUOfcav/+GuDQYEoTkRSl3BGRRFLmiEgi7XPmmNlVZjbXzOauW7cuEbWKSJwEMgYPcJZzbpWZHQJMNbPFkU8655yZufxe6AfWVQC1atWKf6Uikir2KXeUOSKyj7StIyKJtM+Z45wbBAwCaNKkSb7ziEg4BHIEj3Nulf/vWmA80Az4xcxqAPj/ri3gtYOcc02cc02qVauWqJJFJOT2NXeUOSKyL7StIyKJtD+ZIyKpI+ENHjM7wMwq5twH2gELgAlAP3+2fsCbia5NRFKTckdEEkmZIyKJpMwRkRxBnKJ1KDDezHLWP9I5N8nMPgNeNbPLgeVA9wBqE5HUpNwRkURS5ohIIilzRAQIoMHjnPsBaJjP9A1AZqLrEZHUp9wRkURS5ohIIilzRCRHMl0mXURERERERERE9oEaPCIiIiIiIiIi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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize = (16, 8))\n", + "bins = [i/20 for i in range(20)] + [1]\n", + "roc_auc_ovr = {}\n", + "\n", + "classes = ['adenocarcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'normal',\n", + " 'squamous.cell']\n", + "\n", + "\n", + "for i in range(len(classes)):\n", + " c = classes[i]\n", + " # Prepares an auxiliar dataframe to help with the plots\n", + " df_aux = df.copy()\n", + " df_aux['class'] = [1 if y == c else 0 for y in df['y_pred']]\n", + " df_aux['prob'] = [prob[i] for prob in df['y_pred_proba']]\n", + " df_aux = df_aux.reset_index(drop = True)\n", + " # txt = \"out{}.csv\" \n", + " # df_aux.to_csv(txt.format(i))\n", + "\n", + " # Plots the probability distribution for the class and the rest\n", + " ax = plt.subplot(2, 4, i+1)\n", + " sns.histplot(x = \"prob\", data = df_aux, hue = 'class', color = 'b', ax = ax, bins = bins)\n", + " ax.set_title(c)\n", + " ax.legend([f\"Class: {c}\", \"Rest\"])\n", + " ax.set_xlabel(f\"P(x = {c})\")\n", + " \n", + " # Calculates the ROC Coordinates and plots the ROC Curves\n", + " ax_bottom = plt.subplot(2, 4, i+5)\n", + " tpr, fpr = get_all_roc_coordinates(df_aux['class'], df_aux['prob'])\n", + " plot_roc_curve(tpr, fpr, scatter = False, ax = ax_bottom)\n", + " ax_bottom.set_title(\"ROC Curve OvR\")\n", + " \n", + " # Calculates the ROC AUC OvR\n", + " roc_auc_ovr[c] = roc_auc_score(df_aux['class'], df_aux['prob'])\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adenocarcinoma ROC AUC OvR: 1.0000\n", + "large.cell.carcinoma ROC AUC OvR: 1.0000\n", + "normal ROC AUC OvR: 1.0000\n", + "squamous.cell ROC AUC OvR: 1.0000\n", + "average ROC AUC OvR: 1.0000\n" + ] + } + ], + "source": [ + "# Displays the ROC AUC for each class\n", + "avg_roc_auc = 0\n", + "i = 0\n", + "for k in roc_auc_ovr:\n", + " avg_roc_auc += roc_auc_ovr[k]\n", + " i += 1\n", + " print(f\"{k} ROC AUC OvR: {roc_auc_ovr[k]:.4f}\")\n", + "print(f\"average ROC AUC OvR: {avg_roc_auc/i:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 [0.9999998807907104, 2.589297443122973e-09, 1....\n", + "1 [0.9999997615814209, 1.7878223346201594e-09, 2...\n", + "2 [0.999987006187439, 1.273893990294539e-09, 9.7...\n", + "3 [0.9996687173843384, 7.39485039957799e-05, 1.2...\n", + "4 [0.999997615814209, 7.082943120906293e-10, 9.2...\n", + " ... \n", + "395 [3.566479733763117e-07, 7.594385920128843e-08,...\n", + "396 [8.275717888750478e-09, 1.1342042682827014e-07...\n", + "397 [5.943781911099677e-09, 1.158784002086577e-07,...\n", + "398 [7.160911863479669e-09, 2.4028065581660485e-07...\n", + "399 [2.003145382900584e-08, 1.1175397673923726e-07...\n", + "Name: y_pred_proba, Length: 400, dtype: object" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['y_pred_proba']" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 adenocarcinoma\n", + "1 adenocarcinoma\n", + "2 adenocarcinoma\n", + "3 adenocarcinoma\n", + "4 adenocarcinoma\n", + " ... \n", + "395 squamous.cell\n", + "396 squamous.cell\n", + "397 squamous.cell\n", + "398 squamous.cell\n", + "399 squamous.cell\n", + "Name: y_pred, Length: 400, dtype: object" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['y_pred']" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compares with sklearn (average only)\n", + "# \"Macro\" average = unweighted mean\n", + "import numpy as np\n", + "dfx = df['y_pred_proba'].to_numpy()\n", + "listX =[]\n", + "for i in range(len(dfx)):\n", + " listX.append(dfx[i])\n", + "pred_proba = np.array(listX)\n", + "\n", + "\n", + "roc_auc_score(df['y_pred'], pred_proba, labels = classes, multi_class = 'ovr', average = 'macro')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9999998807907104\n", + "0.9999997615814209\n", + "0.999987006187439\n", + "0.9996687173843384\n", + "0.999997615814209\n", + "0.9999998807907104\n", + "0.9999990463256836\n", + "0.9999988079071045\n", + "0.9999994039535522\n", + "0.9999986886978149\n", + "0.9999984502792358\n", + "0.9999996423721313\n", + "0.9999983310699463\n", + "0.9999991655349731\n", + "0.9999933242797852\n", + "0.999998927116394\n", + "0.9999974966049194\n", + "0.9999995231628418\n", + "0.9999998807907104\n", + "0.9999996423721313\n", + "0.9999854564666748\n", + "0.999994158744812\n", + "0.9999983310699463\n", + "0.9999992847442627\n", + "0.9999991655349731\n", + "0.9999995231628418\n", + "0.9999996423721313\n", + "0.9999995231628418\n", + "0.0002812340680975467\n", + "0.9999977350234985\n", + "0.9999948740005493\n", + "7.689672202104703e-06\n", + "0.9999910593032837\n", + "0.9999996423721313\n", + "0.9999310970306396\n", + "0.9999912977218628\n", + "0.9999961853027344\n", + "0.9999990463256836\n", + "0.9999995231628418\n", + "0.9999986886978149\n", + "0.9999980926513672\n", + "0.9999998807907104\n", + "0.9999992847442627\n", + "0.9999997615814209\n", + "0.9999996423721313\n", + "0.999995231628418\n", + "0.9999994039535522\n", + "0.9999994039535522\n", + "0.9999997615814209\n", + "0.999996542930603\n", + "0.9999984502792358\n", + "0.9999994039535522\n", + "0.9999978542327881\n", + "0.9999988079071045\n", + "0.9999972581863403\n", + "0.9999995231628418\n", + "0.999998927116394\n", + "0.9999998807907104\n", + "0.9999992847442627\n", + "0.9999982118606567\n", + "0.9999897480010986\n", + "0.9999992847442627\n", + "0.999998927116394\n", + "0.9999990463256836\n", + "0.9999997615814209\n", + "0.9999994039535522\n", + "0.9999986886978149\n", + "0.32505324482917786\n", + "0.9999905824661255\n", + "0.9999927282333374\n", + "0.9999996423721313\n", + "0.9999996423721313\n", + "0.9999998807907104\n", + "0.9999997615814209\n", + "0.9999986886978149\n", + "0.9999979734420776\n", + "0.9999996423721313\n", + "0.9999995231628418\n", + "0.9999995231628418\n", + "0.9999992847442627\n", + "0.9999994039535522\n", + "0.9999995231628418\n", + "0.9999994039535522\n", + "0.9999997615814209\n", + "0.9999988079071045\n", + "0.9999991655349731\n", + "0.999998927116394\n", + "0.9999978542327881\n", + "1.0\n", + "0.999997615814209\n", + "0.9999997615814209\n", + "0.9999995231628418\n", + "0.9999992847442627\n", + "0.9999961853027344\n", + "0.9999982118606567\n", + "0.9999995231628418\n", + "0.9999983310699463\n", + "0.9999995231628418\n", + "0.9999985694885254\n", + "0.9999988079071045\n", + "3.3858458259317104e-09\n", + "0.9531351327896118\n", + "6.293784281297121e-06\n", + "0.0002803557144943625\n", + "2.5819642246460717e-07\n", + "2.587269818832283e-06\n", + "3.954372385095439e-09\n", + "8.083960523208589e-08\n", + "2.2235109042867407e-07\n", + "1.2559809192680405e-06\n", + "1.1438488627391052e-06\n", + "2.6193663416052004e-06\n", + "9.136885523730598e-07\n", + "0.00015822537534404546\n", + "4.170035694528451e-08\n", + "1.4278562332492584e-07\n", + "1.484994669453954e-07\n", + "9.798999371923856e-07\n", + "7.718232164499739e-10\n", + "4.7101686995176806e-09\n", + "6.06600902841592e-09\n", + "7.122279299665024e-08\n", + "3.375755497359023e-08\n", + "2.4661872544129437e-08\n", + "2.351577821357864e-09\n", + "2.5358619648585545e-09\n", + "2.93865216605127e-08\n", + "8.081862006292795e-07\n", + "2.8785652261831274e-07\n", + "9.430914360564202e-08\n", + "4.256146155512397e-07\n", + "7.028084780813515e-09\n", + "4.186866409128243e-09\n", + "8.449120514342212e-09\n", + "3.6797684899170235e-09\n", + "5.1477911711117486e-08\n", + "2.6271610664707623e-08\n", + "1.2759414858010132e-08\n", + "8.529715955774009e-08\n", + "2.6387967366758858e-08\n", + "2.2714948144653135e-08\n", + "7.734668017178592e-09\n", + "2.158535394869432e-08\n", + "1.507305746883958e-08\n", + "5.853208140393917e-09\n", + "4.490491889441728e-08\n", + "1.4580912477413221e-08\n", + "9.161681191471871e-08\n", + "1.3081091765343444e-08\n", + "2.5341355680552624e-09\n", + "3.4637062107378824e-09\n", + "9.569965264688562e-09\n", + "2.4281314736640525e-08\n", + "2.9728388639682635e-08\n", + "2.650019155225891e-07\n", + "7.69119612442637e-09\n", + "3.985789476246282e-09\n", + "9.269155611946189e-07\n", + "8.229511081481178e-07\n", + "2.588503491551819e-07\n", + "4.457627600373826e-09\n", + "6.92206647556759e-09\n", + "5.727868401805836e-09\n", + "1.7268789065383316e-08\n", + "2.9965722347924384e-08\n", + "1.935352500481713e-08\n", + "3.235939161072565e-08\n", + "1.059901251210249e-07\n", + "1.3423615552454748e-09\n", + "5.15947951029716e-09\n", + "7.880981200969472e-09\n", + "7.8147301962872e-09\n", + "6.6896879147293475e-09\n", + "2.6710578193700485e-09\n", + "7.632101173271622e-09\n", + "3.665123671225956e-08\n", + "7.156804571195607e-08\n", + "1.4327601149943803e-07\n", + "2.8027704601640835e-08\n", + "3.802514214612529e-08\n", + "2.512441099611351e-08\n", + "1.0212757928229621e-07\n", + "1.525143460412437e-07\n", + "5.866576202606666e-08\n", + "3.4752809519034145e-09\n", + "2.3236941260051935e-08\n", + "2.0513295950763677e-08\n", + "3.7548286968558386e-07\n", + "5.8288673443485095e-08\n", + "3.0377350412891246e-08\n", + "6.235204352833534e-08\n", + "4.630603900324104e-09\n", + "1.3774894114249037e-08\n", + "2.6252735096932156e-07\n", + "2.1197392641170154e-07\n", + "8.416893138019077e-08\n", + "2.344354266270443e-09\n", + "8.402403217644405e-10\n", + "1.6405765634885938e-09\n", + "1.4259939895566731e-09\n", + "1.1065442606650322e-07\n", + "3.325485309346732e-08\n", + "5.1481478635651e-08\n", + "1.394090958228844e-07\n", + "9.910338150120879e-08\n", + "8.294212960890945e-08\n", + "7.52678772641957e-08\n", + "8.375273097271929e-08\n", + "6.907391281174569e-08\n", + "7.101524346353472e-08\n", + "1.4792986746670067e-07\n", + "8.755824865147588e-08\n", + "2.969997012769454e-07\n", + "2.5865696784421743e-07\n", + "2.2928281850909116e-07\n", + "1.6624447596313985e-07\n", + "1.0244878723142392e-07\n", + "1.4044361762444169e-07\n", + "6.091740090141684e-08\n", + "8.362518855165035e-08\n", + "3.371450318923053e-08\n", + "2.703550592286774e-07\n", + "3.8137332580845396e-07\n", + "5.576389980888052e-07\n", + "1.1990984205567656e-07\n", + "1.2836922280712315e-07\n", + "6.367076821334194e-08\n", + "7.062121909484631e-08\n", + "1.6226958621246013e-07\n", + "2.1631022661949828e-07\n", + "6.885079528728966e-08\n", + "2.3727922382477118e-07\n", + "1.211870852557695e-07\n", + "1.6103167865821888e-07\n", + "1.4074892362714309e-07\n", + "2.5223809529961727e-07\n", + "1.4939027437321784e-07\n", + "9.328099537242451e-08\n", + "8.235790716071278e-08\n", + "9.636884357178133e-08\n", + "3.424552460273844e-06\n", + "3.437205862155679e-07\n", + "1.082979181887822e-07\n", + "8.027856779335707e-08\n", + "9.727444449936229e-08\n", + "1.6165323302175238e-07\n", + "6.518702377888985e-08\n", + "8.828150299677873e-08\n", + "1.117196646305274e-07\n", + "8.572332177436692e-08\n", + "1.8235007814837445e-07\n", + "9.9691668253854e-08\n", + "8.601715961731315e-08\n", + "1.215482114957922e-07\n", + "9.44335454278189e-08\n", + "6.996588552965477e-08\n", + "5.590116103348919e-08\n", + "1.4490812816347898e-07\n", + "6.007348218872721e-08\n", + "8.963822750729378e-08\n", + "1.3130393483606895e-07\n", + "9.004142498270085e-08\n", + "2.0100357289720705e-07\n", + "1.1159743706912195e-07\n", + "6.274463970612487e-08\n", + "8.065720180638891e-08\n", + "1.5701360212005966e-07\n", + "7.068457108516668e-08\n", + "1.206883695203942e-07\n", + "4.498686223541881e-08\n", + "2.862132078007562e-07\n", + "1.440523362816748e-07\n", + "9.92021043089153e-08\n", + "1.6094911359232356e-07\n", + "0.0008419377263635397\n", + "6.609418790048949e-08\n", + "1.0434055752739368e-07\n", + "1.784344192401477e-07\n", + "1.566859992863101e-07\n", + "2.2662844401111215e-07\n", + "1.7400834906311502e-07\n", + "2.4579298951721285e-07\n", + "5.911144995707218e-08\n", + "1.1072555849978016e-07\n", + "1.6180005957266985e-07\n", + "7.475403407397607e-08\n", + "8.702331655285889e-08\n", + "1.5017442933640268e-07\n", + "7.645592603466866e-08\n", + "2.344443714719091e-07\n", + "2.8069317181689257e-07\n", + "6.855125178617527e-08\n", + "1.3075920435312582e-07\n", + "8.814682672664276e-08\n", + "1.1451373183035685e-07\n", + "1.0619548618251429e-07\n", + "2.749752923136839e-07\n", + "7.710583815878636e-08\n", + "1.7493024984105432e-07\n", + "9.46972065207774e-08\n", + "1.565179807982986e-08\n", + "2.6484478610200313e-08\n", + "2.2843456903842707e-08\n", + "5.668296765293235e-08\n", + "7.988980144091329e-09\n", + "9.101686515577967e-09\n", + "6.595475952053675e-07\n", + "7.0147430086819895e-09\n", + "4.809483478140919e-09\n", + "2.650274382176576e-07\n", + "7.437243709773611e-08\n", + "6.020033538334246e-08\n", + "4.457984559280703e-08\n", + "5.084344323336154e-08\n", + "2.1818282291974356e-08\n", + "4.457573155036698e-08\n", + "3.20467108849698e-07\n", + "1.9855870903029427e-07\n", + "1.30167761014377e-08\n", + "1.88114867682998e-07\n", + "4.951223786520131e-07\n", + "6.702318700035903e-08\n", + "1.4964340877554605e-08\n", + "2.6268738295698313e-08\n", + "8.242702520533385e-09\n", + "1.2522626491318078e-08\n", + "5.6026578931778204e-08\n", + "8.144262864107077e-08\n", + "5.7272114162287835e-08\n", + "8.556703079420913e-08\n", + "3.511008372925062e-08\n", + "1.1532854671258974e-07\n", + "4.584185475664526e-08\n", + "9.298569914051313e-09\n", + "3.939536554753431e-07\n", + "9.572670656154969e-09\n", + "3.635028278381469e-08\n", + "2.6974124267553634e-08\n", + "1.195794663289007e-08\n", + "8.148270325136764e-08\n", + "1.4854217056381458e-07\n", + "1.3766063844400378e-08\n", + "5.090759813697332e-08\n", + "2.4916201368796465e-07\n", + "8.647966609487412e-08\n", + "2.1067753763759356e-08\n", + "6.571980293301749e-08\n", + "1.3369093210258143e-07\n", + "1.0731221067317165e-07\n", + "1.1150311785002032e-08\n", + "3.748146237825267e-09\n", + "1.614129940818998e-09\n", + "7.582789396387568e-10\n", + "8.293507547385559e-10\n", + "9.935366973579107e-10\n", + "1.8190961625919044e-08\n", + "3.699415529467842e-08\n", + "2.1551627469307277e-06\n", + "1.939093408509507e-06\n", + "2.1094938063015434e-07\n", + "1.642608182805816e-08\n", + "8.84942394918653e-08\n", + "2.3152315975494275e-07\n", + "8.712660815035633e-08\n", + "2.482065220021923e-08\n", + "2.5406048820286742e-08\n", + "1.0180561282879808e-08\n", + "9.497836828131767e-08\n", + "3.623859612389424e-08\n", + "4.114716830372345e-06\n", + "7.2187954174296465e-06\n", + "6.46866240572308e-08\n", + "2.1052257181963796e-07\n", + "2.672421395288893e-08\n", + "9.633160047428646e-09\n", + "6.589539225387853e-07\n", + "8.719516131350247e-08\n", + "1.0810376238623576e-07\n", + "8.230913550733021e-08\n", + "6.827708887158224e-08\n", + "7.718482208929345e-08\n", + "2.388230591066076e-08\n", + "3.961529273510678e-07\n", + "7.636280230371995e-08\n", + "1.9798311257090973e-07\n", + "3.034063524864905e-07\n", + "5.196000429918968e-08\n", + "1.9388391336860877e-08\n", + "4.7649926671056164e-08\n", + "1.9288885155788194e-08\n", + "4.5817114546764515e-09\n", + "2.8533648777084863e-09\n", + "4.816748244707014e-08\n", + "1.0713475973034292e-07\n", + "6.922748525539646e-07\n", + "3.566479733763117e-07\n", + "8.275717888750478e-09\n", + "5.943781911099677e-09\n", + "7.160911863479669e-09\n", + "2.003145382900584e-08\n" + ] + } + ], + "source": [ + "for prob in df['y_pred_proba']:\n", + " print(prob[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Confusuin martix" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 1,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 1,\n", + " 0,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_preds" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'adenocarcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'normal',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell',\n", + " 'squamous.cell']" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_trues" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "y_truesID = []" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "for classN in y_trues:\n", + " if classN == 'adenocarcinoma':\n", + " y_truesID.append(int(0))\n", + " elif classN == 'large.cell.carcinoma':\n", + " y_truesID.append(int(1))\n", + " elif classN == 'normal':\n", + " y_truesID.append(int(2))\n", + " else:\n", + " y_truesID.append(int(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3]" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_truesID" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import ConfusionMatrixDisplay\n", + "cm = metrics.confusion_matrix([int(x) for x in y_truesID], [x for x in y_preds], labels=[x for x in range(4)])\n", + "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n", + "disp.plot()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "width, height= image.size\n", + "print(width)\n", + "print(height)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(image)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BeitFeatureExtractor {\n", + " \"crop_size\": {\n", + " \"height\": 224,\n", + " \"width\": 224\n", + " },\n", + " \"do_center_crop\": false,\n", + " \"do_normalize\": true,\n", + " \"do_reduce_labels\": false,\n", + " \"do_rescale\": true,\n", + " \"do_resize\": true,\n", + " \"feature_extractor_type\": \"BeitFeatureExtractor\",\n", + " \"image_mean\": [\n", + " 0.5,\n", + " 0.5,\n", + " 0.5\n", + " ],\n", + " \"image_processor_type\": \"BeitFeatureExtractor\",\n", + " \"image_std\": [\n", + " 0.5,\n", + " 0.5,\n", + " 0.5\n", + " ],\n", + " \"resample\": 2,\n", + " \"rescale_factor\": 0.00392156862745098,\n", + " \"size\": {\n", + " \"height\": 224,\n", + " \"width\": 224\n", + " }\n", + "}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "feature_extractor" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def process_example(example):\n", + " inputs = feature_extractor(example, return_tensors='pt')\n", + " return inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'pixel_values': tensor([[[[-0.9922, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " ...,\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000]],\n", + "\n", + " [[-0.9922, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " ...,\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000]],\n", + "\n", + " [[-0.9922, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " ...,\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000],\n", + " [-1.0000, -1.0000, -1.0000, ..., -1.0000, -1.0000, -1.0000]]]])}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import glob\n", + "import random\n", + "from PIL import Image, ImageOps\n", + "\n", + "image = Image.open(\"000108 (3).png\")\n", + "process_example(image)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicted class:adenocarcinoma\n" + ] + } + ], + "source": [ + "from transformers import BeitFeatureExtractor, BeitForImageClassification\n", + "from PIL import Image\n", + "import requests\n", + "\n", + "image = Image.open(\"000108 (3).png\")\n", + "model_name_or_path = \"checkpoint-1644\"\n", + "image = image.resize((224,224))\n", + "feature_extractor = BeitFeatureExtractor.from_pretrained(model_name_or_path)\n", + "labels = ['adenocarcinoma',\n", + " 'large.cell.carcinoma',\n", + " 'normal',\n", + " 'squamous.cell.carcinoma']\n", + "model = BeitForImageClassification.from_pretrained(\n", + " model_name_or_path,\n", + " num_labels=len(labels),\n", + " id2label={str(i): c for i, c in enumerate(labels)},\n", + " label2id={c: str(i) for i, c in enumerate(labels)}\n", + ")\n", + "\n", + "inputs = feature_extractor(images=image, return_tensors=\"pt\")\n", + "outputs = model(**inputs)\n", + "logits = outputs.logits\n", + "# model predicts one of the 4 classes\n", + "predicted_class_idx = logits.argmax(-1).item()\n", + "print(\"Predicted class:\" + labels[predicted_class_idx])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Check duplicate data" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "difPy preparing files: [243/243] [100%]\n", + "difPy comparing images: [243/243] [100%]\n", + "Found 0 pair(s) of duplicate image(s) in 5.14 seconds.\n" + ] + } + ], + "source": [ + "from difPy import dif\n", + "search = dif([\"./DataSet/Data/train/squamous.cell.carcinoma_left.hilum_T1_N2_M0_IIIa/\", \"./DataSet/Data/test/squamous.cell.carcinoma/\", \"./DataSet/Data/valid/squamous.cell.carcinoma_left.hilum_T1_N2_M0_IIIa/\", ])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from difPy import dif\n", + "search = dif([\"./DataSet/Data/train\", \"./DataSet/Data/test\", \"./DataSet/Data/valid\", ])" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{28760889469516173401723076592912788701: {'location': 'DataSet\\\\Data\\\\train\\\\large.cell.carcinoma_left.hilum_T2_N2_M0_IIIa\\\\l4.png',\n", + " 'matches': {32395808410271971641834764686679392267: {'location': 'DataSet\\\\Data\\\\train\\\\squamous.cell.carcinoma_left.hilum_T1_N2_M0_IIIa\\\\sq2.png',\n", + " 'mse': 0.0}}},\n", + " 36579070754311943076263871337808923067: {'location': 'DataSet\\\\Data\\\\valid\\\\normal\\\\7 - Copy (3).png',\n", + " 'matches': {317652843055825206771657845114485971123: {'location': 'DataSet\\\\Data\\\\valid\\\\normal\\\\7.png',\n", + " 'mse': 0.0}}}}" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "search.result" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predicted_class_idx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# balance DATA" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All modules have been imported\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "import time\n", + "import matplotlib.pyplot as plt\n", + "import cv2\n", + "import seaborn as sns\n", + "sns.set_style('darkgrid')\n", + "import shutil\n", + "from sklearn.model_selection import train_test_split\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.layers import Dense, Activation,Dropout,Conv2D, MaxPooling2D,BatchNormalization\n", + "from tensorflow.keras.optimizers import Adam, Adamax\n", + "from tensorflow.keras.metrics import categorical_crossentropy\n", + "from tensorflow.keras import regularizers\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras import backend as K\n", + "import time\n", + "from tqdm import tqdm\n", + "from sklearn.metrics import f1_score\n", + "from IPython.display import YouTubeVideo\n", + "import sys\n", + "if not sys.warnoptions:\n", + " import warnings\n", + " warnings.simplefilter(\"ignore\")\n", + "pd.set_option('display.max_columns', None) # or 1000\n", + "pd.set_option('display.max_rows', None) # or 1000\n", + "pd.set_option('display.max_colwidth', None) # or 199\n", + "print('All modules have been imported')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train -adenocarcinoma : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 908/908 [00:03<00:00, 248.96files/s]\u001b[0m\n", + "train -large.cell : 100%|\u001b[34m███████████████████████████████████████████████████\u001b[0m| 1418/1418 [00:06<00:00, 208.12files/s]\u001b[0m\n", + "train -normal : 100%|\u001b[34m███████████████████████████████████████████████████\u001b[0m| 2500/2500 [00:21<00:00, 116.55files/s]\u001b[0m\n", + "train -squamous.cell : 100%|\u001b[34m███████���███████████████████████████████████████████\u001b[0m| 2500/2500 [00:09<00:00, 265.83files/s]\u001b[0m\n", + "test -adenocarcinoma : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 345.05files/s]\u001b[0m\n", + "test -large.cell : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 350.33files/s]\u001b[0m\n", + "test -normal : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 272.99files/s]\u001b[0m\n", + "test -squamous.cell : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 314.62files/s]\u001b[0m\n", + "valid -adenocarcinoma : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 306.93files/s]\u001b[0m\n", + "valid -large.cell : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 358.62files/s]\u001b[0m\n", + "valid -normal : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 317.40files/s]\u001b[0m\n", + "valid -squamous.cell : 100%|\u001b[34m█████████████████████████████████████████████████████\u001b[0m| 100/100 [00:00<00:00, 363.08files/s]\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of classes in processed dataset= 4\n", + "the maximum files in any class in train_df is 2500 the minimum files in any class in train_df is 908\n", + "train_df length: 7326 test_df length: 400 valid_df length: 400\n", + "average image height= 354 average image width= 481 aspect ratio h/w= 0.735966735966736\n" + ] + } + ], + "source": [ + "def make_dataframes(train_dir,test_dir, val_dir):\n", + " bad_images=[]\n", + " dirlist=[train_dir, test_dir, val_dir]\n", + " names=['train','test', 'valid']\n", + " zipdir=zip(names, dirlist)\n", + " for name,d in zipdir:\n", + " filepaths=[]\n", + " labels=[]\n", + " classlist=sorted(os.listdir(d) ) \n", + " for klass in classlist:\n", + " # class names are very long so make psuedo names\n", + " if 'adenocarcinoma' in klass:\n", + " label='adenocarcinoma'\n", + " elif 'large.cell' in klass:\n", + " label='large.cell'\n", + " elif 'squamous.cell' in klass:\n", + " label='squamous.cell'\n", + " else:\n", + " label='normal'\n", + " classpath=os.path.join(d, klass) \n", + " flist=sorted(os.listdir(classpath)) \n", + " desc=f'{name:6s}-{label:25s}'\n", + " for f in tqdm(flist, ncols=130,desc=desc, unit='files', colour='blue'):\n", + " fpath=os.path.join(classpath,f)\n", + " try:\n", + " img=cv2.imread(fpath)\n", + " shape=img.shape\n", + " filepaths.append(fpath)\n", + " labels.append(label)\n", + " except:\n", + " print (fpath, ' is an invalid image file')\n", + " bad_images.append(fpath)\n", + " Fseries=pd.Series(filepaths, name='filepaths')\n", + " Lseries=pd.Series(labels, name='labels')\n", + " df=pd.concat([Fseries, Lseries], axis=1) \n", + " if name =='valid':\n", + " valid_df=df\n", + " elif name == 'test':\n", + " test_df=df\n", + " else:\n", + " train_df=df \n", + " classes=sorted(train_df['labels'].unique())\n", + " class_count=len(classes)\n", + " sample_df=train_df.sample(n=50, replace=False)\n", + " # calculate the average image height and with\n", + " ht=0\n", + " wt=0\n", + " count=0\n", + " for i in range(len(sample_df)):\n", + " fpath=sample_df['filepaths'].iloc[i]\n", + " try:\n", + " img=cv2.imread(fpath)\n", + " h=img.shape[0]\n", + " w=img.shape[1]\n", + " wt +=w\n", + " ht +=h\n", + " count +=1\n", + " except:\n", + " pass\n", + " have=int(ht/count)\n", + " wave=int(wt/count)\n", + " aspect_ratio=have/wave\n", + " print('number of classes in processed dataset= ', class_count) \n", + " counts=list(train_df['labels'].value_counts()) \n", + " print('the maximum files in any class in train_df is ', max(counts), ' the minimum files in any class in train_df is ', min(counts))\n", + " print('train_df length: ', len(train_df), ' test_df length: ', len(test_df), ' valid_df length: ', len(valid_df)) \n", + " print('average image height= ', have, ' average image width= ', wave, ' aspect ratio h/w= ', aspect_ratio) \n", + " if len(bad_images)>0:\n", + " print_in_color('Below is a list of invalid image files')\n", + " for f in bad_images:\n", + " print (f)\n", + " return train_df, test_df, valid_df, classes, class_count\n", + "\n", + "train_dir = r'./DataSet/Data/split/train'\n", + "val_dir=r'./DataSet/Data/split/val'\n", + "test_dir=r'./DataSet/Data/split/test'\n", + "train_df, test_df, valid_df, classes, class_count=make_dataframes(train_dir, test_dir, val_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial length of dataframe is 7326\n", + "Found 908 validated image filenames. for class adenocarcinoma creating 1592 augmented images \n", + "Found 1418 validated image filenames. for class large.cell creating 1082 augmented images \n", + "Total Augmented images created= 2674\n", + "Length of augmented dataframe is now 10000\n" + ] + } + ], + "source": [ + "def balance(df, n,column, working_dir, img_size):\n", + " df=df.copy()\n", + " print('Initial length of dataframe is ', len(df))\n", + " aug_dir=os.path.join(working_dir, 'aug')# directory to store augmented images\n", + " if os.path.isdir(aug_dir):# start with an empty directory\n", + " shutil.rmtree(aug_dir)\n", + " os.mkdir(aug_dir) \n", + " for label in df[column].unique(): \n", + " dir_path=os.path.join(aug_dir,label) \n", + " os.mkdir(dir_path) # make class directories within aug directory\n", + " # create and store the augmented images \n", + " total=0\n", + " gen=ImageDataGenerator(horizontal_flip=True, rotation_range=20, width_shift_range=.2,\n", + " height_shift_range=.2, zoom_range=.2)\n", + " groups=df.groupby(column) # group by class\n", + " for label in df[column].unique(): # for every class \n", + " group=groups.get_group(label) # a dataframe holding only rows with the specified label \n", + " sample_count=len(group) # determine how many samples there are in this class \n", + " if sample_count< n: # if the class has less than target number of images\n", + " aug_img_count=0\n", + " delta=n - sample_count # number of augmented images to create\n", + " target_dir=os.path.join(aug_dir, label) # define where to write the images\n", + " msg='{0:40s} for class {1:^30s} creating {2:^5s} augmented images'.format(' ', label, str(delta))\n", + " print(msg, '\\r', end='') # prints over on the same line\n", + " aug_gen=gen.flow_from_dataframe( group, x_col='filepaths', y_col=None, target_size=img_size,\n", + " class_mode=None, batch_size=1, shuffle=False, \n", + " save_to_dir=target_dir, save_prefix='aug-', color_mode='rgb',\n", + " save_format='jpg')\n", + " while aug_img_count\n", + " \n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%tensorboard --logdir 'C:\\Users\\Admin\\Desktop\\chest-CT\\model\\modelBeit\\Beit-LungCancer2e-4_cp4710V2\\runs\\Apr13_01-02-32_5a27b9e0f897'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}