897 lines (896 with data), 57.0 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"hide": true
},
"source": [
"import os\n",
"import pandas as pd\n",
"# ^^^ pyforest auto-imports - don't write above this line\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import os\n",
"import sklearn\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"import os\n",
"\n",
"$$\n",
"\\renewcommand{\\like}{{\\cal L}}\n",
"\\renewcommand{\\loglike}{{\\ell}}\n",
"\\renewcommand{\\err}{{\\cal E}}\n",
"\\renewcommand{\\dat}{{\\cal D}}\n",
"\\renewcommand{\\hyp}{{\\cal H}}\n",
"\\renewcommand{\\Ex}[2]{E_{#1}[#2]}\n",
"\\renewcommand{\\x}{{\\mathbf x}}\n",
"\\renewcommand{\\v}[1]{{\\mathbf #1}}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Clinical Deterioration Prediction Model - KNN "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os'); }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'C:\\\\Users\\\\abebu\\\\Dropbox\\\\Data Science\\\\Projects\\\\Capstone Project 1\\\\Potential Projects\\\\9. MIMIC\\\\Machine Learning'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"os.getcwd()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os\\nimport pandas as pd'); }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"os.chdir(\"C://Users/abebu/Google Drive/mimic-iii-clinical-database-1.4\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" if (window._pyforest_update_imports_cell) { window._pyforest_update_imports_cell('import os\\nimport pandas as pd'); }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0.1</th>\n",
" <th>Unnamed: 0.1.1</th>\n",
" <th>SUBJECT_ID</th>\n",
" <th>HADM_ID</th>\n",
" <th>ICUSTAY_ID</th>\n",
" <th>los</th>\n",
" <th>hdeath</th>\n",
" <th>death</th>\n",
" <th>admission</th>\n",
" <th>ud</th>\n",
" <th>...</th>\n",
" <th>Sodium</th>\n",
" <th>Temp</th>\n",
" <th>Bilirubin</th>\n",
" <th>WBC</th>\n",
" <th>hr</th>\n",
" <th>gcs</th>\n",
" <th>bp</th>\n",
" <th>AGE</th>\n",
" <th>UO</th>\n",
" <th>saps2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>268</td>\n",
" <td>110404</td>\n",
" <td>280836</td>\n",
" <td>3.2490</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>11.0</td>\n",
" <td>26.0</td>\n",
" <td>13.0</td>\n",
" <td>12.0</td>\n",
" <td>0.0</td>\n",
" <td>82.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>269</td>\n",
" <td>106296</td>\n",
" <td>206613</td>\n",
" <td>3.2788</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>17.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>37.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>270</td>\n",
" <td>188028</td>\n",
" <td>220345</td>\n",
" <td>2.8939</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>11.0</td>\n",
" <td>0.0</td>\n",
" <td>13.0</td>\n",
" <td>18.0</td>\n",
" <td>0.0</td>\n",
" <td>45.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>271</td>\n",
" <td>173727</td>\n",
" <td>249196</td>\n",
" <td>2.0600</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>24.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>272</td>\n",
" <td>164716</td>\n",
" <td>210407</td>\n",
" <td>1.6202</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>12.0</td>\n",
" <td>0.0</td>\n",
" <td>28.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0.1 Unnamed: 0.1.1 SUBJECT_ID HADM_ID ICUSTAY_ID los \\\n",
"0 0 0 268 110404 280836 3.2490 \n",
"1 1 1 269 106296 206613 3.2788 \n",
"2 2 2 270 188028 220345 2.8939 \n",
"3 3 3 271 173727 249196 2.0600 \n",
"4 4 4 272 164716 210407 1.6202 \n",
"\n",
" hdeath death admission ud ... Sodium Temp Bilirubin WBC hr \\\n",
"0 1 1 8 0.0 ... 0.0 0.0 0.0 0.0 11.0 \n",
"1 0 0 8 17.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
"2 0 0 0 0.0 ... 0.0 3.0 0.0 0.0 11.0 \n",
"3 0 0 8 0.0 ... 0.0 3.0 0.0 0.0 0.0 \n",
"4 0 0 8 0.0 ... 0.0 3.0 0.0 0.0 0.0 \n",
"\n",
" gcs bp AGE UO saps2 \n",
"0 26.0 13.0 12.0 0.0 82.0 \n",
"1 0.0 5.0 7.0 0.0 37.0 \n",
"2 0.0 13.0 18.0 0.0 45.0 \n",
"3 0.0 0.0 7.0 0.0 24.0 \n",
"4 0.0 5.0 12.0 0.0 28.0 \n",
"\n",
"[5 rows x 24 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"saps = pd.read_csv(\"saps_ts.csv\", header=0, index_col=0)\n",
"saps.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Unnamed: 0.1',\n",
" 'Unnamed: 0.1.1',\n",
" 'SUBJECT_ID',\n",
" 'HADM_ID',\n",
" 'ICUSTAY_ID',\n",
" 'los',\n",
" 'hdeath',\n",
" 'death',\n",
" 'admission',\n",
" 'ud',\n",
" 'bun',\n",
" 'Bicarbonate',\n",
" 'ventilation',\n",
" 'Potassium',\n",
" 'Sodium',\n",
" 'Temp',\n",
" 'Bilirubin',\n",
" 'WBC',\n",
" 'hr',\n",
" 'gcs',\n",
" 'bp',\n",
" 'AGE',\n",
" 'UO',\n",
" 'saps2']"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(saps.columns)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"saps=saps.drop(['Unnamed: 0.1','Unnamed: 0.1.1'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dimensions of y before reshaping: (61117,)\n",
"Dimensions of X before reshaping: (61117, 15)\n"
]
}
],
"source": [
"# Create arrays for features and target variable\n",
"y = saps['hdeath'].values\n",
"X = saps[['admission', 'ud', 'bun', 'Bicarbonate', 'ventilation', 'Potassium', 'Sodium', 'Temp', 'Bilirubin', 'WBC', 'hr', 'gcs', 'bp', 'AGE', 'UO']].values\n",
"\n",
"# Print the dimensions of X and y before reshaping\n",
"print(\"Dimensions of y before reshaping: {}\".format(y.shape))\n",
"print(\"Dimensions of X before reshaping: {}\".format(X.shape))\n",
"\n",
"# Reshape X and y\n",
"#y = y.reshape(-1, 1)\n",
"#X = X.reshape(-1, 1)\n",
"\n",
"#Print the dimensions of X and y after reshaping\n",
"#print(\"Dimensions of y after reshaping: {}\".format(y.shape))\n",
"#print(\"Dimensions of X after reshaping: {}\".format(X.shape))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 8., 0., 6., ..., 13., 12., 0.],\n",
" [ 8., 17., 0., ..., 5., 7., 0.],\n",
" [ 0., 0., 0., ..., 13., 18., 0.],\n",
" ...,\n",
" [ 0., 0., 0., ..., 5., 7., 0.],\n",
" [ 0., 0., 0., ..., 13., 12., 0.],\n",
" [ 8., 0., 0., ..., 5., 0., 0.]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=None, n_neighbors=6, p=2,\n",
" weights='uniform')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"knn=KNeighborsClassifier(n_neighbors=6)\n",
"knn.fit(X,y)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Prediction: [0]\n"
]
}
],
"source": [
"# Predict the labels for the training data X\n",
"y_pred = knn.predict(X)\n",
"\n",
"# Predict and print the label for the new data point X_new\n",
"new_prediction = knn.predict([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])\n",
"print(\"Prediction: {}\".format(new_prediction))\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Prediction: [1]\n"
]
}
],
"source": [
"# Predict and print the label for the new data point X_new\n",
"new_prediction = knn.predict([[8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]])\n",
"print(\"Prediction: {}\".format(new_prediction))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Prediction: [0]\n"
]
}
],
"source": [
"# Predict and print the label for the new data point X_new\n",
"new_prediction = knn.predict([[8,0,8,0,8,0,8,0,0,8,0,8,0,0,0]])\n",
"print(\"Prediction: {}\".format(new_prediction))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Accuracy: 0.924405694116547\n",
"Testing Accuracy: 0.9198298429319371\n"
]
}
],
"source": [
"# Import necessary modules\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"\n",
"# Split into training and test set\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42, stratify=y)\n",
"\n",
"# Create a k-NN classifier with 10 neighbors: knn\n",
"knn = KNeighborsClassifier(n_neighbors=10)\n",
"\n",
"# Fit the classifier to the training data\n",
"knn.fit(X_train, y_train)\n",
"\n",
"# Print the accuracy\n",
"print('Training Accuracy: {}'.format(knn.score(X_train,y_train)))\n",
"print('Testing Accuracy: {}'.format(knn.score(X_test, y_test)))\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Accuracy: 0.924405694116547\n",
"Testing Accuracy: 0.9198298429319371\n"
]
}
],
"source": [
"from sklearn.metrics import accuracy_score\n",
"print('Training Accuracy: {}'.format((accuracy_score(knn.predict(X_train), y_train))))\n",
"print('Testing Accuracy: {}'.format((accuracy_score(knn.predict(X_test), y_test))))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Accuracy: 0.9249176773771296\n",
"Testing Accuracy: 0.9198298429319371\n"
]
}
],
"source": [
"# Import necessary modules\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"\n",
"# Split into training and test set\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42, stratify=y)\n",
"\n",
"# Create a k-NN classifier with 7 neighbors: knn\n",
"knn = KNeighborsClassifier(n_neighbors=7)\n",
"\n",
"# Fit the classifier to the training data\n",
"knn.fit(X_train, y_train)\n",
"\n",
"# Print the accuracy\n",
"print('Training Accuracy: {}'.format(knn.score(X_train,y_train)))\n",
"print('Testing Accuracy: {}'.format(knn.score(X_test, y_test)))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" 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",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Setup arrays to store train and test accuracies\n",
"neighbors = np.arange(1, 11)\n",
"train_accuracy = np.empty(len(neighbors))\n",
"test_accuracy = np.empty(len(neighbors))\n",
"\n",
"# Loop over different values of k\n",
"for i, k in enumerate(neighbors):\n",
" # Setup a k-NN Classifier with k neighbors: knn\n",
" knn = KNeighborsClassifier(n_neighbors=k)\n",
"\n",
" # Fit the classifier to the training data\n",
" knn.fit(X_train, y_train)\n",
" \n",
" #Compute accuracy on the training set\n",
" train_accuracy[i] = knn.score(X_train, y_train)\n",
"\n",
" #Compute accuracy on the testing set\n",
" test_accuracy[i] = knn.score(X_test, y_test)\n",
"\n",
"# Generate plot\n",
"plt.figure(figsize=(10,6))\n",
"plt.title('k-NN: Varying Number of Neighbors')\n",
"plt.plot(neighbors, test_accuracy, label = 'Testing Accuracy')\n",
"plt.plot(neighbors, train_accuracy, label = 'Training Accuracy')\n",
"plt.legend()\n",
"plt.xlabel('Number of Neighbors')\n",
"plt.ylabel('Accuracy')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[21404 421]\n",
" [ 1586 1036]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.93 0.98 0.96 21825\n",
" 1 0.71 0.40 0.51 2622\n",
"\n",
" accuracy 0.92 24447\n",
" macro avg 0.82 0.69 0.73 24447\n",
"weighted avg 0.91 0.92 0.91 24447\n",
"\n"
]
}
],
"source": [
"# Import necessary modules\n",
"from sklearn.metrics import classification_report\n",
"from sklearn.metrics import confusion_matrix\n",
"\n",
"# Create training and test set\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size =0.4, random_state=42)\n",
"\n",
"# Instantiate a k-NN classifier: knn\n",
"knn = KNeighborsClassifier (n_neighbors=7)\n",
"\n",
"# Fit the classifier to the training data\n",
"knn.fit(X_train, y_train)\n",
"\n",
"# Predict the labels of the test data: y_pred\n",
"y_pred = knn.predict(X_test)\n",
"\n",
"# Generate the confusion matrix and classification performance report\n",
"print(confusion_matrix(y_test, y_pred))\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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",
"\n",
"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",
"\n",
"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",
"\n",
"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",
"\n",
"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. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}