|
a |
|
b/Clinical Deterioration Prediction Model - KNN.ipynb |
|
|
1 |
{ |
|
|
2 |
"cells": [ |
|
|
3 |
{ |
|
|
4 |
"cell_type": "markdown", |
|
|
5 |
"metadata": { |
|
|
6 |
"hide": true |
|
|
7 |
}, |
|
|
8 |
"source": [ |
|
|
9 |
"import os\n", |
|
|
10 |
"import pandas as pd\n", |
|
|
11 |
"# ^^^ pyforest auto-imports - don't write above this line\n", |
|
|
12 |
"import numpy as np\n", |
|
|
13 |
"import matplotlib.pyplot as plt\n", |
|
|
14 |
"import pandas as pd\n", |
|
|
15 |
"import os\n", |
|
|
16 |
"import sklearn\n", |
|
|
17 |
"import matplotlib.pyplot as plt\n", |
|
|
18 |
"import seaborn as sns\n", |
|
|
19 |
"import pandas as pd\n", |
|
|
20 |
"import os\n", |
|
|
21 |
"\n", |
|
|
22 |
"$$\n", |
|
|
23 |
"\\renewcommand{\\like}{{\\cal L}}\n", |
|
|
24 |
"\\renewcommand{\\loglike}{{\\ell}}\n", |
|
|
25 |
"\\renewcommand{\\err}{{\\cal E}}\n", |
|
|
26 |
"\\renewcommand{\\dat}{{\\cal D}}\n", |
|
|
27 |
"\\renewcommand{\\hyp}{{\\cal H}}\n", |
|
|
28 |
"\\renewcommand{\\Ex}[2]{E_{#1}[#2]}\n", |
|
|
29 |
"\\renewcommand{\\x}{{\\mathbf x}}\n", |
|
|
30 |
"\\renewcommand{\\v}[1]{{\\mathbf #1}}\n", |
|
|
31 |
"$$" |
|
|
32 |
] |
|
|
33 |
}, |
|
|
34 |
{ |
|
|
35 |
"cell_type": "markdown", |
|
|
36 |
"metadata": {}, |
|
|
37 |
"source": [ |
|
|
38 |
"# Clinical Deterioration Prediction Model - KNN " |
|
|
39 |
] |
|
|
40 |
}, |
|
|
41 |
{ |
|
|
42 |
"cell_type": "code", |
|
|
43 |
"execution_count": 1, |
|
|
44 |
"metadata": {}, |
|
|
45 |
"outputs": [ |
|
|
46 |
{ |
|
|
47 |
"data": { |
|
|
48 |
"application/javascript": [ |
|
|
49 |
"\n", |
|
|
50 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os'); }\n", |
|
|
51 |
" " |
|
|
52 |
], |
|
|
53 |
"text/plain": [ |
|
|
54 |
"<IPython.core.display.Javascript object>" |
|
|
55 |
] |
|
|
56 |
}, |
|
|
57 |
"metadata": {}, |
|
|
58 |
"output_type": "display_data" |
|
|
59 |
}, |
|
|
60 |
{ |
|
|
61 |
"data": { |
|
|
62 |
"text/plain": [ |
|
|
63 |
"'C:\\\\Users\\\\abebu\\\\Dropbox\\\\Data Science\\\\Projects\\\\Capstone Project 1\\\\Potential Projects\\\\9. MIMIC\\\\Machine Learning'" |
|
|
64 |
] |
|
|
65 |
}, |
|
|
66 |
"execution_count": 1, |
|
|
67 |
"metadata": {}, |
|
|
68 |
"output_type": "execute_result" |
|
|
69 |
} |
|
|
70 |
], |
|
|
71 |
"source": [ |
|
|
72 |
"os.getcwd()" |
|
|
73 |
] |
|
|
74 |
}, |
|
|
75 |
{ |
|
|
76 |
"cell_type": "code", |
|
|
77 |
"execution_count": 5, |
|
|
78 |
"metadata": {}, |
|
|
79 |
"outputs": [ |
|
|
80 |
{ |
|
|
81 |
"data": { |
|
|
82 |
"application/javascript": [ |
|
|
83 |
"\n", |
|
|
84 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os\\nimport pandas as pd'); }\n", |
|
|
85 |
" " |
|
|
86 |
], |
|
|
87 |
"text/plain": [ |
|
|
88 |
"<IPython.core.display.Javascript object>" |
|
|
89 |
] |
|
|
90 |
}, |
|
|
91 |
"metadata": {}, |
|
|
92 |
"output_type": "display_data" |
|
|
93 |
} |
|
|
94 |
], |
|
|
95 |
"source": [ |
|
|
96 |
"os.chdir(\"C://Users/abebu/Google Drive/mimic-iii-clinical-database-1.4\")" |
|
|
97 |
] |
|
|
98 |
}, |
|
|
99 |
{ |
|
|
100 |
"cell_type": "code", |
|
|
101 |
"execution_count": 6, |
|
|
102 |
"metadata": {}, |
|
|
103 |
"outputs": [ |
|
|
104 |
{ |
|
|
105 |
"data": { |
|
|
106 |
"application/javascript": [ |
|
|
107 |
"\n", |
|
|
108 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os\\nimport pandas as pd'); }\n", |
|
|
109 |
" " |
|
|
110 |
], |
|
|
111 |
"text/plain": [ |
|
|
112 |
"<IPython.core.display.Javascript object>" |
|
|
113 |
] |
|
|
114 |
}, |
|
|
115 |
"metadata": {}, |
|
|
116 |
"output_type": "display_data" |
|
|
117 |
}, |
|
|
118 |
{ |
|
|
119 |
"data": { |
|
|
120 |
"text/html": [ |
|
|
121 |
"<div>\n", |
|
|
122 |
"<style scoped>\n", |
|
|
123 |
" .dataframe tbody tr th:only-of-type {\n", |
|
|
124 |
" vertical-align: middle;\n", |
|
|
125 |
" }\n", |
|
|
126 |
"\n", |
|
|
127 |
" .dataframe tbody tr th {\n", |
|
|
128 |
" vertical-align: top;\n", |
|
|
129 |
" }\n", |
|
|
130 |
"\n", |
|
|
131 |
" .dataframe thead th {\n", |
|
|
132 |
" text-align: right;\n", |
|
|
133 |
" }\n", |
|
|
134 |
"</style>\n", |
|
|
135 |
"<table border=\"1\" class=\"dataframe\">\n", |
|
|
136 |
" <thead>\n", |
|
|
137 |
" <tr style=\"text-align: right;\">\n", |
|
|
138 |
" <th></th>\n", |
|
|
139 |
" <th>Unnamed: 0.1</th>\n", |
|
|
140 |
" <th>Unnamed: 0.1.1</th>\n", |
|
|
141 |
" <th>SUBJECT_ID</th>\n", |
|
|
142 |
" <th>HADM_ID</th>\n", |
|
|
143 |
" <th>ICUSTAY_ID</th>\n", |
|
|
144 |
" <th>los</th>\n", |
|
|
145 |
" <th>hdeath</th>\n", |
|
|
146 |
" <th>death</th>\n", |
|
|
147 |
" <th>admission</th>\n", |
|
|
148 |
" <th>ud</th>\n", |
|
|
149 |
" <th>...</th>\n", |
|
|
150 |
" <th>Sodium</th>\n", |
|
|
151 |
" <th>Temp</th>\n", |
|
|
152 |
" <th>Bilirubin</th>\n", |
|
|
153 |
" <th>WBC</th>\n", |
|
|
154 |
" <th>hr</th>\n", |
|
|
155 |
" <th>gcs</th>\n", |
|
|
156 |
" <th>bp</th>\n", |
|
|
157 |
" <th>AGE</th>\n", |
|
|
158 |
" <th>UO</th>\n", |
|
|
159 |
" <th>saps2</th>\n", |
|
|
160 |
" </tr>\n", |
|
|
161 |
" </thead>\n", |
|
|
162 |
" <tbody>\n", |
|
|
163 |
" <tr>\n", |
|
|
164 |
" <td>0</td>\n", |
|
|
165 |
" <td>0</td>\n", |
|
|
166 |
" <td>0</td>\n", |
|
|
167 |
" <td>268</td>\n", |
|
|
168 |
" <td>110404</td>\n", |
|
|
169 |
" <td>280836</td>\n", |
|
|
170 |
" <td>3.2490</td>\n", |
|
|
171 |
" <td>1</td>\n", |
|
|
172 |
" <td>1</td>\n", |
|
|
173 |
" <td>8</td>\n", |
|
|
174 |
" <td>0.0</td>\n", |
|
|
175 |
" <td>...</td>\n", |
|
|
176 |
" <td>0.0</td>\n", |
|
|
177 |
" <td>0.0</td>\n", |
|
|
178 |
" <td>0.0</td>\n", |
|
|
179 |
" <td>0.0</td>\n", |
|
|
180 |
" <td>11.0</td>\n", |
|
|
181 |
" <td>26.0</td>\n", |
|
|
182 |
" <td>13.0</td>\n", |
|
|
183 |
" <td>12.0</td>\n", |
|
|
184 |
" <td>0.0</td>\n", |
|
|
185 |
" <td>82.0</td>\n", |
|
|
186 |
" </tr>\n", |
|
|
187 |
" <tr>\n", |
|
|
188 |
" <td>1</td>\n", |
|
|
189 |
" <td>1</td>\n", |
|
|
190 |
" <td>1</td>\n", |
|
|
191 |
" <td>269</td>\n", |
|
|
192 |
" <td>106296</td>\n", |
|
|
193 |
" <td>206613</td>\n", |
|
|
194 |
" <td>3.2788</td>\n", |
|
|
195 |
" <td>0</td>\n", |
|
|
196 |
" <td>0</td>\n", |
|
|
197 |
" <td>8</td>\n", |
|
|
198 |
" <td>17.0</td>\n", |
|
|
199 |
" <td>...</td>\n", |
|
|
200 |
" <td>0.0</td>\n", |
|
|
201 |
" <td>0.0</td>\n", |
|
|
202 |
" <td>0.0</td>\n", |
|
|
203 |
" <td>0.0</td>\n", |
|
|
204 |
" <td>0.0</td>\n", |
|
|
205 |
" <td>0.0</td>\n", |
|
|
206 |
" <td>5.0</td>\n", |
|
|
207 |
" <td>7.0</td>\n", |
|
|
208 |
" <td>0.0</td>\n", |
|
|
209 |
" <td>37.0</td>\n", |
|
|
210 |
" </tr>\n", |
|
|
211 |
" <tr>\n", |
|
|
212 |
" <td>2</td>\n", |
|
|
213 |
" <td>2</td>\n", |
|
|
214 |
" <td>2</td>\n", |
|
|
215 |
" <td>270</td>\n", |
|
|
216 |
" <td>188028</td>\n", |
|
|
217 |
" <td>220345</td>\n", |
|
|
218 |
" <td>2.8939</td>\n", |
|
|
219 |
" <td>0</td>\n", |
|
|
220 |
" <td>0</td>\n", |
|
|
221 |
" <td>0</td>\n", |
|
|
222 |
" <td>0.0</td>\n", |
|
|
223 |
" <td>...</td>\n", |
|
|
224 |
" <td>0.0</td>\n", |
|
|
225 |
" <td>3.0</td>\n", |
|
|
226 |
" <td>0.0</td>\n", |
|
|
227 |
" <td>0.0</td>\n", |
|
|
228 |
" <td>11.0</td>\n", |
|
|
229 |
" <td>0.0</td>\n", |
|
|
230 |
" <td>13.0</td>\n", |
|
|
231 |
" <td>18.0</td>\n", |
|
|
232 |
" <td>0.0</td>\n", |
|
|
233 |
" <td>45.0</td>\n", |
|
|
234 |
" </tr>\n", |
|
|
235 |
" <tr>\n", |
|
|
236 |
" <td>3</td>\n", |
|
|
237 |
" <td>3</td>\n", |
|
|
238 |
" <td>3</td>\n", |
|
|
239 |
" <td>271</td>\n", |
|
|
240 |
" <td>173727</td>\n", |
|
|
241 |
" <td>249196</td>\n", |
|
|
242 |
" <td>2.0600</td>\n", |
|
|
243 |
" <td>0</td>\n", |
|
|
244 |
" <td>0</td>\n", |
|
|
245 |
" <td>8</td>\n", |
|
|
246 |
" <td>0.0</td>\n", |
|
|
247 |
" <td>...</td>\n", |
|
|
248 |
" <td>0.0</td>\n", |
|
|
249 |
" <td>3.0</td>\n", |
|
|
250 |
" <td>0.0</td>\n", |
|
|
251 |
" <td>0.0</td>\n", |
|
|
252 |
" <td>0.0</td>\n", |
|
|
253 |
" <td>0.0</td>\n", |
|
|
254 |
" <td>0.0</td>\n", |
|
|
255 |
" <td>7.0</td>\n", |
|
|
256 |
" <td>0.0</td>\n", |
|
|
257 |
" <td>24.0</td>\n", |
|
|
258 |
" </tr>\n", |
|
|
259 |
" <tr>\n", |
|
|
260 |
" <td>4</td>\n", |
|
|
261 |
" <td>4</td>\n", |
|
|
262 |
" <td>4</td>\n", |
|
|
263 |
" <td>272</td>\n", |
|
|
264 |
" <td>164716</td>\n", |
|
|
265 |
" <td>210407</td>\n", |
|
|
266 |
" <td>1.6202</td>\n", |
|
|
267 |
" <td>0</td>\n", |
|
|
268 |
" <td>0</td>\n", |
|
|
269 |
" <td>8</td>\n", |
|
|
270 |
" <td>0.0</td>\n", |
|
|
271 |
" <td>...</td>\n", |
|
|
272 |
" <td>0.0</td>\n", |
|
|
273 |
" <td>3.0</td>\n", |
|
|
274 |
" <td>0.0</td>\n", |
|
|
275 |
" <td>0.0</td>\n", |
|
|
276 |
" <td>0.0</td>\n", |
|
|
277 |
" <td>0.0</td>\n", |
|
|
278 |
" <td>5.0</td>\n", |
|
|
279 |
" <td>12.0</td>\n", |
|
|
280 |
" <td>0.0</td>\n", |
|
|
281 |
" <td>28.0</td>\n", |
|
|
282 |
" </tr>\n", |
|
|
283 |
" </tbody>\n", |
|
|
284 |
"</table>\n", |
|
|
285 |
"<p>5 rows × 24 columns</p>\n", |
|
|
286 |
"</div>" |
|
|
287 |
], |
|
|
288 |
"text/plain": [ |
|
|
289 |
" Unnamed: 0.1 Unnamed: 0.1.1 SUBJECT_ID HADM_ID ICUSTAY_ID los \\\n", |
|
|
290 |
"0 0 0 268 110404 280836 3.2490 \n", |
|
|
291 |
"1 1 1 269 106296 206613 3.2788 \n", |
|
|
292 |
"2 2 2 270 188028 220345 2.8939 \n", |
|
|
293 |
"3 3 3 271 173727 249196 2.0600 \n", |
|
|
294 |
"4 4 4 272 164716 210407 1.6202 \n", |
|
|
295 |
"\n", |
|
|
296 |
" hdeath death admission ud ... Sodium Temp Bilirubin WBC hr \\\n", |
|
|
297 |
"0 1 1 8 0.0 ... 0.0 0.0 0.0 0.0 11.0 \n", |
|
|
298 |
"1 0 0 8 17.0 ... 0.0 0.0 0.0 0.0 0.0 \n", |
|
|
299 |
"2 0 0 0 0.0 ... 0.0 3.0 0.0 0.0 11.0 \n", |
|
|
300 |
"3 0 0 8 0.0 ... 0.0 3.0 0.0 0.0 0.0 \n", |
|
|
301 |
"4 0 0 8 0.0 ... 0.0 3.0 0.0 0.0 0.0 \n", |
|
|
302 |
"\n", |
|
|
303 |
" gcs bp AGE UO saps2 \n", |
|
|
304 |
"0 26.0 13.0 12.0 0.0 82.0 \n", |
|
|
305 |
"1 0.0 5.0 7.0 0.0 37.0 \n", |
|
|
306 |
"2 0.0 13.0 18.0 0.0 45.0 \n", |
|
|
307 |
"3 0.0 0.0 7.0 0.0 24.0 \n", |
|
|
308 |
"4 0.0 5.0 12.0 0.0 28.0 \n", |
|
|
309 |
"\n", |
|
|
310 |
"[5 rows x 24 columns]" |
|
|
311 |
] |
|
|
312 |
}, |
|
|
313 |
"execution_count": 6, |
|
|
314 |
"metadata": {}, |
|
|
315 |
"output_type": "execute_result" |
|
|
316 |
} |
|
|
317 |
], |
|
|
318 |
"source": [ |
|
|
319 |
"saps = pd.read_csv(\"saps_ts.csv\", header=0, index_col=0)\n", |
|
|
320 |
"saps.head()" |
|
|
321 |
] |
|
|
322 |
}, |
|
|
323 |
{ |
|
|
324 |
"cell_type": "code", |
|
|
325 |
"execution_count": 7, |
|
|
326 |
"metadata": {}, |
|
|
327 |
"outputs": [ |
|
|
328 |
{ |
|
|
329 |
"data": { |
|
|
330 |
"text/plain": [ |
|
|
331 |
"['Unnamed: 0.1',\n", |
|
|
332 |
" 'Unnamed: 0.1.1',\n", |
|
|
333 |
" 'SUBJECT_ID',\n", |
|
|
334 |
" 'HADM_ID',\n", |
|
|
335 |
" 'ICUSTAY_ID',\n", |
|
|
336 |
" 'los',\n", |
|
|
337 |
" 'hdeath',\n", |
|
|
338 |
" 'death',\n", |
|
|
339 |
" 'admission',\n", |
|
|
340 |
" 'ud',\n", |
|
|
341 |
" 'bun',\n", |
|
|
342 |
" 'Bicarbonate',\n", |
|
|
343 |
" 'ventilation',\n", |
|
|
344 |
" 'Potassium',\n", |
|
|
345 |
" 'Sodium',\n", |
|
|
346 |
" 'Temp',\n", |
|
|
347 |
" 'Bilirubin',\n", |
|
|
348 |
" 'WBC',\n", |
|
|
349 |
" 'hr',\n", |
|
|
350 |
" 'gcs',\n", |
|
|
351 |
" 'bp',\n", |
|
|
352 |
" 'AGE',\n", |
|
|
353 |
" 'UO',\n", |
|
|
354 |
" 'saps2']" |
|
|
355 |
] |
|
|
356 |
}, |
|
|
357 |
"execution_count": 7, |
|
|
358 |
"metadata": {}, |
|
|
359 |
"output_type": "execute_result" |
|
|
360 |
} |
|
|
361 |
], |
|
|
362 |
"source": [ |
|
|
363 |
"list(saps.columns)" |
|
|
364 |
] |
|
|
365 |
}, |
|
|
366 |
{ |
|
|
367 |
"cell_type": "code", |
|
|
368 |
"execution_count": 9, |
|
|
369 |
"metadata": {}, |
|
|
370 |
"outputs": [], |
|
|
371 |
"source": [ |
|
|
372 |
"saps=saps.drop(['Unnamed: 0.1','Unnamed: 0.1.1'], axis=1)" |
|
|
373 |
] |
|
|
374 |
}, |
|
|
375 |
{ |
|
|
376 |
"cell_type": "code", |
|
|
377 |
"execution_count": 10, |
|
|
378 |
"metadata": {}, |
|
|
379 |
"outputs": [ |
|
|
380 |
{ |
|
|
381 |
"name": "stdout", |
|
|
382 |
"output_type": "stream", |
|
|
383 |
"text": [ |
|
|
384 |
"Dimensions of y before reshaping: (61117,)\n", |
|
|
385 |
"Dimensions of X before reshaping: (61117, 15)\n" |
|
|
386 |
] |
|
|
387 |
} |
|
|
388 |
], |
|
|
389 |
"source": [ |
|
|
390 |
"# Create arrays for features and target variable\n", |
|
|
391 |
"y = saps['hdeath'].values\n", |
|
|
392 |
"X = saps[['admission', 'ud', 'bun', 'Bicarbonate', 'ventilation', 'Potassium', 'Sodium', 'Temp', 'Bilirubin', 'WBC', 'hr', 'gcs', 'bp', 'AGE', 'UO']].values\n", |
|
|
393 |
"\n", |
|
|
394 |
"# Print the dimensions of X and y before reshaping\n", |
|
|
395 |
"print(\"Dimensions of y before reshaping: {}\".format(y.shape))\n", |
|
|
396 |
"print(\"Dimensions of X before reshaping: {}\".format(X.shape))\n", |
|
|
397 |
"\n", |
|
|
398 |
"# Reshape X and y\n", |
|
|
399 |
"#y = y.reshape(-1, 1)\n", |
|
|
400 |
"#X = X.reshape(-1, 1)\n", |
|
|
401 |
"\n", |
|
|
402 |
"#Print the dimensions of X and y after reshaping\n", |
|
|
403 |
"#print(\"Dimensions of y after reshaping: {}\".format(y.shape))\n", |
|
|
404 |
"#print(\"Dimensions of X after reshaping: {}\".format(X.shape))" |
|
|
405 |
] |
|
|
406 |
}, |
|
|
407 |
{ |
|
|
408 |
"cell_type": "code", |
|
|
409 |
"execution_count": 7, |
|
|
410 |
"metadata": {}, |
|
|
411 |
"outputs": [ |
|
|
412 |
{ |
|
|
413 |
"data": { |
|
|
414 |
"text/plain": [ |
|
|
415 |
"array([[ 8., 0., 6., ..., 13., 12., 0.],\n", |
|
|
416 |
" [ 8., 17., 0., ..., 5., 7., 0.],\n", |
|
|
417 |
" [ 0., 0., 0., ..., 13., 18., 0.],\n", |
|
|
418 |
" ...,\n", |
|
|
419 |
" [ 0., 0., 0., ..., 5., 7., 0.],\n", |
|
|
420 |
" [ 0., 0., 0., ..., 13., 12., 0.],\n", |
|
|
421 |
" [ 8., 0., 0., ..., 5., 0., 0.]])" |
|
|
422 |
] |
|
|
423 |
}, |
|
|
424 |
"execution_count": 7, |
|
|
425 |
"metadata": {}, |
|
|
426 |
"output_type": "execute_result" |
|
|
427 |
} |
|
|
428 |
], |
|
|
429 |
"source": [ |
|
|
430 |
"X" |
|
|
431 |
] |
|
|
432 |
}, |
|
|
433 |
{ |
|
|
434 |
"cell_type": "code", |
|
|
435 |
"execution_count": 11, |
|
|
436 |
"metadata": {}, |
|
|
437 |
"outputs": [ |
|
|
438 |
{ |
|
|
439 |
"data": { |
|
|
440 |
"text/plain": [ |
|
|
441 |
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", |
|
|
442 |
" metric_params=None, n_jobs=None, n_neighbors=6, p=2,\n", |
|
|
443 |
" weights='uniform')" |
|
|
444 |
] |
|
|
445 |
}, |
|
|
446 |
"execution_count": 11, |
|
|
447 |
"metadata": {}, |
|
|
448 |
"output_type": "execute_result" |
|
|
449 |
} |
|
|
450 |
], |
|
|
451 |
"source": [ |
|
|
452 |
"from sklearn.neighbors import KNeighborsClassifier\n", |
|
|
453 |
"knn=KNeighborsClassifier(n_neighbors=6)\n", |
|
|
454 |
"knn.fit(X,y)" |
|
|
455 |
] |
|
|
456 |
}, |
|
|
457 |
{ |
|
|
458 |
"cell_type": "code", |
|
|
459 |
"execution_count": 12, |
|
|
460 |
"metadata": {}, |
|
|
461 |
"outputs": [ |
|
|
462 |
{ |
|
|
463 |
"name": "stdout", |
|
|
464 |
"output_type": "stream", |
|
|
465 |
"text": [ |
|
|
466 |
"Prediction: [0]\n" |
|
|
467 |
] |
|
|
468 |
} |
|
|
469 |
], |
|
|
470 |
"source": [ |
|
|
471 |
"# Predict the labels for the training data X\n", |
|
|
472 |
"y_pred = knn.predict(X)\n", |
|
|
473 |
"\n", |
|
|
474 |
"# Predict and print the label for the new data point X_new\n", |
|
|
475 |
"new_prediction = knn.predict([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])\n", |
|
|
476 |
"print(\"Prediction: {}\".format(new_prediction))\n" |
|
|
477 |
] |
|
|
478 |
}, |
|
|
479 |
{ |
|
|
480 |
"cell_type": "code", |
|
|
481 |
"execution_count": 10, |
|
|
482 |
"metadata": {}, |
|
|
483 |
"outputs": [ |
|
|
484 |
{ |
|
|
485 |
"name": "stdout", |
|
|
486 |
"output_type": "stream", |
|
|
487 |
"text": [ |
|
|
488 |
"Prediction: [1]\n" |
|
|
489 |
] |
|
|
490 |
} |
|
|
491 |
], |
|
|
492 |
"source": [ |
|
|
493 |
"# Predict and print the label for the new data point X_new\n", |
|
|
494 |
"new_prediction = knn.predict([[8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]])\n", |
|
|
495 |
"print(\"Prediction: {}\".format(new_prediction))" |
|
|
496 |
] |
|
|
497 |
}, |
|
|
498 |
{ |
|
|
499 |
"cell_type": "code", |
|
|
500 |
"execution_count": 11, |
|
|
501 |
"metadata": {}, |
|
|
502 |
"outputs": [ |
|
|
503 |
{ |
|
|
504 |
"name": "stdout", |
|
|
505 |
"output_type": "stream", |
|
|
506 |
"text": [ |
|
|
507 |
"Prediction: [0]\n" |
|
|
508 |
] |
|
|
509 |
} |
|
|
510 |
], |
|
|
511 |
"source": [ |
|
|
512 |
"# Predict and print the label for the new data point X_new\n", |
|
|
513 |
"new_prediction = knn.predict([[8,0,8,0,8,0,8,0,0,8,0,8,0,0,0]])\n", |
|
|
514 |
"print(\"Prediction: {}\".format(new_prediction))" |
|
|
515 |
] |
|
|
516 |
}, |
|
|
517 |
{ |
|
|
518 |
"cell_type": "code", |
|
|
519 |
"execution_count": 13, |
|
|
520 |
"metadata": {}, |
|
|
521 |
"outputs": [ |
|
|
522 |
{ |
|
|
523 |
"name": "stdout", |
|
|
524 |
"output_type": "stream", |
|
|
525 |
"text": [ |
|
|
526 |
"Training Accuracy: 0.924405694116547\n", |
|
|
527 |
"Testing Accuracy: 0.9198298429319371\n" |
|
|
528 |
] |
|
|
529 |
} |
|
|
530 |
], |
|
|
531 |
"source": [ |
|
|
532 |
"# Import necessary modules\n", |
|
|
533 |
"from sklearn.neighbors import KNeighborsClassifier\n", |
|
|
534 |
"from sklearn.model_selection import train_test_split\n", |
|
|
535 |
"\n", |
|
|
536 |
"\n", |
|
|
537 |
"# Split into training and test set\n", |
|
|
538 |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42, stratify=y)\n", |
|
|
539 |
"\n", |
|
|
540 |
"# Create a k-NN classifier with 10 neighbors: knn\n", |
|
|
541 |
"knn = KNeighborsClassifier(n_neighbors=10)\n", |
|
|
542 |
"\n", |
|
|
543 |
"# Fit the classifier to the training data\n", |
|
|
544 |
"knn.fit(X_train, y_train)\n", |
|
|
545 |
"\n", |
|
|
546 |
"# Print the accuracy\n", |
|
|
547 |
"print('Training Accuracy: {}'.format(knn.score(X_train,y_train)))\n", |
|
|
548 |
"print('Testing Accuracy: {}'.format(knn.score(X_test, y_test)))\n", |
|
|
549 |
"\n" |
|
|
550 |
] |
|
|
551 |
}, |
|
|
552 |
{ |
|
|
553 |
"cell_type": "code", |
|
|
554 |
"execution_count": 15, |
|
|
555 |
"metadata": {}, |
|
|
556 |
"outputs": [ |
|
|
557 |
{ |
|
|
558 |
"name": "stdout", |
|
|
559 |
"output_type": "stream", |
|
|
560 |
"text": [ |
|
|
561 |
"Training Accuracy: 0.924405694116547\n", |
|
|
562 |
"Testing Accuracy: 0.9198298429319371\n" |
|
|
563 |
] |
|
|
564 |
} |
|
|
565 |
], |
|
|
566 |
"source": [ |
|
|
567 |
"from sklearn.metrics import accuracy_score\n", |
|
|
568 |
"print('Training Accuracy: {}'.format((accuracy_score(knn.predict(X_train), y_train))))\n", |
|
|
569 |
"print('Testing Accuracy: {}'.format((accuracy_score(knn.predict(X_test), y_test))))" |
|
|
570 |
] |
|
|
571 |
}, |
|
|
572 |
{ |
|
|
573 |
"cell_type": "code", |
|
|
574 |
"execution_count": 13, |
|
|
575 |
"metadata": {}, |
|
|
576 |
"outputs": [ |
|
|
577 |
{ |
|
|
578 |
"name": "stdout", |
|
|
579 |
"output_type": "stream", |
|
|
580 |
"text": [ |
|
|
581 |
"Training Accuracy: 0.9249176773771296\n", |
|
|
582 |
"Testing Accuracy: 0.9198298429319371\n" |
|
|
583 |
] |
|
|
584 |
} |
|
|
585 |
], |
|
|
586 |
"source": [ |
|
|
587 |
"# Import necessary modules\n", |
|
|
588 |
"from sklearn.neighbors import KNeighborsClassifier\n", |
|
|
589 |
"from sklearn.model_selection import train_test_split\n", |
|
|
590 |
"\n", |
|
|
591 |
"\n", |
|
|
592 |
"# Split into training and test set\n", |
|
|
593 |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42, stratify=y)\n", |
|
|
594 |
"\n", |
|
|
595 |
"# Create a k-NN classifier with 7 neighbors: knn\n", |
|
|
596 |
"knn = KNeighborsClassifier(n_neighbors=7)\n", |
|
|
597 |
"\n", |
|
|
598 |
"# Fit the classifier to the training data\n", |
|
|
599 |
"knn.fit(X_train, y_train)\n", |
|
|
600 |
"\n", |
|
|
601 |
"# Print the accuracy\n", |
|
|
602 |
"print('Training Accuracy: {}'.format(knn.score(X_train,y_train)))\n", |
|
|
603 |
"print('Testing Accuracy: {}'.format(knn.score(X_test, y_test)))" |
|
|
604 |
] |
|
|
605 |
}, |
|
|
606 |
{ |
|
|
607 |
"cell_type": "code", |
|
|
608 |
"execution_count": 16, |
|
|
609 |
"metadata": {}, |
|
|
610 |
"outputs": [ |
|
|
611 |
{ |
|
|
612 |
"data": { |
|
|
613 |
"application/javascript": [ |
|
|
614 |
"\n", |
|
|
615 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
616 |
" " |
|
|
617 |
], |
|
|
618 |
"text/plain": [ |
|
|
619 |
"<IPython.core.display.Javascript object>" |
|
|
620 |
] |
|
|
621 |
}, |
|
|
622 |
"metadata": {}, |
|
|
623 |
"output_type": "display_data" |
|
|
624 |
}, |
|
|
625 |
{ |
|
|
626 |
"data": { |
|
|
627 |
"application/javascript": [ |
|
|
628 |
"\n", |
|
|
629 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
630 |
" " |
|
|
631 |
], |
|
|
632 |
"text/plain": [ |
|
|
633 |
"<IPython.core.display.Javascript object>" |
|
|
634 |
] |
|
|
635 |
}, |
|
|
636 |
"metadata": {}, |
|
|
637 |
"output_type": "display_data" |
|
|
638 |
}, |
|
|
639 |
{ |
|
|
640 |
"data": { |
|
|
641 |
"application/javascript": [ |
|
|
642 |
"\n", |
|
|
643 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
644 |
" " |
|
|
645 |
], |
|
|
646 |
"text/plain": [ |
|
|
647 |
"<IPython.core.display.Javascript object>" |
|
|
648 |
] |
|
|
649 |
}, |
|
|
650 |
"metadata": {}, |
|
|
651 |
"output_type": "display_data" |
|
|
652 |
}, |
|
|
653 |
{ |
|
|
654 |
"data": { |
|
|
655 |
"application/javascript": [ |
|
|
656 |
"\n", |
|
|
657 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
658 |
" " |
|
|
659 |
], |
|
|
660 |
"text/plain": [ |
|
|
661 |
"<IPython.core.display.Javascript object>" |
|
|
662 |
] |
|
|
663 |
}, |
|
|
664 |
"metadata": {}, |
|
|
665 |
"output_type": "display_data" |
|
|
666 |
}, |
|
|
667 |
{ |
|
|
668 |
"data": { |
|
|
669 |
"application/javascript": [ |
|
|
670 |
"\n", |
|
|
671 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
672 |
" " |
|
|
673 |
], |
|
|
674 |
"text/plain": [ |
|
|
675 |
"<IPython.core.display.Javascript object>" |
|
|
676 |
] |
|
|
677 |
}, |
|
|
678 |
"metadata": {}, |
|
|
679 |
"output_type": "display_data" |
|
|
680 |
}, |
|
|
681 |
{ |
|
|
682 |
"data": { |
|
|
683 |
"application/javascript": [ |
|
|
684 |
"\n", |
|
|
685 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
686 |
" " |
|
|
687 |
], |
|
|
688 |
"text/plain": [ |
|
|
689 |
"<IPython.core.display.Javascript object>" |
|
|
690 |
] |
|
|
691 |
}, |
|
|
692 |
"metadata": {}, |
|
|
693 |
"output_type": "display_data" |
|
|
694 |
}, |
|
|
695 |
{ |
|
|
696 |
"data": { |
|
|
697 |
"application/javascript": [ |
|
|
698 |
"\n", |
|
|
699 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
700 |
" " |
|
|
701 |
], |
|
|
702 |
"text/plain": [ |
|
|
703 |
"<IPython.core.display.Javascript object>" |
|
|
704 |
] |
|
|
705 |
}, |
|
|
706 |
"metadata": {}, |
|
|
707 |
"output_type": "display_data" |
|
|
708 |
}, |
|
|
709 |
{ |
|
|
710 |
"data": { |
|
|
711 |
"application/javascript": [ |
|
|
712 |
"\n", |
|
|
713 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
714 |
" " |
|
|
715 |
], |
|
|
716 |
"text/plain": [ |
|
|
717 |
"<IPython.core.display.Javascript object>" |
|
|
718 |
] |
|
|
719 |
}, |
|
|
720 |
"metadata": {}, |
|
|
721 |
"output_type": "display_data" |
|
|
722 |
}, |
|
|
723 |
{ |
|
|
724 |
"data": { |
|
|
725 |
"application/javascript": [ |
|
|
726 |
"\n", |
|
|
727 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
728 |
" " |
|
|
729 |
], |
|
|
730 |
"text/plain": [ |
|
|
731 |
"<IPython.core.display.Javascript object>" |
|
|
732 |
] |
|
|
733 |
}, |
|
|
734 |
"metadata": {}, |
|
|
735 |
"output_type": "display_data" |
|
|
736 |
}, |
|
|
737 |
{ |
|
|
738 |
"data": { |
|
|
739 |
"application/javascript": [ |
|
|
740 |
"\n", |
|
|
741 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
742 |
" " |
|
|
743 |
], |
|
|
744 |
"text/plain": [ |
|
|
745 |
"<IPython.core.display.Javascript object>" |
|
|
746 |
] |
|
|
747 |
}, |
|
|
748 |
"metadata": {}, |
|
|
749 |
"output_type": "display_data" |
|
|
750 |
}, |
|
|
751 |
{ |
|
|
752 |
"data": { |
|
|
753 |
"application/javascript": [ |
|
|
754 |
"\n", |
|
|
755 |
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import numpy as np\\nimport matplotlib.pyplot as plt\\nimport os\\nimport pandas as pd'); }\n", |
|
|
756 |
" " |
|
|
757 |
], |
|
|
758 |
"text/plain": [ |
|
|
759 |
"<IPython.core.display.Javascript object>" |
|
|
760 |
] |
|
|
761 |
}, |
|
|
762 |
"metadata": {}, |
|
|
763 |
"output_type": "display_data" |
|
|
764 |
}, |
|
|
765 |
{ |
|
|
766 |
"data": { |
|
|
767 |
"image/png": "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\n", |
|
|
768 |
"text/plain": [ |
|
|
769 |
"<Figure size 720x432 with 1 Axes>" |
|
|
770 |
] |
|
|
771 |
}, |
|
|
772 |
"metadata": { |
|
|
773 |
"needs_background": "light" |
|
|
774 |
}, |
|
|
775 |
"output_type": "display_data" |
|
|
776 |
} |
|
|
777 |
], |
|
|
778 |
"source": [ |
|
|
779 |
"# Setup arrays to store train and test accuracies\n", |
|
|
780 |
"neighbors = np.arange(1, 11)\n", |
|
|
781 |
"train_accuracy = np.empty(len(neighbors))\n", |
|
|
782 |
"test_accuracy = np.empty(len(neighbors))\n", |
|
|
783 |
"\n", |
|
|
784 |
"# Loop over different values of k\n", |
|
|
785 |
"for i, k in enumerate(neighbors):\n", |
|
|
786 |
" # Setup a k-NN Classifier with k neighbors: knn\n", |
|
|
787 |
" knn = KNeighborsClassifier(n_neighbors=k)\n", |
|
|
788 |
"\n", |
|
|
789 |
" # Fit the classifier to the training data\n", |
|
|
790 |
" knn.fit(X_train, y_train)\n", |
|
|
791 |
" \n", |
|
|
792 |
" #Compute accuracy on the training set\n", |
|
|
793 |
" train_accuracy[i] = knn.score(X_train, y_train)\n", |
|
|
794 |
"\n", |
|
|
795 |
" #Compute accuracy on the testing set\n", |
|
|
796 |
" test_accuracy[i] = knn.score(X_test, y_test)\n", |
|
|
797 |
"\n", |
|
|
798 |
"# Generate plot\n", |
|
|
799 |
"plt.figure(figsize=(10,6))\n", |
|
|
800 |
"plt.title('k-NN: Varying Number of Neighbors')\n", |
|
|
801 |
"plt.plot(neighbors, test_accuracy, label = 'Testing Accuracy')\n", |
|
|
802 |
"plt.plot(neighbors, train_accuracy, label = 'Training Accuracy')\n", |
|
|
803 |
"plt.legend()\n", |
|
|
804 |
"plt.xlabel('Number of Neighbors')\n", |
|
|
805 |
"plt.ylabel('Accuracy')\n", |
|
|
806 |
"plt.show()" |
|
|
807 |
] |
|
|
808 |
}, |
|
|
809 |
{ |
|
|
810 |
"cell_type": "code", |
|
|
811 |
"execution_count": 15, |
|
|
812 |
"metadata": {}, |
|
|
813 |
"outputs": [ |
|
|
814 |
{ |
|
|
815 |
"name": "stdout", |
|
|
816 |
"output_type": "stream", |
|
|
817 |
"text": [ |
|
|
818 |
"[[21404 421]\n", |
|
|
819 |
" [ 1586 1036]]\n", |
|
|
820 |
" precision recall f1-score support\n", |
|
|
821 |
"\n", |
|
|
822 |
" 0 0.93 0.98 0.96 21825\n", |
|
|
823 |
" 1 0.71 0.40 0.51 2622\n", |
|
|
824 |
"\n", |
|
|
825 |
" accuracy 0.92 24447\n", |
|
|
826 |
" macro avg 0.82 0.69 0.73 24447\n", |
|
|
827 |
"weighted avg 0.91 0.92 0.91 24447\n", |
|
|
828 |
"\n" |
|
|
829 |
] |
|
|
830 |
} |
|
|
831 |
], |
|
|
832 |
"source": [ |
|
|
833 |
"# Import necessary modules\n", |
|
|
834 |
"from sklearn.metrics import classification_report\n", |
|
|
835 |
"from sklearn.metrics import confusion_matrix\n", |
|
|
836 |
"\n", |
|
|
837 |
"# Create training and test set\n", |
|
|
838 |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size =0.4, random_state=42)\n", |
|
|
839 |
"\n", |
|
|
840 |
"# Instantiate a k-NN classifier: knn\n", |
|
|
841 |
"knn = KNeighborsClassifier (n_neighbors=7)\n", |
|
|
842 |
"\n", |
|
|
843 |
"# Fit the classifier to the training data\n", |
|
|
844 |
"knn.fit(X_train, y_train)\n", |
|
|
845 |
"\n", |
|
|
846 |
"# Predict the labels of the test data: y_pred\n", |
|
|
847 |
"y_pred = knn.predict(X_test)\n", |
|
|
848 |
"\n", |
|
|
849 |
"# Generate the confusion matrix and classification performance report\n", |
|
|
850 |
"print(confusion_matrix(y_test, y_pred))\n", |
|
|
851 |
"print(classification_report(y_test, y_pred))" |
|
|
852 |
] |
|
|
853 |
}, |
|
|
854 |
{ |
|
|
855 |
"cell_type": "markdown", |
|
|
856 |
"metadata": {}, |
|
|
857 |
"source": [ |
|
|
858 |
"In the support column - the firgures represent the number of ICU patients in the test set on which 21,825 are ICU stay survivors and 2,622 are non-survivors (deceased). \n", |
|
|
859 |
"\n", |
|
|
860 |
"Our model shows 92% accuracy - represents the number of correctly classified (True positive and true negative) over the total number of data instances (true positive, false positive, true negative, and false negative). \n", |
|
|
861 |
"\n", |
|
|
862 |
"Precision (positive predicitve value) in classifying the data instances. Defined as true positive over true positive plus false positive. Our model have a 93% precision in classifying ICU stay survivors as survivors and a 71% precision classifying ICU patient deaths correctly. \n", |
|
|
863 |
"\n", |
|
|
864 |
"Recall (sensetivity or ture positive rate). Defined as true positive over true positive plus false negative. 100% recall means there is zero false negative. Our model have a high (98%) recall classifying ICU stay survivors (there only 2% false negative - survivors clasfied as deceased. Model sensetivity classifying deceased is only 40%, that is 60% fase negative - deceased classified as survivors. \n", |
|
|
865 |
"\n", |
|
|
866 |
"so, ideally in a good classifier, we want a metric that takes into account both precision and recall. We have f1-score for that. f1-score becomes high only if both precision and recall becomes high. Our model shows f1-score of 96% for classifying survivors and 51% classifying deceased. " |
|
|
867 |
] |
|
|
868 |
}, |
|
|
869 |
{ |
|
|
870 |
"cell_type": "markdown", |
|
|
871 |
"metadata": {}, |
|
|
872 |
"source": [] |
|
|
873 |
} |
|
|
874 |
], |
|
|
875 |
"metadata": { |
|
|
876 |
"kernelspec": { |
|
|
877 |
"display_name": "Python 3", |
|
|
878 |
"language": "python", |
|
|
879 |
"name": "python3" |
|
|
880 |
}, |
|
|
881 |
"language_info": { |
|
|
882 |
"codemirror_mode": { |
|
|
883 |
"name": "ipython", |
|
|
884 |
"version": 3 |
|
|
885 |
}, |
|
|
886 |
"file_extension": ".py", |
|
|
887 |
"mimetype": "text/x-python", |
|
|
888 |
"name": "python", |
|
|
889 |
"nbconvert_exporter": "python", |
|
|
890 |
"pygments_lexer": "ipython3", |
|
|
891 |
"version": "3.7.4" |
|
|
892 |
} |
|
|
893 |
}, |
|
|
894 |
"nbformat": 4, |
|
|
895 |
"nbformat_minor": 1 |
|
|
896 |
} |