kidney_prediction_RF_model_new

parent 10160eff
{
"cells": [
{
"cell_type": "markdown",
"id": "e555e9d8",
"metadata": {},
"source": [
"### Importing the dependancies"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1123a658",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "markdown",
"id": "4e1ec49f",
"metadata": {},
"source": [
"### Data collecting process"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "111d33c0",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"data = pd.read_csv('new_model.csv')"
]
},
{
"cell_type": "markdown",
"id": "5da5cf75",
"metadata": {},
"source": [
"### Explore the dataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "740f14ff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Bp', 'Sg', 'Al', 'Su', 'Rbc', 'Bu', 'Sc', 'Sod', 'Pot', 'Hemo', 'Wbcc',\n",
" 'Rbcc', 'Htn', 'Class'],\n",
" dtype='object')\n"
]
},
{
"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>Bp</th>\n",
" <th>Sg</th>\n",
" <th>Al</th>\n",
" <th>Su</th>\n",
" <th>Rbc</th>\n",
" <th>Bu</th>\n",
" <th>Sc</th>\n",
" <th>Sod</th>\n",
" <th>Pot</th>\n",
" <th>Hemo</th>\n",
" <th>Wbcc</th>\n",
" <th>Rbcc</th>\n",
" <th>Htn</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>80.0</td>\n",
" <td>1.020</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>36.0</td>\n",
" <td>1.2</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>15.4</td>\n",
" <td>7800.0</td>\n",
" <td>5.20</td>\n",
" <td>1.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>50.0</td>\n",
" <td>1.020</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>18.0</td>\n",
" <td>0.8</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>11.3</td>\n",
" <td>6000.0</td>\n",
" <td>4.71</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>80.0</td>\n",
" <td>1.010</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>53.0</td>\n",
" <td>1.8</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>9.6</td>\n",
" <td>7500.0</td>\n",
" <td>4.71</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>70.0</td>\n",
" <td>1.005</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>56.0</td>\n",
" <td>3.8</td>\n",
" <td>111.00</td>\n",
" <td>2.50</td>\n",
" <td>11.2</td>\n",
" <td>6700.0</td>\n",
" <td>3.90</td>\n",
" <td>1.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>80.0</td>\n",
" <td>1.010</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>26.0</td>\n",
" <td>1.4</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>11.6</td>\n",
" <td>7300.0</td>\n",
" <td>4.60</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Bp Sg Al Su Rbc Bu Sc Sod Pot Hemo Wbcc Rbcc \\\n",
"0 80.0 1.020 1.0 0.0 1.0 36.0 1.2 137.53 4.63 15.4 7800.0 5.20 \n",
"1 50.0 1.020 4.0 0.0 1.0 18.0 0.8 137.53 4.63 11.3 6000.0 4.71 \n",
"2 80.0 1.010 2.0 3.0 1.0 53.0 1.8 137.53 4.63 9.6 7500.0 4.71 \n",
"3 70.0 1.005 4.0 0.0 1.0 56.0 3.8 111.00 2.50 11.2 6700.0 3.90 \n",
"4 80.0 1.010 2.0 0.0 1.0 26.0 1.4 137.53 4.63 11.6 7300.0 4.60 \n",
"\n",
" Htn Class \n",
"0 1.0 1 \n",
"1 0.0 1 \n",
"2 0.0 1 \n",
"3 1.0 1 \n",
"4 0.0 1 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(data.columns)\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7c8d2381",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(400, 14)\n",
" Bp Sg Al Su Rbc Bu \\\n",
"count 400.000000 400.000000 400.000000 400.000000 400.000000 400.00000 \n",
"mean 76.455000 1.017712 1.015000 0.395000 0.882500 57.40550 \n",
"std 13.476536 0.005434 1.272329 1.040038 0.322418 49.28597 \n",
"min 50.000000 1.005000 0.000000 0.000000 0.000000 1.50000 \n",
"25% 70.000000 1.015000 0.000000 0.000000 1.000000 27.00000 \n",
"50% 78.000000 1.020000 1.000000 0.000000 1.000000 44.00000 \n",
"75% 80.000000 1.020000 2.000000 0.000000 1.000000 61.75000 \n",
"max 180.000000 1.025000 5.000000 5.000000 1.000000 391.00000 \n",
"\n",
" Sc Sod Pot Hemo Wbcc \\\n",
"count 400.00000 400.000000 400.000000 400.000000 400.000000 \n",
"mean 3.07235 137.529025 4.627850 12.526900 8406.090000 \n",
"std 5.61749 9.204273 2.819783 2.716171 2523.219976 \n",
"min 0.40000 4.500000 2.500000 3.100000 2200.000000 \n",
"25% 0.90000 135.000000 4.000000 10.875000 6975.000000 \n",
"50% 1.40000 137.530000 4.630000 12.530000 8406.000000 \n",
"75% 3.07000 141.000000 4.800000 14.625000 9400.000000 \n",
"max 76.00000 163.000000 47.000000 17.800000 26400.000000 \n",
"\n",
" Rbcc Htn Class \n",
"count 400.000000 400.000000 400.000000 \n",
"mean 4.708275 0.369350 0.625000 \n",
"std 0.840315 0.482023 0.484729 \n",
"min 2.100000 0.000000 0.000000 \n",
"25% 4.500000 0.000000 0.000000 \n",
"50% 4.710000 0.000000 1.000000 \n",
"75% 5.100000 1.000000 1.000000 \n",
"max 8.000000 1.000000 1.000000 \n"
]
}
],
"source": [
"# Print the shape of the data\n",
"# data = data.sample(frac=0.1, random_state = 48)\n",
"print(data.shape)\n",
"print(data.describe())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e535ee6f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bp 0\n",
"Sg 0\n",
"Al 0\n",
"Su 0\n",
"Rbc 0\n",
"Bu 0\n",
"Sc 0\n",
"Sod 0\n",
"Pot 0\n",
"Hemo 0\n",
"Wbcc 0\n",
"Rbcc 0\n",
"Htn 0\n",
"Class 0\n",
"dtype: int64\n"
]
}
],
"source": [
"print(data.isnull().sum())\n",
"\n",
"# Check for null values in a specific column\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "d21cf5f8",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Bp</th>\n",
" <th>Sg</th>\n",
" <th>Al</th>\n",
" <th>Su</th>\n",
" <th>Rbc</th>\n",
" <th>Bu</th>\n",
" <th>Sc</th>\n",
" <th>Sod</th>\n",
" <th>Pot</th>\n",
" <th>Hemo</th>\n",
" <th>Wbcc</th>\n",
" <th>Rbcc</th>\n",
" <th>Htn</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>80.0</td>\n",
" <td>1.020</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>36.0</td>\n",
" <td>1.2</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>15.4</td>\n",
" <td>7800.0</td>\n",
" <td>5.20</td>\n",
" <td>1.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>50.0</td>\n",
" <td>1.020</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>18.0</td>\n",
" <td>0.8</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>11.3</td>\n",
" <td>6000.0</td>\n",
" <td>4.71</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>80.0</td>\n",
" <td>1.010</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>53.0</td>\n",
" <td>1.8</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>9.6</td>\n",
" <td>7500.0</td>\n",
" <td>4.71</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>70.0</td>\n",
" <td>1.005</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>56.0</td>\n",
" <td>3.8</td>\n",
" <td>111.00</td>\n",
" <td>2.50</td>\n",
" <td>11.2</td>\n",
" <td>6700.0</td>\n",
" <td>3.90</td>\n",
" <td>1.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>80.0</td>\n",
" <td>1.010</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>26.0</td>\n",
" <td>1.4</td>\n",
" <td>137.53</td>\n",
" <td>4.63</td>\n",
" <td>11.6</td>\n",
" <td>7300.0</td>\n",
" <td>4.60</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>395</th>\n",
" <td>80.0</td>\n",
" <td>1.020</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>49.0</td>\n",
" <td>0.5</td>\n",
" <td>150.00</td>\n",
" <td>4.90</td>\n",
" <td>15.7</td>\n",
" <td>6700.0</td>\n",
" <td>4.90</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>396</th>\n",
" <td>70.0</td>\n",
" <td>1.025</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>31.0</td>\n",
" <td>1.2</td>\n",
" <td>141.00</td>\n",
" <td>3.50</td>\n",
" <td>16.5</td>\n",
" <td>7800.0</td>\n",
" <td>6.20</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>397</th>\n",
" <td>80.0</td>\n",
" <td>1.020</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>26.0</td>\n",
" <td>0.6</td>\n",
" <td>137.00</td>\n",
" <td>4.40</td>\n",
" <td>15.8</td>\n",
" <td>6600.0</td>\n",
" <td>5.40</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>398</th>\n",
" <td>60.0</td>\n",
" <td>1.025</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>50.0</td>\n",
" <td>1.0</td>\n",
" <td>135.00</td>\n",
" <td>4.90</td>\n",
" <td>14.2</td>\n",
" <td>7200.0</td>\n",
" <td>5.90</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>399</th>\n",
" <td>80.0</td>\n",
" <td>1.025</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>18.0</td>\n",
" <td>1.1</td>\n",
" <td>141.00</td>\n",
" <td>3.50</td>\n",
" <td>15.8</td>\n",
" <td>6800.0</td>\n",
" <td>6.10</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>400 rows × 14 columns</p>\n",
"</div>"
],
"text/plain": [
" Bp Sg Al Su Rbc Bu Sc Sod Pot Hemo Wbcc Rbcc \\\n",
"0 80.0 1.020 1.0 0.0 1.0 36.0 1.2 137.53 4.63 15.4 7800.0 5.20 \n",
"1 50.0 1.020 4.0 0.0 1.0 18.0 0.8 137.53 4.63 11.3 6000.0 4.71 \n",
"2 80.0 1.010 2.0 3.0 1.0 53.0 1.8 137.53 4.63 9.6 7500.0 4.71 \n",
"3 70.0 1.005 4.0 0.0 1.0 56.0 3.8 111.00 2.50 11.2 6700.0 3.90 \n",
"4 80.0 1.010 2.0 0.0 1.0 26.0 1.4 137.53 4.63 11.6 7300.0 4.60 \n",
".. ... ... ... ... ... ... ... ... ... ... ... ... \n",
"395 80.0 1.020 0.0 0.0 1.0 49.0 0.5 150.00 4.90 15.7 6700.0 4.90 \n",
"396 70.0 1.025 0.0 0.0 1.0 31.0 1.2 141.00 3.50 16.5 7800.0 6.20 \n",
"397 80.0 1.020 0.0 0.0 1.0 26.0 0.6 137.00 4.40 15.8 6600.0 5.40 \n",
"398 60.0 1.025 0.0 0.0 1.0 50.0 1.0 135.00 4.90 14.2 7200.0 5.90 \n",
"399 80.0 1.025 0.0 0.0 1.0 18.0 1.1 141.00 3.50 15.8 6800.0 6.10 \n",
"\n",
" Htn Class \n",
"0 1.0 1 \n",
"1 0.0 1 \n",
"2 0.0 1 \n",
"3 1.0 1 \n",
"4 0.0 1 \n",
".. ... ... \n",
"395 0.0 0 \n",
"396 0.0 0 \n",
"397 0.0 0 \n",
"398 0.0 0 \n",
"399 0.0 0 \n",
"\n",
"[400 rows x 14 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "markdown",
"id": "f0e0e01a",
"metadata": {},
"source": [
"### Checking the distribution of target variable\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "dd942b3b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Outlier percentile: 100.0\n",
"Having disease: 250\n",
"Not having disease: 150\n"
]
}
],
"source": [
"# Determine number of fraud cases in dataset\n",
"\n",
"have = data[data['Class'] == 1]\n",
"not_have = data[data['Class'] == 0]\n",
"\n",
"outlier_fraction = 1.6666666666666667\n",
"outlier_fraction = outlier_fraction / np.max(outlier_fraction) * 100\n",
"print(\"Outlier percentile:\", outlier_fraction)\n",
"\n",
"print('Having disease: {}'.format(len(data[data['Class'] == 1])))\n",
"print('Not having disease: {}'.format(len(data[data['Class'] == 0])))"
]
},
{
"cell_type": "markdown",
"id": "4a85a5bb",
"metadata": {},
"source": [
"### Visualizing the dataset"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "cf5c2e23",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x648 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Correlation matrix\n",
"corrmat = data.corr()\n",
"fig = plt.figure(figsize = (12, 9))\n",
"\n",
"sns.heatmap(corrmat, vmax = .8, square = True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "38ffa726",
"metadata": {},
"source": [
"### Splitting the features and target"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "ad95615d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(400, 11)\n",
"(400,)\n"
]
}
],
"source": [
"#seperating the X and the Y from the dataset\n",
"X=data.drop(['Class','Al','Su'], axis=1)\n",
"Y=data[\"Class\"]\n",
"print(X.shape)\n",
"print(Y.shape)\n",
"#getting just the values for the sake of processing (its a numpy array with no columns)\n",
"X_data=X.values\n",
"Y_data=Y.values"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "987d85cc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[8.000e+01, 1.020e+00, 1.000e+00, ..., 7.800e+03, 5.200e+00,\n",
" 1.000e+00],\n",
" [5.000e+01, 1.020e+00, 1.000e+00, ..., 6.000e+03, 4.710e+00,\n",
" 0.000e+00],\n",
" [8.000e+01, 1.010e+00, 1.000e+00, ..., 7.500e+03, 4.710e+00,\n",
" 0.000e+00],\n",
" ...,\n",
" [8.000e+01, 1.020e+00, 1.000e+00, ..., 6.600e+03, 5.400e+00,\n",
" 0.000e+00],\n",
" [6.000e+01, 1.025e+00, 1.000e+00, ..., 7.200e+03, 5.900e+00,\n",
" 0.000e+00],\n",
" [8.000e+01, 1.025e+00, 1.000e+00, ..., 6.800e+03, 6.100e+00,\n",
" 0.000e+00]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_data"
]
},
{
"cell_type": "markdown",
"id": "ef0afcab",
"metadata": {},
"source": [
"### Splittng data into train and test"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5c0ce1f4",
"metadata": {},
"outputs": [],
"source": [
"# Using Skicit-learn to split data into training and testing sets\n",
"from sklearn.model_selection import train_test_split\n",
"# Split the data into training and testing sets\n",
"X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size = 0.2, random_state = 42)"
]
},
{
"cell_type": "markdown",
"id": "26033386",
"metadata": {},
"source": [
"### Model training - Random Forest"
]
},
{
"cell_type": "markdown",
"id": "d98c855a",
"metadata": {},
"source": [
"#### ISOLATION FOREST"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "b41d16ee",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import classification_report, accuracy_score,precision_score,recall_score,f1_score,matthews_corrcoef\n",
"from sklearn.metrics import confusion_matrix"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "53a3cd66",
"metadata": {},
"outputs": [],
"source": [
"#Building another model/classifier ISOLATION FOREST\n",
"from sklearn.ensemble import IsolationForest\n",
"ifc=IsolationForest(max_samples=len(X_train),\n",
" contamination=outlier_fraction/100,random_state=1)\n",
"ifc.fit(X_train)\n",
"scores_pred = ifc.decision_function(X_train)\n",
"y_pred = ifc.predict(X_test)\n",
"\n",
"\n",
"# Reshape the prediction values to 0 for valid, 1 for fraud. \n",
"y_pred[y_pred == 1] = 0\n",
"y_pred[y_pred == -1] = 1\n",
"\n",
"n_errors = (y_pred != Y_test).sum()"
]
},
{
"cell_type": "markdown",
"id": "e8dd7a8f",
"metadata": {},
"source": [
"### Model eveuation"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "60c5a8a9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"the Model used is Isolation Forest\n",
"The accuracy is 0.65\n",
"The precision is 0.65\n",
"The recall is 1.0\n",
"The F1-Score is 0.787878787878788\n",
"The Matthews correlation coefficient is0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Mishane\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:873: RuntimeWarning: invalid value encountered in scalar divide\n",
" mcc = cov_ytyp / np.sqrt(cov_ytyt * cov_ypyp)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x864 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Isolation Forest: 28\n",
"0.65\n",
" precision recall f1-score support\n",
"\n",
" 0 0.00 0.00 0.00 28\n",
" 1 0.65 1.00 0.79 52\n",
"\n",
" accuracy 0.65 80\n",
" macro avg 0.33 0.50 0.39 80\n",
"weighted avg 0.42 0.65 0.51 80\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Mishane\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1248: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n",
"C:\\Users\\Mishane\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1248: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n",
"C:\\Users\\Mishane\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1248: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 648x504 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#evaluation of the model\n",
"#printing every score of the classifier\n",
"#scoring in any thing\n",
"\n",
"from sklearn.metrics import confusion_matrix\n",
"n_outliers = len(have)\n",
"print(\"the Model used is {}\".format(\"Isolation Forest\"))\n",
"acc= accuracy_score(Y_test,y_pred)\n",
"print(\"The accuracy is {}\".format(acc))\n",
"prec= precision_score(Y_test,y_pred)\n",
"print(\"The precision is {}\".format(prec))\n",
"rec= recall_score(Y_test,y_pred)\n",
"print(\"The recall is {}\".format(rec))\n",
"f1= f1_score(Y_test,y_pred)\n",
"print(\"The F1-Score is {}\".format(f1))\n",
"MCC=matthews_corrcoef(Y_test,y_pred)\n",
"print(\"The Matthews correlation coefficient is{}\".format(MCC))\n",
"\n",
"#printing the confusion matrix\n",
"LABELS = ['No CKD', 'CKD']\n",
"conf_matrix = confusion_matrix(Y_test, y_pred)\n",
"plt.figure(figsize=(12, 12))\n",
"sns.heatmap(conf_matrix, xticklabels=LABELS,\n",
" yticklabels=LABELS, annot=True, fmt=\"d\");\n",
"plt.title(\"Confusion matrix\")\n",
"plt.ylabel('True class')\n",
"plt.xlabel('Predicted class')\n",
"plt.show()\n",
"\n",
"# Run classification metrics\n",
"plt.figure(figsize=(9, 7))\n",
"print('{}: {}'.format(\"Isolation Forest\", n_errors))\n",
"print(accuracy_score(Y_test, y_pred))\n",
"print(classification_report(Y_test, y_pred))"
]
},
{
"cell_type": "markdown",
"id": "5d548aa6",
"metadata": {},
"source": [
"#### Random Forest Classifier"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "c41d3b76",
"metadata": {},
"outputs": [],
"source": [
"# Building the Random Forest Classifier (RANDOM FOREST)\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"# random forest model creation\n",
"rfc = RandomForestClassifier()\n",
"rfc.fit(X_train,Y_train)\n",
"# predictions\n",
"y_pred = rfc.predict(X_test)"
]
},
{
"cell_type": "markdown",
"id": "5821ec3c",
"metadata": {},
"source": [
"### Model eveuation"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "6284b00a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The model used is Random Forest classifier\n",
"The accuracy is 0.9875\n",
"The precision is 1.0\n",
"The recall is 0.9807692307692307\n",
"The F1-Score is 0.9902912621359222\n",
"The Matthews correlation coefficient is 0.9731133552274452\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x864 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Random Forest: 1\n",
"0.9875\n",
" precision recall f1-score support\n",
"\n",
" 0 0.97 1.00 0.98 28\n",
" 1 1.00 0.98 0.99 52\n",
"\n",
" accuracy 0.99 80\n",
" macro avg 0.98 0.99 0.99 80\n",
"weighted avg 0.99 0.99 0.99 80\n",
"\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 648x504 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Evaluating the classifier\n",
"#printing every score of the classifier\n",
"#scoring in any thing\n",
"from sklearn.metrics import classification_report, accuracy_score,precision_score,recall_score,f1_score,matthews_corrcoef\n",
"from sklearn.metrics import confusion_matrix\n",
"n_outliers = len(have)\n",
"n_errors = (y_pred != Y_test).sum()\n",
"print(\"The model used is Random Forest classifier\")\n",
"acc= accuracy_score(Y_test,y_pred)\n",
"print(\"The accuracy is {}\".format(acc))\n",
"prec= precision_score(Y_test,y_pred)\n",
"print(\"The precision is {}\".format(prec))\n",
"rec= recall_score(Y_test,y_pred)\n",
"print(\"The recall is {}\".format(rec))\n",
"f1= f1_score(Y_test,y_pred)\n",
"print(\"The F1-Score is {}\".format(f1))\n",
"MCC=matthews_corrcoef(Y_test,y_pred)\n",
"print(\"The Matthews correlation coefficient is {}\".format(MCC))\n",
"\n",
"\n",
"#printing the confusion matrix\n",
"LABELS = ['No CKD', 'CKD']\n",
"conf_matrix = confusion_matrix(Y_test, y_pred)\n",
"plt.figure(figsize=(12, 12))\n",
"sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt=\"d\");\n",
"plt.title(\"Confusion matrix\")\n",
"plt.ylabel('True class')\n",
"plt.xlabel('Predicted class')\n",
"plt.show()\n",
"\n",
"# Run classification metrics\n",
"plt.figure(figsize=(9, 7))\n",
"print('{}: {}'.format(\"Random Forest\", n_errors))\n",
"print(accuracy_score(Y_test, y_pred))\n",
"print(classification_report(Y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "70d77af8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Random forest model accuracy: 0.9875\n"
]
}
],
"source": [
"# calculate and print the accuracy of the model on the test set\n",
"accuracy = rfc.score(X_test, Y_test)\n",
"print(\"Random forest model accuracy:\", accuracy)"
]
},
{
"cell_type": "markdown",
"id": "5df8ea16",
"metadata": {},
"source": [
"### Saving the model"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "02faf4e6",
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"filename = 'finalized_model_kidney_prediction_RF.sav'\n",
"pickle.dump(rfc, open(filename, 'wb'))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "896159c4",
"metadata": {},
"outputs": [],
"source": [
"with open('finalized_model_kidney_prediction_RF.sav', 'rb') as f:\n",
" model = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "03d78684",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0]\n"
]
}
],
"source": [
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"#input_data1 = (70,1.02,0,0,1,44,1.2,145,5,14.8,8406,4.71,0) #0\n",
"input_data2 = (80, 1.02, 1, 36, 1.2, 137.53, 4.63, 15.4, 7800, 5.2, 1) #1\n",
"\n",
"#change input data to numpy array\n",
"input_data_as_numpy_array = np.asarray(input_data2)\n",
"\n",
"#reshape the numpy array as we are predicting for only on instance\n",
"\n",
"input_data_reshaped = input_data_as_numpy_array.reshape(1,-1)\n",
"\n",
"prediction = model.predict(input_data_reshaped)\n",
"print(prediction)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "41a76901",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"vscode": {
"interpreter": {
"hash": "d9a6414fa631c028c434667d182c0b79dc634ffcd06f52fc304061a2c0b9ef26"
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment