Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
2
22_23-J 52
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
22_23-J 52
22_23-J 52
Commits
77fd5675
Commit
77fd5675
authored
May 15, 2023
by
Kithmini Nimasha Ketangoda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Model/kidney_prediction_RF
parent
34477f16
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1128 additions
and
0 deletions
+1128
-0
kidney_prediction_RF_model.ipynb
kidney_prediction_RF_model.ipynb
+1128
-0
No files found.
kidney_prediction_RF_model.ipynb
0 → 100644
View file @
77fd5675
{
"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('C://Users//Mishane//Downloads//new_model.csv')"
]
},
{
"cell_type": "markdown",
"id": "5da5cf75",
"metadata": {},
"source": [
"### Explore the dataset"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(data.columns)\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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": 7,
"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": 8,
"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": 8,
"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": 37,
"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": 10,
"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": 11,
"id": "ad95615d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(400, 13)\n",
"(400,)\n"
]
}
],
"source": [
"#seperating the X and the Y from the dataset\n",
"X=data.drop(['Class'], 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": 12,
"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, 4.000e+00, ..., 6.000e+03, 4.710e+00,\n",
" 0.000e+00],\n",
" [8.000e+01, 1.010e+00, 2.000e+00, ..., 7.500e+03, 4.710e+00,\n",
" 0.000e+00],\n",
" ...,\n",
" [8.000e+01, 1.020e+00, 0.000e+00, ..., 6.600e+03, 5.400e+00,\n",
" 0.000e+00],\n",
" [6.000e+01, 1.025e+00, 0.000e+00, ..., 7.200e+03, 5.900e+00,\n",
" 0.000e+00],\n",
" [8.000e+01, 1.025e+00, 0.000e+00, ..., 6.800e+03, 6.100e+00,\n",
" 0.000e+00]])"
]
},
"execution_count": 12,
"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": 28,
"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": 29,
"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": 39,
"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": 47,
"id": "60c5a8a9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"the Model used is Isolation Forest\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 is0.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": [
"Isolation 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": [
"#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(Stroke)\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": 41,
"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": 46,
"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(Stroke)\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": "markdown",
"id": "5df8ea16",
"metadata": {},
"source": [
"### Saving the model"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "02faf4e6",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'rfc' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-3-eff0c19026d6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpickle\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mfilename\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'finalized_model_kidney_prediction_RF.sav'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mpickle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrfc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'wb'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'rfc' is not defined"
]
}
],
"source": [
"import pickle\n",
"filename = 'finalized_model_kidney_prediction_RF.sav'\n",
"pickle.dump(rfc, open(filename, 'wb'))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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": 8,
"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, 0, 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
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment