{
"cells": [
{
"cell_type": "markdown",
"id": "c6d265a8",
"metadata": {},
"source": [
"# ***Heart Disease Prediction Using Machine Learning***\n",
"\n",
"***Using Python's Data Science and Machine Learning Libraries, building a machine learning model capable to classify whether or not a person is having a heart disease based upon his/her medical attributes.***\n",
"\n",
"***Our approach will be :*** \n",
" * ***1. Defining the problem***\n",
" * ***2. Data***\n",
" * ***3. Evaluation***\n",
" * ***4. Features***\n",
" * ***5. Modelling***\n",
" * ***6. Experimentation***"
]
},
{
"cell_type": "markdown",
"id": "ba0b70fc",
"metadata": {},
"source": [
"## ***What is classification?***\n",
"\n",
"Classification involves deciding whether a sample is part of one class or another (**single-class classification**). If there are multiple class options, it's referred to as **multi-class classification**.\n",
"\n",
"\n",
"## ***What we'll end up with***\n",
"\n",
"Since we already have a dataset, we'll approach the problem with the following machine learning modelling framework.\n",
"\n",
"| | \n",
"|:--:| \n",
"| 6 Step Machine Learning Modelling Framework |\n",
"\n",
"***More specifically, we'll look at the following topics.***\n",
"\n",
"* **Exploratory data analysis (EDA)** - the process of going through a dataset and finding out more about it.\n",
"* **Model training** - create model(s) to learn to predict a target variable based on other variables.\n",
"* **Model evaluation** - evaluating a models predictions using problem-specific evaluation metrics. \n",
"* **Model comparison** - comparing several different models to find the best one.\n",
"* **Model fine-tuning** - once we've found a good model, how can we improve it?\n",
"* **Feature importance** - since we're predicting the presence of heart disease, are there some things which are more important for prediction?\n",
"* **Cross-validation** - if we do build a good model, can we be sure it will work on unseen data?\n",
"* **Reporting what we've found** - if we had to present our work, what would we show someone?\n",
"\n",
"To work through these topics, we'll use pandas, Matplotlib and NumPy for data anaylsis, as well as, Scikit-Learn for machine learning and modelling tasks.\n",
"\n",
"| | \n",
"|:--:| \n",
"| Tools which can be used for each step of the machine learning modelling process. |\n",
"\n",
"We'll work through each step and by the end of the notebook, we'll have a handful of models, all which can predict whether or not a person has heart disease based on a number of different parameters at a considerable accuracy. \n",
"\n",
"We'll also be able to describe which parameters are more indicative than others, for example, sex may be more important than age."
]
},
{
"cell_type": "markdown",
"id": "3442b9ce",
"metadata": {},
"source": [
"### ***1. Defining the problem 🤔***\n",
"\n",
"***Problem Statement : Using given medical attributes about a patient, predicting whether or not a person have heart disease.***"
]
},
{
"cell_type": "markdown",
"id": "641c8df5",
"metadata": {},
"source": [
"### ***2. Data***\n",
"\n",
"***Originally the data is take from Clevland Data from the UCI Machine Learning Repository.***\n",
"***https://archive.ics.uci.edu/ml/datasets/Heart+Disease***\n",
"\n",
"***It is also available on Kaggle.***\n",
"***https://www.kaggle.com/ronitf/heart-disease-uci***\n"
]
},
{
"cell_type": "markdown",
"id": "5d8666cb",
"metadata": {},
"source": [
"### ***3. Evaluation***\n",
"\n",
"***We'll carry out this project only if 95% accuracy is achievable in classifying whether or not a person has heart disease.***"
]
},
{
"cell_type": "markdown",
"id": "f69fc96f",
"metadata": {},
"source": [
"### ***4. Features***\n",
"\n",
"***Data Atrributes (Information about each section of data)***\n",
"\n",
"***1. age - age in years***\n",
"\n",
"***2. sex - (1 = male; 0 = female)***\n",
"\n",
"***3. cp - chest pain type***\n",
" * ***0: Typical angina: chest pain related decrease blood supply to the heart***\n",
" * ***1: Atypical angina: chest pain not related to heart***\n",
" * ***2: Non-anginal pain: typically esophageal spasms (non heart related)***\n",
" * ***3: Asymptomatic: chest pain not showing signs of disease***\n",
" \n",
"***4. trestbps - resting blood pressure (in mm Hg on admission to the hospital)***\n",
" * ***anything above 130-140 is typically cause for concern***\n",
" \n",
"***5. chol - serum cholestoral in mg/dl*** \n",
" * ***serum = LDL + HDL + .2 * triglycerides***\n",
" * ***above 200 is cause for concern***\n",
" \n",
"***6. fbs - (fasting blood sugar > 120 mg/dl) (1 = true; 0 = false)*** \n",
" * ***'>126' mg/dL signals diabetes***\n",
" \n",
"***7. restecg - resting electrocardiographic results***\n",
" * ***0: Nothing to note***\n",
" * ***1: ST-T Wave abnormality***\n",
" * ***can range from mild symptoms to severe problems***\n",
" * ***signals non-normal heart beat***\n",
" * ***2: Possible or definite left ventricular hypertrophy***\n",
" * ***Enlarged heart's main pumping chamber***\n",
" \n",
"***8. thalach - maximum heart rate achieved*** \n",
"\n",
"***9. exang - exercise induced angina (1 = yes; 0 = no)*** \n",
"\n",
"***10. oldpeak - ST depression induced by exercise relative to rest*** \n",
" * ***looks at stress of heart during excercise***\n",
" * ***unhealthy heart will stress more***\n",
" \n",
"***11. slope - the slope of the peak exercise ST segment***\n",
" * ***0: Upsloping: better heart rate with excercise (uncommon)***\n",
" * ***1: Flatsloping: minimal change (typical healthy heart)***\n",
" * ***2: Downslopins: signs of unhealthy heart***\n",
" \n",
"***12. ca - number of major vessels (0-3) colored by flourosopy***\n",
" * ***colored vessel means the doctor can see the blood passing through***\n",
" * ***the more blood movement the better (no clots)***\n",
" \n",
"***13. thal - thalium stress result***\n",
" * ***1,3: normal***\n",
" * ***6: fixed defect: used to be defect but ok now***\n",
" * ***7: reversable defect: no proper blood movement when excercising***\n",
" \n",
"***14. target - have disease or not (1=yes, 0=no) (= the predicted attribute)***\n",
"\n",
"### ***Getting the tools ready😎*** \n",
"\n",
"***We'll be working with Pandas, Matplotlib and NumPy for data analysis and manipulation.*** "
]
},
{
"cell_type": "markdown",
"id": "7510550b",
"metadata": {},
"source": [
"### ***Preparing the tools***\n",
"\n",
"***At the start of any project, it's custom to see the required libraries imported in a big chunk like you can see below.***\n",
"\n",
"***However, in practice, your projects may import libraries as you go. After you've spent a couple of hours working on your problem, you'll probably want to do some tidying up. This is where you may want to consolidate every library you've used at the top of your notebook (like the cell below).***\n",
"\n",
"***The libraries you use will differ from project to project. But there are a few which will you'll likely take advantage of during almost every structured data project.*** \n",
"\n",
"* ***[pandas](https://pandas.pydata.org/) for data analysis.***\n",
"* ***[NumPy](https://numpy.org/) for numerical operations.***\n",
"* ***[Matplotlib](https://matplotlib.org/)/[seaborn](https://seaborn.pydata.org/) for plotting or data visualization.***\n",
"* ***[Scikit-Learn](https://scikit-learn.org/stable/) for machine learning modelling and evaluation.***"
]
},
{
"cell_type": "code",
"execution_count": 196,
"id": "26c2fc47",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"execution_count": 196,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# For setting theme💖\n",
"from jupyterthemes import get_themes\n",
"import jupyterthemes as jt\n",
"from jupyterthemes.stylefx import set_nb_theme\n",
"set_nb_theme('monokai')\n",
"# Themes : chesterish, grade3, gruvboxd, gruvboxl, manokai, oceans16, onedork, solarizedd, solarizedl"
]
},
{
"cell_type": "code",
"execution_count": 197,
"id": "a547a3bf",
"metadata": {},
"outputs": [],
"source": [
"# Importing required tools.\n",
"\n",
"# Regular EDA (exploratory data analysis) and plotting libraries.\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# to make plots appear inside the notebook.\n",
"%matplotlib inline \n",
"\n",
"# Getting models from Scikit-Learn \n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"\n",
"# For evaluating the model\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.metrics import confusion_matrix\n",
"from sklearn.metrics import classification_report\n",
"from sklearn.metrics import precision_score\n",
"from sklearn.metrics import recall_score\n",
"from sklearn.metrics import f1_score\n",
"from sklearn.metrics import plot_roc_curve"
]
},
{
"cell_type": "markdown",
"id": "c47fece2",
"metadata": {},
"source": [
"### ***Importing Data 💽***\n",
"\n",
"* ***There are many different kinds of ways to store data. The typical way of storing \"tabular data\", data similar to what you'd see in an Excel file is in `.csv` format. `.csv` stands for comma seperated values.***\n",
"\n",
"* ***Pandas has a built-in function to read `.csv` files called `read_csv()` which takes the file pathname of your `.csv` file. You'll likely use this a lot.***"
]
},
{
"cell_type": "code",
"execution_count": 198,
"id": "aed89693",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" age sex cp trestbps chol fbs \\\n",
"count 303.000000 303.000000 303.000000 303.000000 303.000000 303.000000 \n",
"mean 54.366337 0.683168 0.966997 131.623762 246.264026 0.148515 \n",
"std 9.082101 0.466011 1.032052 17.538143 51.830751 0.356198 \n",
"min 29.000000 0.000000 0.000000 94.000000 126.000000 0.000000 \n",
"25% 47.500000 0.000000 0.000000 120.000000 211.000000 0.000000 \n",
"50% 55.000000 1.000000 1.000000 130.000000 240.000000 0.000000 \n",
"75% 61.000000 1.000000 2.000000 140.000000 274.500000 0.000000 \n",
"max 77.000000 1.000000 3.000000 200.000000 564.000000 1.000000 \n",
"\n",
" restecg thalach exang oldpeak slope ca \\\n",
"count 303.000000 303.000000 303.000000 303.000000 303.000000 303.000000 \n",
"mean 0.528053 149.646865 0.326733 1.039604 1.399340 0.729373 \n",
"std 0.525860 22.905161 0.469794 1.161075 0.616226 1.022606 \n",
"min 0.000000 71.000000 0.000000 0.000000 0.000000 0.000000 \n",
"25% 0.000000 133.500000 0.000000 0.000000 1.000000 0.000000 \n",
"50% 1.000000 153.000000 0.000000 0.800000 1.000000 0.000000 \n",
"75% 1.000000 166.000000 1.000000 1.600000 2.000000 1.000000 \n",
"max 2.000000 202.000000 1.000000 6.200000 2.000000 4.000000 \n",
"\n",
" thal target \n",
"count 303.000000 303.000000 \n",
"mean 2.313531 0.544554 \n",
"std 0.612277 0.498835 \n",
"min 0.000000 0.000000 \n",
"25% 2.000000 0.000000 \n",
"50% 2.000000 1.000000 \n",
"75% 3.000000 1.000000 \n",
"max 3.000000 1.000000 "
]
},
"execution_count": 206,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "markdown",
"id": "dda51419",
"metadata": {},
"source": [
"### ***Heart Disease frequency according to Sex***\n",
"\n",
"* If you want to compare two columns to each other, you can use the function `pd.crosstab(column_1, column_2)`. \n",
"\n",
"* This is helpful if you want to start gaining an intuition about how your independent variables interact with your dependent variables.\n",
"\n",
"* Let's compare our target column with the sex column. \n",
"\n",
"* Remember from our data dictionary, for the target column, 1 = heart disease present, 0 = no heart disease. And for sex, 1 = male, 0 = female."
]
},
{
"cell_type": "code",
"execution_count": 207,
"id": "593a5bd2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1 207\n",
"0 96\n",
"Name: sex, dtype: int64"
]
},
"execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.sex.value_counts()"
]
},
{
"cell_type": "markdown",
"id": "0a3c6244",
"metadata": {},
"source": [
"#### *There are 207 males and 96 females in our study.*"
]
},
{
"cell_type": "code",
"execution_count": 208,
"id": "5cb9e69f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
sex
\n",
"
0
\n",
"
1
\n",
"
\n",
"
\n",
"
target
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
24
\n",
"
114
\n",
"
\n",
"
\n",
"
1
\n",
"
72
\n",
"
93
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"sex 0 1\n",
"target \n",
"0 24 114\n",
"1 72 93"
]
},
"execution_count": 208,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Compare target column with sex column\n",
"pd.crosstab(df.target,df.sex)"
]
},
{
"cell_type": "markdown",
"id": "6ee3e9e9",
"metadata": {},
"source": [
"### ***What can we infer from this?***\n",
"\n",
"***Let's make a simple heuristic.\n",
"Since there are about 100 women and 72 of them have a postive value of heart disease being present, we might infer, based on this one variable if the participant is a woman, there's a 75% chance she has heart disease.\n",
"As for males, there's about 200 total with around half indicating a presence of heart disease. So we might predict, if the participant is male, 50% of the time he will have heart disease.\n",
"Averaging these two values, we can assume, based on no other parameters, if there's a person, there's a 62.5% chance they have heart disease.***"
]
},
{
"cell_type": "code",
"execution_count": 209,
"id": "44a7851a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"303"
]
},
"execution_count": 209,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df)"
]
},
{
"cell_type": "markdown",
"id": "e8e30633",
"metadata": {},
"source": [
"### ***Creating a plot of crosstab***\n",
"\n",
"* You can plot the crosstab by using the `plot()` function and passing it a few parameters such as, `kind` (the type of plot you want), `figsize=(length, width)` (how big you want it to be) and `color=[colour_1, colour_2]` (the different colours you'd like to use).\n",
"\n",
"\n",
"* Different metrics are represented best with different kinds of plots. In our case, a bar graph is great. We'll see examples of more later. And with a bit of practice, you'll gain an intuition of which plot to use with different variables.\n",
"\n",
"\n",
"* We'll create the plot with `crosstab()` and `plot()`, then add some helpful labels to it with `plt.title()`, `plt.xlabel()` and more.\n",
"\n",
"\n",
"* To add the attributes, you call them on `plt` within the same cell as where you make create the graph."
]
},
{
"cell_type": "code",
"execution_count": 273,
"id": "619b573b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAncAAAGXCAYAAADRZnZ9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABMfklEQVR4nO3deVgV5f//8RcguAAquJH7UuCCKWlumSa5K6nhkiEm4r5kpmWa7ZpmLiVq7ppLuJRaLoSau5/UFM1Io1QSpNxFxQVB5veHP87XI2Cg4Dkcn4/r4rpi5p6Z95lzPLy673tm7AzDMAQAAACbYG/pAgAAAJB9CHcAAAA2hHAHAABgQwh3AAAANoRwBwAAYEMIdwAAADaEcAdks5CQEHl5eWnv3r3prj916pS8vLz0zjvvPOLK7khISNDFixfv22bVqlXy8vIy+6lWrZrq1aun4OBgbdu2Lc02qa/71KlTOVS5dfD19U1zbu7+adeunaVLtAlxcXEKDAzU008/rbp16/7nZ/Zh/P3333rnnXfUqFEjeXt7q0GDBurXr592796dY8cEclIeSxcA4NGJjIxU//79NXHiRNWtW/c/23fp0kW1atWSJN26dUtnz57V+vXr1bdvXw0bNkx9+vQxtW3WrJnKli0rd3f3HKvfWri5uWnkyJHpritcuPCjLcZGffbZZ9q/f78GDRqkYsWK5djn6ujRo3r11Vfl7u6uzp07q0SJEjp//rx++OEH9ezZU6NHj1ZgYGCOHBvIKYQ74DHy559/6uzZs5luX7NmzTQ9Ub169VLv3r01efJk1alTRzVr1pQkVa5cWZUrV87Ocq1WgQIF6KHLYVFRUapSpYoGDhyYo8f5/PPPVbBgQa1Zs0aurq6m5cHBwerSpYsmTpyotm3bys3NLUfrALITw7IAsiRv3rwaN26cHBwcNHfuXEuXAxuVlJQkZ2fnHD/OwYMHVaNGDbNgJ0lOTk7q2rWrbt26paNHj+Z4HUB2ItwBVuLYsWMaOHCgateurRo1auiVV17Rzp0707T78ccf1a1bN9WqVUve3t7y9fXVhAkTdOvWLVObwMBABQcHa8qUKfLx8VH9+vU1ePBg01Bi9+7d5evr+8C1lipVSj4+Ptq9e7du374tKf05d6GhofLz81ONGjVUt25dDRw4UH/99ZfZvhITEzVlyhT5+vrK29tbL774or788kuz1yNJJ0+e1IgRI0zzourUqaN+/fql2V94eLj8/f3l4+OjWrVqKSgoSAcOHDBrk5KSovnz56tly5by9vbW888/rzFjxighIeGBz8m99u7dKy8vL61evVp+fn6qXr266fxn9vg3btzQuHHj1LBhQ/n4+GjgwIE6evSovLy8tGrVKrPjpP5+7/HvXp6Z46Zut3v3bn300UeqX7++atSooddee01//PGH2TEMw9CiRYvUtm1bPf300/L19dXEiRN148YNpaSkqFGjRurYsWOac7N9+3Z5eXlp+/btGZ63uLg47du3T15eXgoJCZEk3b59W3PnzlWLFi3k7e2thg0b6oMPPjCbj3e/854eZ2dn7d27V9HR0WnW+fv76/fff1eDBg3Mlq9atUrt27dX9erVVa9ePb3zzjtmPeITJ06Ul5eXli5dalp269Yt+fn5qW7dulnqPQceBMOyQA65evVqupPAr1y5kmZZVFSUXn31VRUtWlR9+/aVo6Oj1q1bpz59+mjSpElq3bq1JGnlypUaPXq0fH19NXz4cCUlJWnTpk2aN2+eChQooEGDBpn2GRERoZMnT+qtt97SqVOn9NJLL8nNzU3Lly9Xv379VL169Yd6fU899ZR++eUXxcbGqnz58mnW//DDD/rwww/Vvn17BQYG6uLFi/r6668VGBioTZs2ydXVVbdv31bfvn0VERGhzp07q1KlSoqMjNTMmTN19OhRffXVV7Kzs9P58+fVuXNnubi4qFu3bnJzc9PRo0e1YsUKHT9+XOHh4bK3t9e+ffs0dOhQNWrUSJ06ddKNGze0ZMkSBQUFaf369SpTpowk6d1339WaNWvUoUMH9ejRQ8ePH1doaKgiIiIUGhqqvHnz3ve1p6SkpPveOjg4qFChQmbLPv74Y7Vr106dOnVSyZIlM318wzDUr18/7d27V506dZKnp6fWr19v9h5nVVZe9+jRo1W8eHENGDBAly9f1ty5c9W7d29t3bpVefLc+dPx0UcfKTQ0VE2aNFHXrl0VHR2t+fPn6++//9a0adPUunVrLViwQKdOnVLp0qVN+96wYYMKFy6cJjRJUqVKlTRhwgSNGzdObm5u6tevn7y8vCRJQ4cOVXh4uJo3b67u3bsrOjpaoaGh2rNnj1auXKmCBQve97ynx9/fXzNnzlTbtm31/PPPq1GjRqpXr54qVqwoBweHNO2nTZumkJAQtWjRQp07d9aZM2e0ZMkS7du3T99++63c3d01ePBg/fTTT/riiy/UokULFS1aVNOnT9eff/6pKVOmqHjx4ll/84CsMABkq6lTpxqenp7/+TNixAjTNt26dTOaNm1qXLt2zbQsKSnJePXVV40GDRoYiYmJhmEYRsuWLY0uXboYKSkpZu0aNWpktG3b1mx/np6exp49e8xq++6779Jdfq/Udt99912GbSZPnmx4enoaBw8eNHvdsbGxhmEYRq9evYw2bdqYbbNt2zajdevWxv79+82Os2PHDrN2y5YtMzw9PY1NmzYZhmEYs2bNMjw9PY1jx46ZtZs4caLh6elpREZGGoZhGB988IHh4+Njdn7++OMPo3nz5kZYWJhhGIaxZ88ew9PT0wgNDTXb186dOw1PT09j4cKF9z03TZo0yfA9bdKkiald6nG6detmtn1mj//TTz8Znp6eRkhIiKnNrVu3jM6dO5u9N6n7u/e9und5Zo+b2s7f399ITk42tUt9D3bt2mUYhmH89ddfhpeXlzF69Giz/aV+Lv766y8jMjLS8PT0NGbPnm1an5iYaNSqVct4//33//M8333utm/fbnh6ehpjxowxa7dhwwbD09PTmDBhgln99573jCQlJRmffPKJUblyZbP30tfX15gxY4bp355hGEZMTIxRuXJlY+LEiWb7iIqKMqpVq2aMHTvWtCwiIsKoXLmy8dZbbxmRkZFG1apVjaFDh2aqJuBh0XMH5JARI0ake4HB+fPn9dZbb5l+v3Tpkvbt26fAwEDdvHlTN2/eNK1r1qyZxo0bp99++021atXSDz/8oBs3bsjOzs7U5sKFCypYsKCuX79udpx8+fLp2WefzYFXdkdycrIkmdVyNw8PD+3evVvTpk1T+/btVbp0aTVu3FiNGzc2tdm4caPc3d1VrVo1s56wxo0by8HBQdu2bVPTpk3Vp08f+fv7q0iRIqY2N2/elL39nZklqa/dw8ND165d05gxY/Tqq6+qUqVK8vLyUnh4uNkx7ezs1LhxY7NjVq1aVcWKFdO2bdv02muv3fe1Fy1aVJ9//nma5en1+DVs2NDs98weP/V2M3dfqeno6KigoCANGTLkvvWlJ6uvu3nz5mY9V1WqVJEknTt3TpK0bds2GYaR5krS4OBgtW7dWmXLlpWTk5MqVqyosLAw9e7d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zJijmTOnKSRkiq5fv66SJUtp6NC35O/f5VG9tGxhZxiGYamDJycna/ny5Zo0aZIcHR0VHx+v7du3m8bOe/TooevXr2vFihWmbT7//HOtWLFCu3fvlpOTk959913t3r1bGzdulJOTkyTpm2++0ZgxY7R161aVKFEi0/VcuJCglBSLnQ7kIsWKuVr8Tu/WptK5nTp37qqlywAea6dPn5SHR7l01+X2x489bu73Xtrb26lIEZcMt7Voz92BAwc0ceJEBQcHq0SJEho9erRpXWJiovbv36833njDbJsWLVpo7ty5ioiIUL169bR79241adLEFOwkqWXLlvroo49MQ7oAADzuLl1LeuBHfyF3seicu0qVKmnz5s0aNGiQHBwczNbFxsYqKSlJFSpUMFtertydFBsdHa0bN27o33//TdPG3d1dLi4uio6OztkXAAAAYGUs2nOX3jh5qqtX7wzvuLiYdzs6OztLkhISEjJsk9ouISEhu0oFAADIFazmatl7pU4FzOjqFHt7+/u2MQxD9vZW+/IAAAByhNWmH1dXV0lK0/uW+rurq6upxy69Hrrr16+b9gEAAPC4sNpwV7ZsWTk4OCgmJsZseervFSpUkLOzs0qUKKGTJ0+atblw4YISEhLSzMUDAACwdVYb7vLmzavatWtr48aNuvtuLeHh4XJ1dZW3t7ck6bnnntPWrVt169YtszYODg6qU6fOI68bAABLsuAdzpBNHvY9tNpwJ0n9+/dXRESEhg4dqu3bt+uLL77QvHnz1LdvX+XPn1+S1KtXL507d059+vTR1q1btWDBAo0bN06dO3dWyZIlLfwKAAB4dBwcHJWUlGjpMvCQkpJuycHhwa95tepwV79+fYWEhOj48eMaOHCg1q5dq7ffflu9e/c2talUqZLmz5+v69ev6/XXX9eCBQsUFBSkd99914KVAwDw6Lm4FFJ8/Hldu3ZVt28n04uXyxiGoVu3EhUff04uLoUfeD8WfUKFteEJFcgsnlCRFk+oAKxDUtItJSTEKynpllJSblu6HGSRg0MeubgUVv78zhm2seonVAAAgOzl6OgkN7fili4DFmTVw7IAAADIGsIdAACADSHcAQAA2BDCHQAAgA0h3AEAANgQwh0AAIANIdwBAADYEMIdAACADSHcAQAA2BDCHQAAgA0h3AEAANgQni0LAICVcHN2VJ4C+Sxd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qVMns7ajR49W9+7dFR4erh07dig8PFzr1q1Tly5d9PHHH5uO+cknn6h06dLpHq9QoUJZPh8PolixYv/5uXjyyScf6hhHjx6VnZ1dhnM6XVxctGTJEh06dEibN2/Wjh07tHjxYi1dulQTJkyQn5+fUlJS5OzsrGnTpqW7j7x580q6cx/GLl266Pr162rYsKFat26tKlWqyDAMDRw40NQ+Oz8bQG5BuAOsUMGCBVW6dGn9/vvvadYdOXJE3t7e992+QYMG2V5T3759tW7dOk2fPl3Vq1c3W1eqVCkdOnRISUlJZkHu1q1bOnXqlKmH5EGkpKRo48aN8vDwSPfqYelOr9Q///yj2rVry8vLS4MGDdLp06f12muvad68eerTp49KlSolSXriiSdUpUoVs+1TJ99L0qJFi3T8+HEtXLjQrAc0IiLCbJvz58/rr7/+Uv369dW7d2/17t1bly5d0sCBA7VixQq99dZbpmO6u7uneU/27t2rlJSUHL8Zdaq8efPmyOciVUJCgnbt2iUfH58Me1ijo6N19epV1axZUzVr1tTw4cN17NgxBQQEaMGCBfLz81OpUqW0a9cueXt7q2DBgmbbh4eHq3DhwpLuXABx4cIFhYWFqXz58qY2a9euNdsmOz8bQG7BnDvASjVv3lw///yzaW6SJP3vf/9TdHS06Saxj1LevHn1/vvv6/r162keJ+Xr66uEhAQtXbrUbPk333yja9euZTjElhkzZsxQXFycgoODM5zLNXPmTPXo0cN0lbF0Z65ViRIlTHMTmzRpIkmaNWuWWU/j0aNH1b9/f3399deS/m9o8e5eLMMwtGTJEkkyzZFbtWqVevTood9++83Uzs3NTeXKlZOdnZ3s7e3VoEED5c2bV3PnzjWbN3jmzBkNGDBAEydOzPJVr9bIMAx9+umnun79unr16pVhuzFjxmjAgAGmeYuSVLFiRRUsWND0Pvn6+kq604t2ty1btuj11183hbf4+Hjlz5/f1Mst3fmfidQbO6c+si47PxtAbkHPHWClevfure+//149evRQz549lZiYqLlz56patWoWezpD6vDXhg0bzJZ36tRJq1ev1vjx4/Xnn3/K29tbkZGRWrVqlWrUqJFmODM9sbGxpueTGoahixcvateuXdq9e7eaNWumbt26Zbht6rNNAwIC1KVLFxUqVEh79uzR3r179frrr0uSPD09FRgYqMWLFys+Pl5NmzZVfHy8lixZImdnZw0ZMkSS1KhRIy1evFh9+/ZVx44dlZSUpLCwMEVGRsre3t4UTNq3b68FCxaoX79+6tq1q0qUKKHIyEjTLTycnZ3l7OysN998U+PGjVOXLl300ksvKTk5Wd98840SExM1YsQI02v4448/FBUVpeeeey7d24hYi6ioKNP7dPv2bZ0/f16bN2/Wr7/+qu7du993Xl9QUJB69+6tgIAAtW/fXnnz5tXmzZsVExOjzz77TJLUuHFjvfjii5o/f75OnTqlBg0aKC4uTkuXLlXJkiUVHBws6c77tGXLFvXt21ctW7bU1atXtWbNGtP8udT3KTs/G0BuYWfcb7IMAIs6ceKExo0bp/379ytfvnxq3Lix3n777Ry959apU6f04osvZnjRxdmzZ9WqVSslJCQoKirKtDwhIUHTp09XWFiYzp8/Lw8PD7Vp00b9+/e/7zym1OPdzcHBQcWKFVOZMmXUtm1bderUyfRcWenOkGb37t3NLgCIiIjQ9OnTdeTIESUkJKh8+fLq0qWLAgICTL1jhmEoNDRUy5YtU3R0tFxdXfXMM89oyJAhZo9YW7lypebPn6+4uDgVKlRI1apV0+DBg/Xee+8pKSnJ1Hv0119/aerUqTp48KDi4+NVqlQpvfTSS+rdu7fZcGtYWJgWLFigqKgo5cuXT9WqVdPAgQNVq1YtU5uQkBBNmzZNixYtUt26dTP1Xkl3rjbt0KGDxo8fn+ltHkTqOb+bo6OjihcvrgoVKsjf3z9Nj/KqVas0cuRIs9e0bds2zZo1S8ePH1diYqKeeuopBQUFqU2bNqbtkpKSNHfuXK1Zs0ZxcXFyd3dX/fr1NWTIEFNPnWEYmj17tlauXKkzZ86oaNGiqlmzpoYMGaJXXnlFNWvW1MyZMyVl72cDyA0IdwBgJQYMGKDevXvLx8fH0qUAyMWYcwcAVuDEiRP67bffHvqKVQCg5w4ArMC+fftkb2//UFcWA4BEuAMAALApDMsCAADYEMIdAACADSHcAQAA2BDCHQAAgA0h3AEAANgQwh0AAIAN+X/TetYXxgPSEwAAAABJRU5ErkJggg==\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pd.crosstab(df.target,df.sex).plot(kind='bar',\n",
" figsize=(10,6),\n",
" color=['cyan','crimson']);\n",
"\n",
"plt.title('Heart Disease Frequency for Sex')\n",
"plt.xlabel('0 = No Disease, 1 = Disease')\n",
"plt.ylabel('Amount')\n",
"plt.legend(['Female','Male'])\n",
"plt.grid()\n",
"plt.xticks(rotation = 0);"
]
},
{
"cell_type": "markdown",
"id": "60332099",
"metadata": {},
"source": [
"### ***Age Vs Max Heart Rate for Headrt Disease (thalach)***\n",
"\n",
"* Let's try combining a couple of independent variables, such as, `age` and `thalach` (maximum heart rate) and then comparing them to our target variable `heart disease`.\n",
"\n",
"\n",
"* Because there are so many different values for `age` and `thalach`, we'll use a scatter plot."
]
},
{
"cell_type": "code",
"execution_count": 272,
"id": "73d397c7",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create another figure\n",
"plt.figure(figsize=(10,6))\n",
"\n",
"# Scatter with positive examples\n",
"plt.scatter(df.age[df.target==1],\n",
" df.thalach[df.target==1],\n",
" color='crimson')\n",
"\n",
"\n",
"# Scatter with negative examples\n",
"plt.scatter(df.age[df.target==0],\n",
" df.thalach[df.target==0],\n",
" color='darkcyan')\n",
"\n",
"# Adding some helpful info\n",
"plt.title('Heart Disease in function of Age and Max Heart Rate')\n",
"plt.xlabel('Age')\n",
"plt.ylabel('Max Heart Rate (thalach)')\n",
"plt.legend([\"Disease\", \"No Disease\"]);\n",
"plt.grid()"
]
},
{
"cell_type": "markdown",
"id": "d472bf03",
"metadata": {},
"source": [
"### ***What can we infer from this?***\n",
"\n",
"* It seems the younger someone is, the higher their max heart rate (dots are higher on the left of the graph) and the older someone is, the more green dots there are. But this may be because there are more dots all together on the right side of the graph (older participants).\n",
"\n",
"\n",
"* Both of these are observational of course, but this is what we're trying to do, build an understanding of the data.\n",
"\n",
"\n",
"* Let's check the age **distribution**."
]
},
{
"cell_type": "code",
"execution_count": 271,
"id": "2818bba0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEACAYAAACkvpHUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAdHElEQVR4nO3df1RUdf7H8dcAogasKZG2IiqeXU1QpLTV/MWaQKj486i5ah7zrNHBTNPKLYva8qBoIbCt4vqj3NxqqbP+/p390DynVDQzjUo5ga61Km4qBoJzv3/4hW3EH3xgcIaZ5+Mc/pjP586978+ZYV5z5977uTbLsiwBAFBNPq4uAABQvxAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMCIn6sLuFXOni2W3e7cS1aCgwN15swFp66zvmDs3jl2ybvH701j9/GxqWnTgGv2eU1w2O2W04OjYr3eirF7L28evzePvQI/VQEAjBAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMCI11zHAcBR04AG8rutUY2eGxISVOPtll8s0dnisho/H65HcABeyu+2Rjoa0vuWb7fdqZ0SwVGv8VMVAMAIwQEAMOLy4NizZ4/GjBmjqKgo9erVSy+//LKKi4sr+3ft2qURI0YoKipK/fr10/Lly11YLQDApcFx4MABTZw4USEhIVq0aJGSk5O1du1azZ49W5KUm5urpKQkhYeHKysrS4mJiUpLS9OyZctcWTYAeDWXHhxfsGCBunTpooyMDNlsNt1///2y2+1asWKFfv75Z2VmZqpjx46aP3++JKlPnz4qLy/X4sWLNX78ePn7+7uyfADwSi7b4ygqKtLevXs1ZswY2Wy2yvaxY8dq+/bt8vHx0d69exUXF+fwvPj4eJ07d065ubm3umQAgFwYHN98840sy1KTJk00bdo0denSRffee69SUlJUUlKiwsJClZWVqW3btg7Pa926tSQpPz/fFWUDgNdz2U9VRUVFkqRZs2YpNjZWixYtUl5enhYuXKjS0lKNHj1akhQYGOjwvICAK3ekunDBO+7CBQDuxmXBUVZ25QKge+65RykpKZKkHj16yLIszZs3T6NGjZIkh5+xfsnHx2xnKTg48OYL1UBtrqCt7xh77dlLSuXTqKFT1lWf1Of3Tn2u3VlcFhwVew59+vRxaO/Vq5fmzp2rL7/8UlLVPYuKx0FBZi/emTMXnH7Lx5CQIJ06dd6p66wvGLtzxh4SEuSSq7el/7+C20Xq63vHm973Pj62637hdtkxjjZt2kiSLl265NBesScSGhoqX19fFRQUOPRXPL762AcA4NZwWXC0a9dOLVu21MaNGx3aP/zwQ/n5+Sk6Olpdu3bV1q1bZVn/21PYsmWLgoKCFBkZeatLBgDIhcFhs9k0c+ZM7d27VzNnztTu3bu1ZMkSLVq0SOPHj1ezZs302GOPKTc3V9OnT9fHH3+shQsXatmyZXr00UfVuHFjV5UOAF7NpRcADhgwQP7+/nr99df16KOPKjg4WMnJyXr00UclXTlYnpWVpczMTCUnJ6t58+Z6+umn9cgjj7iybADwai6fVr1///7q37//dftjY2MVGxt7CysCANyIyyc5BADULwQHAMAIwQEAMEJwAACMEBwAACMEBwDACMEBADBCcAAAjBAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMAIwQEAMEJwAACMEBwAACMEBwDACMEBADBCcAAAjBAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMAIwQEAMEJwAACMEBwAACMEBwDACMEBADBCcAAAjBAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMAIwQEAMEJwAACMEBwAACMEBwDAiHFwTJ8+XR988IHKysrqoh4AgJvzM33Cnj17tHnzZgUFBSkuLk6DBg3S7373O9lstrqoDwDgZoyDY+fOnfrss8+0ceNGbdu2Te+//76Cg4M1cOBADRw4UJ07d66LOgEAbsI4OGw2m7p3767u3bsrJSVFu3bt0qZNm7RmzRqtXLlSoaGhGjRokBITExUeHl4XNQMAXKhWB8d9fX3Vt29fzZ07V2+//bYSEhJUWFioRYsWaeDAgXrooYe0fft2Z9UKAHADxnscv/Tdd99p8+bN2rRpk44dOyZfX1/FxMQoMTFRNptN77zzjh5//HFNmTJFycnJzqoZAOBCxsFx9OhRbdq0SZs3b9bRo0clSffcc49eeOEFJSQk6Pbbb69cdsCAARo1apTeeOMNggMAPIRxcAwcOFCS9Nvf/lbTp09XYmKi7rrrrusu36JFC126dKnmFQLwKPaSUoWEBLlk2+UXS3S2mEsJass4OCZPnqzExET95je/qdby6enp8vX1NS4MgGfyadRQR0N6u2Tb7U7tlAiOWjM+OP7kk08qICBACxYs0E8//VTZvmTJEs2dO1dnzpxxWJ7QAADPYhwc33zzjYYNG6YVK1bo5MmTle3nzp3TP/7xDw0dOlSFhYVOLRIA4D6Mg+PVV19VQECANmzYoA4dOlS2z5w5Uxs2bFCDBg20YMEC40KmTJmi2NhYh7Zdu3ZpxIgRioqKUr9+/bR8+XLj9QIAnMs4OA4cOKAJEyaoTZs2VfpatWqlcePGac+ePUbrXLNmjbZt2+bQlpubq6SkJIWHhysrK0uJiYlKS0vTsmXLTEsGADiR8cFxy7JUWlp6w/6SkpJqr+/HH3/UnDlz1KJFC4f2zMxMdezYUfPnz5ck9enTR+Xl5Vq8eLHGjx8vf39/09IBAE5gvMcRFRWld999V+fOnavSV1xcrJycHEVFRVV7fbNnz1bPnj3Vo0ePyrbS0lLt3btXcXFxDsvGx8fr3Llzys3NNS0bAOAkxnscU6ZM0bhx4yrno2rdurVsNpsKCgq0YcMGnTp1SqmpqdVaV05Ojr766iutX79eaWlple2FhYUqKytT27ZtHZZv3bq1JCk/P1/du3c3LR0A4ATGwREVFaUVK1Zo3rx5Wr58uSzLquzr0KGDUlNTFR0dfdP1nDhxQqmpqUpNTVWzZs0c+s6fPy9JCgwMdGgPCAiQJF24cMG0bACAk9RorqquXbsqJydHRUVFOnHihOx2u+666y7deeed1Xq+ZVl69tln1bdvX8XHx1+zX9J17/Hh42M+N2NwcODNF6oBV10B6w4YO+qj2r52vPa1nOSwWbNmVfYWqmPVqlXKy8vTunXrVF5eLul/YVFeXq6goCsvzNV7FhWPK/pNnDlzQXa7dfMFDYSEBOnUqfNOXWd9wdidM3Y+hG692rx23vS+9/GxXfcLd42C45NPPtG6det0+vRpXb58uUq/zWbTm2++ed3nb9myRWfPnlWvXr2q9EVEROjFF1+Ur6+vCgoKHPoqHl997AMAcOsYB8eqVav0yiuvSJKCg4NrdFrsSy+9pOLiYoe2119/XUeOHNFf/vIXhYaGatOmTdq6dasmTJhQ+ZPVli1bFBQUpMjISONtAgCcwzg4Vq5cqQ4dOuhvf/ub7rjjjhpt9Fp3Brz99tvl7++vTp06SZIee+wxTZw4UdOnT9ewYcO0f/9+LVu2TDNmzFDjxo1rtF0AQO0ZH2U+efKkRo8eXePQqK4ePXooKytLR48eVXJystatW6enn35af/zjH+t0uwCAGzPe4wgLC9Pp06edXsjcuXOrtMXGxlaZvwqeq2lAA/nd1sgl2+Y+DUD11eh+HHPmzFF8fHy178kBVIffbY24TwNQDxgHx759+xQQEKAhQ4aobdu2atasWZXrLW52VhUAoP4yDo6dO3dKunJL2J9//lknTpxwelEAAPdlHBw7duyoizoAlzK9DzYX7sGb1erK8R9//FE//PCDwsPD1bBhQ/n5+dVoOhDA1Vx1H+x2p3be8m0CtVWjT/l9+/Zp+PDhiomJ0UMPPaRDhw7p888/V0xMjDZu3OjsGgEAbsQ4OA4ePKiJEyequLhYEyZMqGxv0qSJ/Pz8NHPmTH388cdOLRIA4D6MgyMjI0OhoaFas2aNJk+eXDk5YadOnbR27Vq1a9dO2dnZTi8UAOAejINj//79Gj58uBo1alTlNNzAwECNGjVK3377rdMKBAC4lxod47jRxIalpaWy2+01LggA4N5qdM/x9evXX7Pv4sWLysnJqZyoEADgeYyDY+rUqTp8+LDGjRun1atXy2az6eDBg1q5cqWGDBmi48ePKykpqS5qBQC4AePrOKKjo5Wdna2UlBTNmzdPkpSeni5JCgkJUXp6urp37+7cKgEAbqNGFwD27NlT27Zt01dffaXCwkLZ7Xa1bNlSkZGR8vOr1TWFAAA3V+NPeZvNpsjISO7GBwBexjg4Hn744Wott3LlSuNiAADuzzg4jh8/XqXNbrfr7NmzKi0tVcuWLblPRz1X3RsqMdEf4J2cNjvu5cuX9cEHH2j27NmaNGlSrQuD67jqhkpM+AfUD06bytbX11dxcXEaOXKkFixY4KzVAgDcjNPnQG/Tpo2+/vprZ68WAOAmnBocly5d0tq1axUcHOzM1QIA3IjTzqq6dOmS8vPzde7cOT3++OO1LgwA4J6cclaVdOUYR3h4uAYNGqQ//OEPtS4MAOCeuOc4AMAINwgHABipsyvHf8lms+nNN980fh4AwP0YB4e/v7++++47/fDDD2rSpIlatWqlhg0bqrCwUP/5z3/k7++vO+64oy5qBQC4AePgGDdunKZOnarnn39eo0aNUoMGDSr7Nm/erFmzZumpp55SQkKCUwsFALgH42Mcr776qkaOHKmxY8c6hIYkPfjggxo3bpwyMjKcViAAwL0YB0dBQYHCw8Ov2x8SEqKTJ0/WqigAgPsyDo7w8HCtXbtWZWVlVfpKSkr0/vvv6+6773ZKcQAA92N8jGPy5MmaPn26hg0bptGjRys0NFSSlJ+fr3feeUcnT57U8uXLnV4oAMA9GAdHQkKCSktLNX/+fM2ZM0c2m02SZFmWwsLClJ2drW7dujm9UACAe6jRrWOHDh2qwYMH68svv9S///1vSVdmxe3QoUNlkAAAPFON7znu4+OjFi1aSLpy3KNhw4ayLIvgAAAPV6MpR/bt26fhw4crJiZGDz30kA4dOqTPP/9cMTEx2rhxo7NrBAC4EePgOHjwoCZOnKji4mJNmDBBlmVJkpo0aSI/Pz/NnDlTH3/8sdMLBQC4B+PgyMjIUGhoqNasWaPJkydXtnfq1Elr165Vu3btlJ2d7dQiAQDuwzg49u/fr+HDh6tRo0ZVjmcEBgZq1KhR+vbbb51WIADAvdToGIe/v/91+0pLS2W322tcEADAvRkHR1RUlNavX3/NvosXLyonJ0edOnWqdWEAAPdkHBxTp07V4cOHNW7cOK1evVo2m00HDx7UypUrNWTIEB0/flxJSUl1USsAwA0YX8cRHR2t7OxspaSkaN68eZKk9PR0SVcmOExPT1f37t2dWyUAwG0YB8fZs2fVs2dPbdu2TYcPH1ZBQYHsdrtatmypyMhI+fnV+JpCAEA9YPwpP2zYMI0cOVLJycmKiIhQREREXdQFAHBTxsc4ioqKFBISUhe1AADqAePgSExM1Lvvvqvjx4/XRT0AADdn/FOVj4+Pjh07pvj4eIWFhSk4OFg+Po75Y7PZ9OabbzqtSACA+zAOjk8//VRNmzaVdOViv4pp1QEA3uGmwfH111+rZcuWCgoKkiTt2LGjzosCALivmx7jGDZsmD766COHtsuXL2vPnj06f/58XdUFAHBTNw2OimnTf+ncuXN6+OGHdejQoTopCgDgvmo0yaF07UABAHi+GgeHM9jtdr399ttKTExUdHS0+vfvr9TUVF24cKFymV27dmnEiBGKiopSv379tHz5chdWDABw6fwgS5cu1cKFCzVp0iT16NFD+fn5yszM1Hfffadly5YpNzdXSUlJSkhI0BNPPKF9+/YpLS1NlmVp0qRJriwdALyWy4LDsiwtXbpUo0eP1owZMyRJ999/v5o2barp06fryJEjyszMVMeOHTV//nxJUp8+fVReXq7Fixdr/PjxN7wvCACgblQrOI4dO6Y9e/ZUPq44myovL++6kxp269bthussLi7W4MGDlZCQ4NAeHh4uSfr222+1d+9eTZs2zaE/Pj5eS5cuVW5uLrPwAoALVCs4Fi9erMWLF1dpr5hW/VqOHDlyw3UGBgZq9uzZVdq3b98uSerYsaPKysrUtm1bh/7WrVtLkvLz8wkOAHCBmwbHlClTbkUdkqQvvvhCS5YsUf/+/Sv3agIDAx2WCQgIkCSHA+gAgFvHbYJj3759SkpKUmhoqF555RXl5+dLujLv1bVcPT/WzQQHB958oRoICQmqk/UCqBu1/Z/lf97FZ1VV2Lhxo2bNmqU2bdpo6dKlatq0qU6fPi2p6p5FxeOKKVCq68yZC7LbnXvtSUhIkE6d8ryr5/nHgCerzf+sp/7PX4uPj+26X7hdeh2HJK1YsUJPPvmkunTpolWrVunOO++UJIWFhcnX11cFBQUOy1c8vvrYBwDg1nBpcOTk5Gju3LlKSEjQ0qVLHfYiGjZsqK5du2rr1q0OV6lv2bJFQUFBioyMdEXJAOD1XPZT1ZkzZzRnzhy1bNlSY8eO1eHDhx36w8LC9Nhjj2nixImaPn26hg0bpv3792vZsmWaMWOGGjdu7KLKAcC7uSw4du7cqZ9//lknTpzQ2LFjq/SnpaVpyJAhysrKUmZmppKTk9W8eXM9/fTTeuSRR1xQMQBAcmFwDB06VEOHDr3pcrGxsYqNja37ggAA1eLyg+MAgPqF4AAAGCE4AABGCA4AgBGCAwBghOAAABghOAAARggOAIARggMAYITgAAAYITgAAEYIDgCAEbe4AyAA3Ar2klKX3Dq2/GKJzhaX1Wq77oTgAOA1fBo11NGQ3rd8u+1O7ZQ8KDj4qQoAYITgAAAYITgAAEYIDgCAEYIDAGCE4AAAGCE4AABGCA4AgBEuAHRjTQMayO+2Rq4uAwAcEBxuzO+2Rq67yhUAroOfqgAARggOAIARggMAYITgAAAYITgAAEYIDgCAEYIDAGCE4AAAGCE4AABGCA4AgBGCAwBghOAAABghOAAARggOAIARggMAYITgAAAYITgAAEYIDgCAEYIDAGCE4AAAGCE4AABGCA4AgBGCAwBghOAAABjxc3UBAODp7CWlCgkJcsm2yy+W6GxxmVPXSXAAQB3zadRQR0N6u2Tb7U7tlJwcHPxUBQAwQnAAAIwQHAAAI/UiONavX6+BAweqc+fOSkhI0OrVq11dEgB4LbcPjk2bNmnmzJnq2bOnXn/9dd1333165plntHnzZleXBgBeye3PqnrttdeUkJCgZ599VpLUu3dv/fTTT8rIyNCDDz5Y59tvGtBAfrc1um6/q06xAwBXcevgKCwsVEFBgZ588kmH9vj4eG3atEmFhYVq1apVndbgd1sj155GBwBuxq2D49ixY5Kktm3bOrS3bt1akpSfn1/t4PDxsdW4Dr9WLWr83Npy1ba9bbuu3DZj9o5tu3LMNfn8u9FzbJZlWbUpqC6tX79eM2bM0AcffKDQ0NDK9u+//15xcXFKT0/XgAEDXFghAHgftz44XpFpNpvtmu0+Pm5dPgB4JLf+5A0KunLg+cKFCw7txcXFDv0AgFvHrYOj4thGQUGBQ/v333/v0A8AuHXcOjhat26t0NDQKtdsbN26VW3atNGvf/1rF1UGAN7Lrc+qkqTk5GT96U9/UpMmTRQTE6MdO3Zo06ZNSk9Pd3VpAOCV3PqsqgrvvPOOli9frpMnT6pVq1aaPHmyhg4d6uqyAMAr1YvgAAC4D7c+xgEAcD8EBwDACMFxA5Zl6Y033lB8fLw6d+6swYMHa926dQ7L7Nq1SyNGjFBUVJT69eun5cuXu6jaujVlyhTFxsY6tHny2MvLy9W5c2e1b9/e4S86OrpyGU8e/549ezRmzBhFRUWpV69eevnllyuvn5I8d+yfffZZldf8l3//+te/JHnu+KvL7c+qcqXs7GxlZmbq8ccfV5cuXfTJJ59o5syZ8vX11YABA5Sbm6ukpCQlJCToiSee0L59+5SWlibLsjRp0iRXl+80a9as0bZt2xQWFlbZ5uljz8/PV2lpqebNm6c2bdpUtlfMVuDJ4z9w4IAmTpyofv36adGiRfr+++/12muvqaioSOnp6R499oiICL377rsObZZl6bnnntPFixfVt29fjx5/tVm4pkuXLlndunWz/vznPzu0jxs3zhozZoxlWZY1YcIEa+TIkQ79aWlpVteuXa3S0tJbVmtd+uGHH6xu3bpZffr0sfr371/Z7uljX7t2rdWhQwfr4sWL1+z35PGPHTvWGjt2rGW32yvb3nrrLeuBBx6wLl686NFjv5Y33njD6tChg3XgwAHLsjz7ta8ufqq6Dl9fX/3973/X5MmTHdobNGig0tJSlZaWau/evYqLi3Poj4+P17lz55Sbm3sry60zs2fPVs+ePdWjR4/KNm8Y+5EjRxQWFqbGjRtX6fPk8RcVFWnv3r0aM2aMwxxxY8eO1fbt2+Xj4+OxY7+W06dPKyMjo/JnO09+7U0QHNfh4+Oj9u3bq3nz5rIsS6dPn9aSJUu0e/dujR49WoWFhSorK7vhlO/1XU5Ojr766is9//zzDu3eMPa8vDz5+/tr0qRJio6OVrdu3fTCCy/owoULHj3+b775RpZlqUmTJpo2bZq6dOmie++9VykpKSopKfHosV9LZmamfHx8NG3aNEne8d6vDo5xVMPWrVs1depUSVJMTIwGDx6sI0eOSJICAwMdlg0ICJBUdWLG+ubEiRNKTU1VamqqmjVr5tB3/vx5SZ47dkn6+uuvdeHCBY0cOVJJSUk6dOiQsrKylJ+fX3ljMU8cf1FRkSRp1qxZio2N1aJFi5SXl6eFCxeqtLRUo0ePluSZY79aUVGRVq9erUceeUS/+tWvJHnHe786CI5q6Nixo9566y3l5eUpIyNDkydPrvwGcvWU7xXq85TvlmXp2WefVd++fRUfH3/Nfskzx14hPT1dTZo0Ufv27SVJ3bp1U3BwsJ566il9+umnkjxz/GVlZZKke+65RykpKZKkHj16yLIszZs3T6NGjZLkmWO/2j//+U/Z7XY9/PDDlW3e8N6vDoKjGlq1aqVWrVqpW7duCgwM1DPPPFP5Brr6G0bF4/o85fuqVauUl5endevWqby8XNL//mHKy8uvO929J4y9wn333VelLSYmxuGxJ46/4ptznz59HNp79eqluXPn6ssvv5TkmWO/2pYtW9S7d2+HPW5veO9XB8FxHf/973/10UcfqUePHmrevHlle8eOHSVJx48fl6+vb5Up3yse1+cp37ds2aKzZ8+qV69eVfoiIiL04osveuzYJenMmTPasWOHunfv7nBr4pKSEklScHCwx46/4tTjS5cuObRX7ImEhoZ67Nh/6ccff9Thw4c1ceJEh/awsDCvGP/NeMd+VQ3Y7XbNmjWryjndFT9TdOrUSV27dtXWrVsrv41LVz50g4KCFBkZeUvrdaaXXnpJ7733nsPf73//e7Vo0ULvvfeeHnzwQY8du3TlZ4gXXnhBb731lkP7xo0b5evrq/vvv99jx9+uXTu1bNlSGzdudGj/8MMP5efnp+joaI8d+y998cUXkqR7773Xob1hw4ZeMf6bcslJwPXESy+9ZEVERFjZ2dnW7t27raysLCsyMtJ67rnnLMuyrN27d1vt27e3nnjiCeujjz6y0tPTrfbt21tLlixxceXO98wzzzhcx+HpY3/55Zetu+++28rMzKx87SMiIqxXXnnFsizPHv+GDRus9u3bWzNmzLA+/fRTKzs724qIiLBSU1Mty/LssVfIysqyoqKirtnnDeO/GYLjBi5dumQtWbLEiouLsyIjI63+/ftb2dnZ1uXLlyuX2bp1qzVo0CArIiLC6tevn7Vs2TIXVlx3rg4Oy/LssVe89vHx8VZkZKT1wAMPeNVrv23bNmvo0KFWZGSk1bdvX+uvf/2r14zdsiwrJSXF6t2793X7PX38N8O06gAAIxzjAAAYITgAAEYIDgCAEYIDAGCE4AAAGCE4AABGCA4AgBGCAwBghOAAABj5P4OBc0wdTYpNAAAAAElFTkSuQmCC\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Checking the distribution of the age column with a histogram\n",
"df.age.plot.hist(color = 'crimson', grid =True);"
]
},
{
"cell_type": "markdown",
"id": "45b550e6",
"metadata": {},
"source": [
"***We can see it's a NORMAL DISTRIBUTION.***\n",
"\n",
"***(https://en.wikipedia.org/wiki/Normal_distribution) but slightly swaying to the right, which reflects in the scatter plot above.***"
]
},
{
"cell_type": "markdown",
"id": "4aabd3de",
"metadata": {},
"source": [
"### ***Heart Disease frequency per Chest Pain type***\n",
"\n",
"* Let's try another independent variable. This time, `cp` (chest pain).\n",
"\n",
"* We'll use the same process as we did before with `sex`."
]
},
{
"cell_type": "markdown",
"id": "047243e8",
"metadata": {},
"source": [
"***cp - chest pain type***\n",
" * ***0: Typical angina: chest pain related decrease blood supply to the heart***\n",
" * ***1: Atypical angina: chest pain not related to heart***\n",
" * ***2: Non-anginal pain: typically esophageal spasms (non heart related)***\n",
" * ***3: Asymptomatic: chest pain not showing signs of disease*** "
]
},
{
"cell_type": "code",
"execution_count": 213,
"id": "4a7be9a9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Making the above data more visual\n",
"pd.crosstab(df.cp,df.target).plot(kind='bar',\n",
" figsize=(10,6),\n",
" color=['cyan','crimson'])\n",
"\n",
"# Labelling\n",
"plt.title('Heart Disease Frequency Per Chest Pain Type')\n",
"plt.xlabel(\"Chest Pain Type\")\n",
"plt.ylabel(\"Amount\")\n",
"plt.legend([\"No Disease\", \"Disease\"])\n",
"plt.grid()\n",
"plt.xticks(rotation=0);"
]
},
{
"cell_type": "markdown",
"id": "9f91effa",
"metadata": {},
"source": [
"### ***What can we infer from this?***\n",
"\n",
"Remember from our data dictionary what the different levels of chest pain are.\n",
"\n",
"3. cp - chest pain type \n",
" * 0: Typical angina: chest pain related decrease blood supply to the heart\n",
" * 1: Atypical angina: chest pain not related to heart\n",
" * 2: Non-anginal pain: typically esophageal spasms (non heart related)\n",
" * 3: Asymptomatic: chest pain not showing signs of disease\n",
" \n",
"It's interesting the atypical agina (value 1) states it's not related to the heart but seems to have a higher ratio of participants with heart disease than not.\n",
"\n",
"\n",
"What does atypical agina even mean?\n",
"\n",
"At this point, it's important to remember, if your data dictionary doesn't supply you enough information, you may want to do further research on your values. This research may come in the form of asking a **subject matter expert** (such as a cardiologist or the person who gave you the data) or Googling to find out more.\n",
"\n",
"According to PubMed, it seems [even some medical professionals are confused by the term](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2763472/).\n",
"\n",
"> Today, 23 years later, “atypical chest pain” is still popular in medical circles. Its meaning, however, remains unclear. A few articles have the term in their title, but do not define or discuss it in their text. In other articles, the term refers to noncardiac causes of chest pain.\n",
"\n",
"Although not conclusive, this graph above is a hint at the confusion of defintions being represented in data."
]
},
{
"cell_type": "markdown",
"id": "f41ad260",
"metadata": {},
"source": [
"### ***Make a correlation matrix***\n",
"\n",
"***Finally, we'll compare all of the independent variables in one hit.***\n",
"\n",
"***Why?***\n",
"\n",
"* Because this may give an idea of which independent variables may or may not have an impact on our target variable.\n",
"\n",
"\n",
"* We can do this using `df.corr()` which will create a [**correlation matrix**](https://www.statisticshowto.datasciencecentral.com/correlation-matrix/) for us, in other words, a big table of numbers telling us how related each variable is the other."
]
},
{
"cell_type": "code",
"execution_count": 215,
"id": "51235612",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Making the correlation matrix more visual\n",
"corr_matrix = df.corr()\n",
"fig, ax = plt.subplots(figsize = (15, 10))\n",
"ax = sns.heatmap(corr_matrix,\n",
" annot = True,\n",
" linewidths = 0.5,\n",
" fmt = \".2f\",\n",
" cmap =None )\n",
"\n",
"bottom, top = ax.get_ylim()\n",
"plt.yticks(rotation = 0)\n",
"ax.set_ylim(bottom + 0.5, top - 0.5);"
]
},
{
"cell_type": "markdown",
"id": "1e83c4b0",
"metadata": {},
"source": [
"#### ***Note :***\n",
"\n",
"***A higher positive value means a potential positive correlation (increase) and a higher negative value means a potential negative correlation (decrease).***"
]
},
{
"cell_type": "markdown",
"id": "68eb0db3",
"metadata": {},
"source": [
"### ***Before we model***\n",
"\n",
"Remember, we do exploratory data analysis (EDA) to start building an intuitition of the dataset.\n",
"\n",
"What have we learned so far? Aside from our basline estimate using `sex`, the rest of the data seems to be pretty distributed.\n",
"\n",
"So what we'll do next is **model driven EDA**, meaning, we'll use machine learning models to drive our next questions.\n",
"\n",
"**A few extra things to remember:***\n",
"\n",
"* Not every EDA will look the same, what we've seen here is an example of what you could do for structured, tabular dataset.\n",
"* You don't necessarily have to do the same plots as we've done here, there are many more ways to visualize data, I encourage you to look at more.\n",
"* We want to quickly find:\n",
" * Distributions (`df.column.hist()`)\n",
" * Missing values (`df.info()`)\n",
" * Outliers"
]
},
{
"cell_type": "markdown",
"id": "a235b2c7",
"metadata": {},
"source": [
"## ***5. Modelling***\n",
"\n",
"***We've explored the data, now we'll try to use machine learning to predict our target variable based on the 13 independent variables.***\n",
"\n",
"***Remember our problem?***\n",
"\n",
"* >Given clinical parameters about a patient, can we predict whether or not they have heart disease?\n",
"\n",
"That's what we'll be trying to answer.\n",
"\n",
"***And remember our evaluation metric?***\n",
"\n",
"* >If we can reach 95% accuracy at predicting whether or not a patient has heart disease during the proof of concept, we'll pursure this project.\n",
"\n",
"But before we build a model, we have to get our dataset ready."
]
},
{
"cell_type": "code",
"execution_count": 217,
"id": "03066a8c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" age sex cp trestbps chol fbs restecg thalach exang oldpeak \\\n",
"0 63 1 3 145 233 1 0 150 0 2.3 \n",
"1 37 1 2 130 250 0 1 187 0 3.5 \n",
"2 41 0 1 130 204 0 0 172 0 1.4 \n",
"3 56 1 1 120 236 0 1 178 0 0.8 \n",
"4 57 0 0 120 354 0 1 163 1 0.6 \n",
".. ... ... .. ... ... ... ... ... ... ... \n",
"298 57 0 0 140 241 0 1 123 1 0.2 \n",
"299 45 1 3 110 264 0 1 132 0 1.2 \n",
"300 68 1 0 144 193 1 1 141 0 3.4 \n",
"301 57 1 0 130 131 0 1 115 1 1.2 \n",
"302 57 0 1 130 236 0 0 174 0 0.0 \n",
"\n",
" slope ca thal \n",
"0 0 0 1 \n",
"1 0 0 2 \n",
"2 2 0 2 \n",
"3 2 0 2 \n",
"4 2 0 2 \n",
".. ... .. ... \n",
"298 1 0 3 \n",
"299 1 0 3 \n",
"300 1 2 3 \n",
"301 1 1 3 \n",
"302 1 1 2 \n",
"\n",
"[303 rows x 13 columns]"
]
},
"execution_count": 219,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X"
]
},
{
"cell_type": "code",
"execution_count": 220,
"id": "8b630421",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 1\n",
"2 1\n",
"3 1\n",
"4 1\n",
" ..\n",
"298 0\n",
"299 0\n",
"300 0\n",
"301 0\n",
"302 0\n",
"Name: target, Length: 303, dtype: int64"
]
},
"execution_count": 220,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y"
]
},
{
"cell_type": "markdown",
"id": "da7110d3",
"metadata": {},
"source": [
"### ***Training and test data split***\n",
"\n",
"Now comes one of the most important concepts in machine learning, the **training/test split**.\n",
"\n",
"This is where you'll split your data into a **training set** and a **test set**.\n",
"\n",
"You use your training set to train your model and your test set to test it.\n",
"\n",
"The test set must remain separate from your training set.\n",
"\n",
"#### ***Why not use all the data to train a model?***\n",
"\n",
"Let's say you wanted to take your model into the hospital and start using it on patients. How would you know how well your model goes on a new patient not included in the original full dataset you had?\n",
"\n",
"This is where the test set comes in. It's used to mimic taking your model to a real environment as much as possible.\n",
"\n",
"And it's why it's important to never let your model learn from the test set, it should only be evaluated on it.\n",
"\n",
"To split our data into a training and test set, we can use Scikit-Learn's [`train_test_split()`](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) and feed it our independent and dependent variables (`X` & `y`)."
]
},
{
"cell_type": "code",
"execution_count": 221,
"id": "2d42dd9a",
"metadata": {},
"outputs": [],
"source": [
"# Split data into train and test set\n",
"np.random.seed(42)\n",
"\n",
"# Split into train and test set\n",
"X_train, X_test, y_train, y_test = train_test_split(X,\n",
" y,\n",
" test_size = 0.2)"
]
},
{
"cell_type": "markdown",
"id": "cd30f051",
"metadata": {},
"source": [
"> The `test_size` parameter is used to tell the `train_test_split()` function how much of our data we want in the test set.\n",
"\n",
"> A rule of thumb is to use 80% of your data to train on and the other 20% to test on. \n",
"\n",
"> For our problem, a train and test set are enough. But for other problems, you could also use a validation (train/validation/test) set or cross-validation (we'll see this in a second).\n",
"\n",
"> But again, each problem will differ. The post, [How (and why) to create a good validation set](https://www.fast.ai/2017/11/13/validation-sets/) by Rachel Thomas is a good place to go to learn more.\n",
"\n",
"***Let's look at our training data***."
]
},
{
"cell_type": "code",
"execution_count": 222,
"id": "d058e900",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
age
\n",
"
sex
\n",
"
cp
\n",
"
trestbps
\n",
"
chol
\n",
"
fbs
\n",
"
restecg
\n",
"
thalach
\n",
"
exang
\n",
"
oldpeak
\n",
"
slope
\n",
"
ca
\n",
"
thal
\n",
"
\n",
" \n",
" \n",
"
\n",
"
132
\n",
"
42
\n",
"
1
\n",
"
1
\n",
"
120
\n",
"
295
\n",
"
0
\n",
"
1
\n",
"
162
\n",
"
0
\n",
"
0.0
\n",
"
2
\n",
"
0
\n",
"
2
\n",
"
\n",
"
\n",
"
202
\n",
"
58
\n",
"
1
\n",
"
0
\n",
"
150
\n",
"
270
\n",
"
0
\n",
"
0
\n",
"
111
\n",
"
1
\n",
"
0.8
\n",
"
2
\n",
"
0
\n",
"
3
\n",
"
\n",
"
\n",
"
196
\n",
"
46
\n",
"
1
\n",
"
2
\n",
"
150
\n",
"
231
\n",
"
0
\n",
"
1
\n",
"
147
\n",
"
0
\n",
"
3.6
\n",
"
1
\n",
"
0
\n",
"
2
\n",
"
\n",
"
\n",
"
75
\n",
"
55
\n",
"
0
\n",
"
1
\n",
"
135
\n",
"
250
\n",
"
0
\n",
"
0
\n",
"
161
\n",
"
0
\n",
"
1.4
\n",
"
1
\n",
"
0
\n",
"
2
\n",
"
\n",
"
\n",
"
176
\n",
"
60
\n",
"
1
\n",
"
0
\n",
"
117
\n",
"
230
\n",
"
1
\n",
"
1
\n",
"
160
\n",
"
1
\n",
"
1.4
\n",
"
2
\n",
"
2
\n",
"
3
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
188
\n",
"
50
\n",
"
1
\n",
"
2
\n",
"
140
\n",
"
233
\n",
"
0
\n",
"
1
\n",
"
163
\n",
"
0
\n",
"
0.6
\n",
"
1
\n",
"
1
\n",
"
3
\n",
"
\n",
"
\n",
"
71
\n",
"
51
\n",
"
1
\n",
"
2
\n",
"
94
\n",
"
227
\n",
"
0
\n",
"
1
\n",
"
154
\n",
"
1
\n",
"
0.0
\n",
"
2
\n",
"
1
\n",
"
3
\n",
"
\n",
"
\n",
"
106
\n",
"
69
\n",
"
1
\n",
"
3
\n",
"
160
\n",
"
234
\n",
"
1
\n",
"
0
\n",
"
131
\n",
"
0
\n",
"
0.1
\n",
"
1
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
270
\n",
"
46
\n",
"
1
\n",
"
0
\n",
"
120
\n",
"
249
\n",
"
0
\n",
"
0
\n",
"
144
\n",
"
0
\n",
"
0.8
\n",
"
2
\n",
"
0
\n",
"
3
\n",
"
\n",
"
\n",
"
102
\n",
"
63
\n",
"
0
\n",
"
1
\n",
"
140
\n",
"
195
\n",
"
0
\n",
"
1
\n",
"
179
\n",
"
0
\n",
"
0.0
\n",
"
2
\n",
"
2
\n",
"
2
\n",
"
\n",
" \n",
"
\n",
"
242 rows × 13 columns
\n",
"
"
],
"text/plain": [
" age sex cp trestbps chol fbs restecg thalach exang oldpeak \\\n",
"132 42 1 1 120 295 0 1 162 0 0.0 \n",
"202 58 1 0 150 270 0 0 111 1 0.8 \n",
"196 46 1 2 150 231 0 1 147 0 3.6 \n",
"75 55 0 1 135 250 0 0 161 0 1.4 \n",
"176 60 1 0 117 230 1 1 160 1 1.4 \n",
".. ... ... .. ... ... ... ... ... ... ... \n",
"188 50 1 2 140 233 0 1 163 0 0.6 \n",
"71 51 1 2 94 227 0 1 154 1 0.0 \n",
"106 69 1 3 160 234 1 0 131 0 0.1 \n",
"270 46 1 0 120 249 0 0 144 0 0.8 \n",
"102 63 0 1 140 195 0 1 179 0 0.0 \n",
"\n",
" slope ca thal \n",
"132 2 0 2 \n",
"202 2 0 3 \n",
"196 1 0 2 \n",
"75 1 0 2 \n",
"176 2 2 3 \n",
".. ... .. ... \n",
"188 1 1 3 \n",
"71 2 1 3 \n",
"106 1 1 2 \n",
"270 2 0 3 \n",
"102 2 2 2 \n",
"\n",
"[242 rows x 13 columns]"
]
},
"execution_count": 222,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train"
]
},
{
"cell_type": "code",
"execution_count": 223,
"id": "6c4a9e10",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"132 1\n",
"202 0\n",
"196 0\n",
"75 1\n",
"176 0\n",
" ..\n",
"188 0\n",
"71 1\n",
"106 1\n",
"270 0\n",
"102 1\n",
"Name: target, Length: 242, dtype: int64"
]
},
"execution_count": 223,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_train"
]
},
{
"cell_type": "code",
"execution_count": 224,
"id": "38d6450b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"242"
]
},
"execution_count": 224,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(y_train)"
]
},
{
"cell_type": "markdown",
"id": "27ba569a",
"metadata": {},
"source": [
"#### ***After splitting the data into training and test sets, we need to now build a machine learning model.***\n",
"#### ***We'll train the data (find the patterns) on the training set.***\n",
"#### ***And then we'll use the patterns on the test set.***\n",
"#### ***We're going to implement three machine learning model :***\n",
"#### ***1. Logistic Regression***\n",
"#### ***2. K-Nearest Neighbours Classifier***\n",
"#### ***3. Random Forest Classifier***"
]
},
{
"cell_type": "markdown",
"id": "5aa93655",
"metadata": {},
"source": [
"### ***Why these?***\n",
"\n",
"If we look at the [Scikit-Learn algorithm cheat sheet](https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html), we can see we're working on a classification problem and these are the algorithms it suggests (plus a few more).\n",
"\n",
"| | \n",
"|:--:| \n",
"| An example path we can take using the Scikit-Learn Machine Learning Map |\n",
"\n",
"\"Wait, I don't see Logistic Regression and why not use LinearSVC?\"\n",
"\n",
"Good questions. \n",
"\n",
"I was confused too when I didn't see Logistic Regression listed as well because when you read the Scikit-Learn documentation on it, you can see it's [a model for classification](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression).\n",
"\n",
"And as for LinearSVC, let's pretend we've tried it, and it doesn't work, so we're following other options in the map.\n",
"\n",
"For now, knowing each of these algorithms inside and out is not essential.\n",
"\n",
"Machine learning and data science is an iterative practice. These algorithms are tools in your toolbox.\n",
"\n",
"In the beginning, on your way to becoming a practioner, it's more important to understand your problem (such as, classification versus regression) and then knowing what tools you can use to solve it.\n",
"\n",
"Since our dataset is relatively small, we can experiment to find algorithm performs best.\n",
"\n",
"All of the algorithms in the Scikit-Learn library use the same functions, for training a model, `model.fit(X_train, y_train)` and for scoring a model `model.score(X_test, y_test)`. `score()` returns the ratio of correct predictions (1.0 = 100% correct).\n",
"\n",
"Since the algorithms we've chosen implement the same methods for fitting them to the data as well as evaluating them, let's put them in a dictionary and create a which fits and scores them."
]
},
{
"cell_type": "code",
"execution_count": 225,
"id": "68622ac2",
"metadata": {},
"outputs": [],
"source": [
"# Creating a model dictionary\n",
"models = {\"Logistic Regression\" : LogisticRegression(),\n",
" \"KNN\" : KNeighborsClassifier(),\n",
" \"Random Forest\" : RandomForestClassifier()}\n",
"\n",
"# Using a function to fit and evaluate the score of models\n",
"def fit_and_score(models, X_train, X_test, y_train, y_test):\n",
" \"\"\"\n",
" Fitting and evaluating the give machine learning models.\n",
" models : a dictionary of different Scitkit-Learn machine learning models.\n",
" X_train : training data (no labels)\n",
" X_test : testing data (no labels)\n",
" y_train : training labels\n",
" y_test : \"testing labels\"\n",
" \n",
" \"\"\"\n",
" # Set random seed\n",
" np.random.seed(42)\n",
" # Make a dictionary to keep model scores\n",
" model_scores = {}\n",
" # Loop through models\n",
" for name, model in models.items():\n",
" # Fit the model to the data\n",
" model.fit(X_train, y_train)\n",
" # Evaluate the model and append its score to model_scores\n",
" model_scores[name] = model.score(X_test, y_test)\n",
" return model_scores\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 226,
"id": "4fa0affc",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\vedant\\coding stuff\\project\\heart-disease-prediction\\env\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:814: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
"Please also refer to the documentation for alternative solver options:\n",
" https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
" n_iter_i = _check_optimize_result(\n"
]
},
{
"data": {
"text/plain": [
"{'Logistic Regression': 0.8852459016393442,\n",
" 'KNN': 0.6885245901639344,\n",
" 'Random Forest': 0.8360655737704918}"
]
},
"execution_count": 226,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_scores = fit_and_score(models = models,\n",
" X_train = X_train,\n",
" X_test = X_test,\n",
" y_train = y_train,\n",
" y_test = y_test)\n",
"\n",
"model_scores"
]
},
{
"cell_type": "markdown",
"id": "a2f2294d",
"metadata": {},
"source": [
"### ***Model comparison***"
]
},
{
"cell_type": "code",
"execution_count": 268,
"id": "b1ce7cf5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model_compare = pd.DataFrame(model_scores, index = [\"accuracy\"])\n",
"model_compare.T.plot.bar(color = 'crimson', figsize = (7, 5));\n",
"plt.xticks(rotation = 0)\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "832870a4",
"metadata": {},
"source": [
"#### ****These things should be given more attention while working with a classification problem.****\n",
"\n",
"#### ***1. Hyperparameter tuning***\n",
"#### ***2. Feature importance***\n",
"#### ***3. Confusion matrix***\n",
"#### ***4. Cross-validation***\n",
"#### ***5. Precision***\n",
"#### ***6. Recall***\n",
"#### ***7. F1 score***\n",
"#### ***8. Classification report***\n",
"#### ***9. ROC curve***\n",
"#### ***10. Area under the curve (AUC)***"
]
},
{
"cell_type": "markdown",
"id": "4472d9bb",
"metadata": {},
"source": [
"* **Hyperparameter tuning** - Each model you use has a series of dials you can turn to dictate how they perform. Changing these values may increase or decrease model performance.\n",
"\n",
"\n",
"* **Feature importance** - If there are a large amount of features we're using to make predictions, do some have more importance than others? For example, for predicting heart disease, which is more important, sex or age?\n",
"\n",
"\n",
"* [**Confusion matrix**](https://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/) - Compares the predicted values with the true values in a tabular way, if 100% correct, all values in the matrix will be top left to bottom right (diagnol line).\n",
"\n",
"\n",
"* [**Cross-validation**](https://scikit-learn.org/stable/modules/cross_validation.html) - Splits your dataset into multiple parts and train and tests your model on each part and evaluates performance as an average. \n",
"\n",
"\n",
"* [**Precision**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score) - Proportion of true positives over total number of samples. Higher precision leads to less false positives.\n",
"\n",
"\n",
"* [**Recall**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html#sklearn.metrics.recall_score) - Proportion of true positives over total number of true positives and false negatives. Higher recall leads to less false negatives.\n",
"\n",
"\n",
"* [**F1 score**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score) - Combines precision and recall into one metric. 1 is best, 0 is worst.\n",
"\n",
"\n",
"* [**Classification report**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html) - Sklearn has a built-in function called `classification_report()` which returns some of the main classification metrics such as precision, recall and f1-score.\n",
"\n",
"\n",
"* [**ROC Curve**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_score.html) - [Receiver Operating Characterisitc](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) is a plot of true positive rate versus false positive rate.\n",
"\n",
"\n",
"* [**Area Under Curve (AUC)**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html) - The area underneath the ROC curve. A perfect model achieves a score of 1.0."
]
},
{
"cell_type": "markdown",
"id": "fb74b8e9",
"metadata": {},
"source": [
"## ***Hyperparameter Tuning (by hand)***"
]
},
{
"cell_type": "code",
"execution_count": 228,
"id": "7b5a48c3",
"metadata": {},
"outputs": [],
"source": [
"# Tuning KNN model\n",
"\n",
"train_scores = []\n",
"test_scores = []\n",
"\n",
"# Create a list of different values for n_neighbors\n",
"neighbors = range(1,21)\n",
"\n",
"# Setup KNN instance\n",
"knn = KNeighborsClassifier()\n",
"\n",
"# Loop through different n_neighbors\n",
"for i in neighbors:\n",
" knn.set_params(n_neighbors = i)\n",
" \n",
" # Fit the algorithm\n",
" knn.fit(X_train, y_train)\n",
" \n",
" # Update the training scores list\n",
" train_scores.append(knn.score(X_train, y_train))\n",
" \n",
" # Update the test scores list\n",
" test_scores.append(knn.score(X_test, y_test))"
]
},
{
"cell_type": "code",
"execution_count": 229,
"id": "21738305",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1.0,\n",
" 0.8099173553719008,\n",
" 0.7727272727272727,\n",
" 0.743801652892562,\n",
" 0.7603305785123967,\n",
" 0.7520661157024794,\n",
" 0.743801652892562,\n",
" 0.7231404958677686,\n",
" 0.71900826446281,\n",
" 0.6942148760330579,\n",
" 0.7272727272727273,\n",
" 0.6983471074380165,\n",
" 0.6900826446280992,\n",
" 0.6942148760330579,\n",
" 0.6859504132231405,\n",
" 0.6735537190082644,\n",
" 0.6859504132231405,\n",
" 0.6652892561983471,\n",
" 0.6818181818181818,\n",
" 0.6694214876033058]"
]
},
"execution_count": 229,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_scores"
]
},
{
"cell_type": "code",
"execution_count": 230,
"id": "b08d8be1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.6229508196721312,\n",
" 0.639344262295082,\n",
" 0.6557377049180327,\n",
" 0.6721311475409836,\n",
" 0.6885245901639344,\n",
" 0.7213114754098361,\n",
" 0.7049180327868853,\n",
" 0.6885245901639344,\n",
" 0.6885245901639344,\n",
" 0.7049180327868853,\n",
" 0.7540983606557377,\n",
" 0.7377049180327869,\n",
" 0.7377049180327869,\n",
" 0.7377049180327869,\n",
" 0.6885245901639344,\n",
" 0.7213114754098361,\n",
" 0.6885245901639344,\n",
" 0.6885245901639344,\n",
" 0.7049180327868853,\n",
" 0.6557377049180327]"
]
},
"execution_count": 230,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_scores"
]
},
{
"cell_type": "code",
"execution_count": 267,
"id": "4235ff1d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Maximum KNN score on the test data : 75.41%\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(neighbors, train_scores, label = \"Train score\")\n",
"plt.plot(neighbors, test_scores, label = \"Test score\")\n",
"plt.xticks(np.arange(1,21,2))\n",
"plt.xlabel(\"Number of neighbors\")\n",
"plt.ylabel(\"Model score\")\n",
"plt.legend()\n",
"plt.grid()\n",
"\n",
"print(f\"Maximum KNN score on the test data : {max(test_scores)*100:.2f}%\")"
]
},
{
"cell_type": "markdown",
"id": "9c737a52",
"metadata": {},
"source": [
"### ***Hyperparameter tuning with RandomizedSearchCV***\n",
"\n",
"***We're about to tune :***\n",
"* ***1. LogisticRegression()***\n",
"* ***2. RandomForestClassifier()***"
]
},
{
"cell_type": "code",
"execution_count": 232,
"id": "38fe2646",
"metadata": {},
"outputs": [],
"source": [
"# Create a hyperparameter grid for LogisticRegression\n",
"log_reg_grid = {\"C\" : np.logspace(-4, 4, 20),\n",
" \"solver\" : [\"liblinear\"]}\n",
"\n",
"# Create a hyperparameter grid for RandomForestClassifier\n",
"rf_grid = {\"n_estimators\" : np.arange(10, 1000, 50),\n",
" \"max_depth\" : [None, 3, 5, 10],\n",
" \"min_samples_split\" : np.arange(2,20,2),\n",
" \"min_samples_leaf\" : np.arange(1, 20, 2)}"
]
},
{
"cell_type": "markdown",
"id": "f85515b8",
"metadata": {},
"source": [
"***We have created hyperparameter grid setup for each of our models, now we'll tune them using RandomizedSearchCV***"
]
},
{
"cell_type": "code",
"execution_count": 233,
"id": "f1ee2007",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fitting 5 folds for each of 20 candidates, totalling 100 fits\n"
]
},
{
"data": {
"text/plain": [
"RandomizedSearchCV(cv=5, estimator=LogisticRegression(), n_iter=20,\n",
" param_distributions={'C': array([1.00000000e-04, 2.63665090e-04, 6.95192796e-04, 1.83298071e-03,\n",
" 4.83293024e-03, 1.27427499e-02, 3.35981829e-02, 8.85866790e-02,\n",
" 2.33572147e-01, 6.15848211e-01, 1.62377674e+00, 4.28133240e+00,\n",
" 1.12883789e+01, 2.97635144e+01, 7.84759970e+01, 2.06913808e+02,\n",
" 5.45559478e+02, 1.43844989e+03, 3.79269019e+03, 1.00000000e+04]),\n",
" 'solver': ['liblinear']},\n",
" verbose=True)"
]
},
"execution_count": 233,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Tuning LogisticRegression\n",
"\n",
"np.random.seed(42)\n",
"\n",
"# Setup random hyperparameter search for LogisticRegression\n",
"rs_log_reg = RandomizedSearchCV(LogisticRegression(),\n",
" param_distributions = log_reg_grid,\n",
" cv = 5,\n",
" n_iter = 20,\n",
" verbose = True)\n",
"\n",
"# Fitting random hyperparameter search model for LogisticRegression\n",
"rs_log_reg.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 234,
"id": "11abe1ec",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'solver': 'liblinear', 'C': 0.23357214690901212}"
]
},
"execution_count": 234,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rs_log_reg.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 235,
"id": "747f85c5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8852459016393442"
]
},
"execution_count": 235,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rs_log_reg.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 236,
"id": "1f164631",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fitting 5 folds for each of 20 candidates, totalling 100 fits\n"
]
},
{
"data": {
"text/plain": [
"RandomizedSearchCV(cv=5, estimator=RandomForestClassifier(), n_iter=20,\n",
" param_distributions={'max_depth': [None, 3, 5, 10],\n",
" 'min_samples_leaf': array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]),\n",
" 'min_samples_split': array([ 2, 4, 6, 8, 10, 12, 14, 16, 18]),\n",
" 'n_estimators': array([ 10, 60, 110, 160, 210, 260, 310, 360, 410, 460, 510, 560, 610,\n",
" 660, 710, 760, 810, 860, 910, 960])},\n",
" verbose=True)"
]
},
"execution_count": 236,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Tuning RandomForestClassifier\n",
"\n",
"np.random.seed(42)\n",
"\n",
"# Setup random hyperparameter search for RandomForestClassifier\n",
"rs_rf = RandomizedSearchCV(RandomForestClassifier(),\n",
" param_distributions = rf_grid,\n",
" cv = 5,\n",
" n_iter = 20,\n",
" verbose = True)\n",
"\n",
"# Fit random hyperparameter search model for RandomForestClassifier()\n",
"rs_rf.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 237,
"id": "74231ab3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'n_estimators': 210,\n",
" 'min_samples_split': 4,\n",
" 'min_samples_leaf': 19,\n",
" 'max_depth': 3}"
]
},
"execution_count": 237,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Find the best hyperparameters\n",
"rs_rf.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 238,
"id": "38b1e06d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8688524590163934"
]
},
"execution_count": 238,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Evaluate the randomized search RandomForestClassifier model\n",
"rs_rf.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 239,
"id": "9d091892",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Logistic Regression': 0.8852459016393442,\n",
" 'KNN': 0.6885245901639344,\n",
" 'Random Forest': 0.8360655737704918}"
]
},
"execution_count": 239,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_scores"
]
},
{
"cell_type": "markdown",
"id": "762fab3f",
"metadata": {},
"source": [
"### ***Three ways to tune the model :***\n",
"#### ***1. By hand***\n",
"#### ***2. RandomizedSearchCV***\n",
"#### ***3. GridSearchCV***"
]
},
{
"cell_type": "markdown",
"id": "bee37f6c",
"metadata": {},
"source": [
"### ***Hyperparameter tuning with GridSearchCV***\n",
"\n",
"***Trying to improve LogisticRegression model with GridSearchCV***"
]
},
{
"cell_type": "code",
"execution_count": 240,
"id": "5f49d817",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fitting 5 folds for each of 30 candidates, totalling 150 fits\n"
]
}
],
"source": [
"# Different hyperparameters for our LogisticRegression model\n",
"log_reg_grid = {\"C\" : np.logspace(-4, 4, 30),\n",
" \"solver\" : [\"liblinear\"]}\n",
"\n",
"# Setup grid hyperparameter search for LogisticRegression\n",
"gs_log_reg = GridSearchCV(LogisticRegression(),\n",
" param_grid = log_reg_grid,\n",
" cv = 5,\n",
" verbose = True)\n",
"\n",
"# Fit grid parameter search model\n",
"gs_log_reg.fit(X_train, y_train);"
]
},
{
"cell_type": "code",
"execution_count": 241,
"id": "378cabaf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'C': 0.20433597178569418, 'solver': 'liblinear'}"
]
},
"execution_count": 241,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the best hyperparameters\n",
"gs_log_reg.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 242,
"id": "36a44d35",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8852459016393442"
]
},
"execution_count": 242,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Evaluate the grid search LogisticRegression model\n",
"gs_log_reg.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 243,
"id": "e2193fd5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Logistic Regression': 0.8852459016393442,\n",
" 'KNN': 0.6885245901639344,\n",
" 'Random Forest': 0.8360655737704918}"
]
},
"execution_count": 243,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_scores"
]
},
{
"cell_type": "markdown",
"id": "76937b8f",
"metadata": {},
"source": [
"### ***Evaluating our tunened machine learning classifier, beyond accuracy (using cross-validation)***\n",
"\n",
"* ROC curve and AUC score\n",
"* Confusion matrix\n",
"* Classification report\n",
"* Precision\n",
"* Recall\n",
"* F1-score\n",
"\n",
"***To make comparisons and evaluate our trained model, first we need to make predictions***"
]
},
{
"cell_type": "code",
"execution_count": 244,
"id": "c6764ca3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0,\n",
" 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0], dtype=int64)"
]
},
"execution_count": 244,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Make predictions with tune models\n",
"y_preds = gs_log_reg.predict(X_test)\n",
"y_preds"
]
},
{
"cell_type": "code",
"execution_count": 245,
"id": "98b3d249",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"179 0\n",
"228 0\n",
"111 1\n",
"246 0\n",
"60 1\n",
" ..\n",
"249 0\n",
"104 1\n",
"300 0\n",
"193 0\n",
"184 0\n",
"Name: target, Length: 61, dtype: int64"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_test"
]
},
{
"cell_type": "markdown",
"id": "9ec9e6b5",
"metadata": {},
"source": [
"### ***ROC Curve and AUC Scores***\n",
"\n",
"***What's a ROC curve?***\n",
"\n",
"* It's a way of understanding how your model is performing by comparing the true positive rate to the false positive rate.\n",
"\n",
"In our case...\n",
"\n",
"> To get an appropriate example in a real-world problem, consider a diagnostic test that seeks to determine whether a person has a certain disease. A false positive in this case occurs when the person tests positive, but does not actually have the disease. A false negative, on the other hand, occurs when the person tests negative, suggesting they are healthy, when they actually do have the disease.\n",
"\n",
"Scikit-Learn implements a function `plot_roc_curve` which can help us create a ROC curve as well as calculate the area under the curve (AUC) metric.\n",
"\n",
"\n",
"Reading the documentation on the [`plot_roc_curve`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.plot_roc_curve.html) function we can see it takes `(estimator, X, y)` as inputs. Where `estiamator` is a fitted machine learning model and `X` and `y` are the data you'd like to test it on.\n",
"\n",
"\n",
"In our case, we'll use the GridSearchCV version of our `LogisticRegression` estimator, `gs_log_reg` as well as the test data, `X_test` and `y_test`."
]
},
{
"cell_type": "code",
"execution_count": 266,
"id": "596f5650",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\vedant\\coding stuff\\project\\heart-disease-prediction\\env\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function plot_roc_curve is deprecated; Function `plot_roc_curve` is deprecated in 1.0 and will be removed in 1.2. Use one of the class methods: RocCurveDisplay.from_predictions or RocCurveDisplay.from_estimator.\n",
" warnings.warn(msg, category=FutureWarning)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting ROC curve and calculate AUC metric\n",
"plot_roc_curve(gs_log_reg, X_test, y_test, color = 'crimson')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "2c8c7402",
"metadata": {},
"source": [
"### ***Confusion Matrix***\n",
"> A confusion matrix is a visual way to show where your model made the right predictions and where it made the wrong predictions (or in other words, got confused).\n",
"Scikit-Learn allows us to create a confusion matrix using [`confusion_matrix()`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html) and passing it the true labels and predicted labels."
]
},
{
"cell_type": "code",
"execution_count": 247,
"id": "be8aef14",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[25 4]\n",
" [ 3 29]]\n"
]
}
],
"source": [
"print(confusion_matrix(y_test, y_preds))"
]
},
{
"cell_type": "code",
"execution_count": 248,
"id": "bea3b954",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOQAAADfCAYAAADm6n/jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAdoElEQVR4nO3daVgUV/r38S80iguCYBxXQCTugiIkhBgjoLivKOozgHHDXdG4MtGYPE40Go2XyajjlcQYfUDBuEzikoUo/I2R+NcYjRuiKBJQFEGRtQXqeeHQMx3ANNjQhdyf68qLrjpV3NXpn9Wn6tRpM0VRFIQQqmBu6gKEEP8hgRRCRSSQQqiIBFIIFZFACqEiFqYuoKrk/WutqUt4bjQP3GrqEp4rD7Ovl7tOzpBCqIgEUggVkUAKoSISSCFURAIphIpIIIVQEQmkECoigRRCRSSQQqiIBFIIFZFACqEiEkghVEQCKYSKSCCFUBEJpBAqIoEUQkUkkEKoiARSCBWRQAqhIhJIIVREAimEikgghVARCaQQKiKBFEJFJJBCqIgEUggVkUAKoSISSCFURAIphIpIIIVQEQmkECoigRRCRZ7bH2xVi5/if+eTH37lcko6ZmZmuDr8hVn93XF1/IuuTeDH/+Jicnqpbfu6tGFdcJ/qLLfG69KlAzHHD7B+3RbeX/WRqcupMAlkFTp9/Taztn2LczNbZvX3oKi4mKiTl5n8z0NsmzEEF4emKIrCjbSH+HRxpK9LG73tW9hamabwGkqj0bBl61rq1q1r6lIqTQJZhT74Oo7mNg3ZOXsY9es+eauHurdj5Lov+ce3p9kaMpDUzGxytY/x7uLA4B4vmrjimu3NhTPo2Kmdqct4JtKHrCJZuQVcvZ2Bn2tbXRgBmjSqj3vbFpy7eReA63cyAWj7l8amKPO50blLexYtnsnaNZtMXcozkUBWkYb16nBg4WiCenUpte5BTj4WGjMArqc9CaTTvwOZp31cbTU+LzQaDZu3rCXm2E9E7T5g6nKeiXxlrSIac3Mcm9qUWn71dga/JqXxavvWAFxLy6ShZR3Wf/0z3567Qa72Ma3tGjF7gDsDujtXd9k10vw3p9HWuQ1/HTcdCwuNqct5JiYPZEpKCjdu3CA7Oxtzc3MaNWqEk5MTzZs3N3VpRpdb8Jhlu2MBmOjtCsD1Ow/IKXjMo3wtfx/3Oll5WiJ+vMjSiBgKi4oZ4l6z+0RVrWOndixeOptFC94lNfUODg6tTF3SMzFZIL/77js2btxIYmIiiqLorTMzM8PR0ZF58+YxYMAAE1VoXHnaQkK3f8/V2xlM8umGh3MLAEZ5dqBIURj3amdd2wHd2zJ6/T42HPpfBro5ozGXnkVZzM3N2bxlDXEnz/DF9khTl2MUJgnkgQMHWLp0KQMHDmTOnDk4OjrSsGFDFEUhJyeHpKQkvv32W+bPn8/jx48ZOnSoKco0mqy8AuZ+/j2/3kxjxEvtmTPAXbcuwKtTqfb16lgwuMeLbI0+S2LaA9q1sKvOcmuM0HkhdHXpyAC/sdg1sQWgceMn3YQG9etj18SWzIwHpf7BVzMzxQTVDho0CE9PT1asWPHUdu+88w6nT5/m4MGDFf4bef9aW9nyjCojO48Zn35DfGoGozw7sMy/J2ZmZn+6XeRPl1h94CRfzBpCN8dm1VBp+ZoHbjXp3y/PwSPh9Or1ylPbuHR+nVu3UqqpIsM8zL5e7jqTnCFTUlLo27fvn7br06cP+/fvr4aKqkZOvlYXxqBeXVg4VP/Dk/YwhxmffkN/17ZM83PTW3fz3kMAWtk1qrZ6a5plYatp3Nhab1nTv7zAp9s2sCtiP7sj9pGWds9E1VVOuYFMTU2t1A5btmz5p23s7e358ccf6dmz51PbxcTE1OiLO6sPnCQ+NYO/vlY6jADNbBqSna9l36l4Ant1warekxEmdx5k89XpBF5ybsELjRpUd9k1xq+/Xii1rOSizs2bt4iJ+am6S3pm5QbS19fXoK9Wf3T58uU/bTN9+nQWLVrE3bt36devH05OTlhZWWFmZkZ2drauD3nw4EHefffdCtegBolpDzj4yzWs6tWlQ0s7Dv1yrVSbwT1eZOlwL97c8QNvbPoaf88O5BY8ZveJy2jMzQgb8aoJKhemVG4gZ82aValAGmLIkCFoNBo2bNjAoUOHSv0dRVFo3bo1q1atYuTIkVVSQ1U7k3gbgOx8LSuijpfZZnCPF/Ht2oYNb/Tls6Pn2Hj4NJZ1NHi0bcHcgR66wQKi9jDJRZ3/lpycTGJiItnZ2SiKorsP6eDg8Ez7VctFneeBWi/q1FRGvagTHx9PTEwMqampjB8/ngYNGnD16lV69+5dqeLs7e2xt7ev1LZCPG8qFMiVK1cSERGBoiiYmZkxYMAAsrKyCA0Nxdvbm40bN2JpaVlVtQrx3DN4CMiOHTsIDw9n6tSpREVF6W62enl5MWHCBGJiYvjkk0+qrFAhagODA7l7924GDBjA/Pnz9b5iWltbs3TpUoYNG1apG/hCiP8wOJDJycm88kr5oyI8PDy4ffu2UYoSorYyOJC2trbcuXOn3PUJCQnY2JR+3EgIYTiDA+nn50dERATXrv3nBnfJ/cPY2FgiIyPx8fExfoVC1CIG34fMysoiMDCQpKQk2rVrx6VLl3B3dycnJ4crV67QqlUroqKisLNTx5MJch/SeOQ+pHE97T6kwWdIa2troqKiCAkJQavVYmlpyblz58jLy2PixIns3btXNWEUoqYy+UidqiJnSOORM6RxGXWkTkJCAjExMaSkpKDRaHBwcMDX11dG2whhBAYHsrCwkOXLl3PgwIFST2CvWbOGKVOm8Oabbxq9QCFqE4MDuXnzZvbv38/IkSMZP3687oyYmJjI559/zieffELTpk0JDg6usmKFeN4Z3If08fGhe/fubNiwocz106dPJzExke+++86oBVaW9CGNR/qQxmWUq6wZGRm89NJL5a739vYmLS2tYpUJIfQYHMhu3bpx/HjZD9oCnD9/nk6dSs+gJoQwnMFz6oSEhDB37lwWLFjA5MmTcXJywszMjJSUFKKiouRpDyGMoNw+ZMeOHcucWgN46nJD5tSpDtKHNB7pQxpXpe5DVuWcOkKIspUbyDlz5lRnHUIIKjFSJysri9zcXIqLi3XLioqKyMnJIS4ujgkTJhizPiFqFYMDmZaWxuLFizl16tRT20kghag8g297rF27llOnTjFo0CBGjBiBoihMnTqV0aNHY21tjaWlJbt27arKWoV47hkcyJMnTzJixAjWr1/PW2+9hZmZGb169WLlypUcOHCABg0a8P3331dlrUI89wwOZFZWFj169ADAysqKli1bcuHCk99WaNGiBQEBARw9erRqqhSiljA4kDY2NuTl5eleOzg4EB8fr3ttb2//1Dl3hBB/zuBA9ujRg3379vHo0SMA2rdvz88//0xBQQEAv/32G1ZWVlVTpRC1hMGBnDFjBjdu3KB3795kZmYyZswY0tLS8Pf3JyQkhKioKLy9vauwVCGefwYHsnPnzkRFRTFs2DBsbW1xdnZm06ZN5Ofnc/bsWQYOHMjixYurslYhnnsyp474UzKW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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Making our confusion matrix more visual\n",
"sns.set_theme(font_scale = 1.5)\n",
"\n",
"def plot_conf_mat(y_test, y_preds):\n",
" \"\"\"\n",
" Plots a confusion matrix using Seaborn's heatmap().\n",
" \"\"\"\n",
" fig, ax = plt.subplots(figsize=(3, 3))\n",
" ax = sns.heatmap(confusion_matrix(y_test, y_preds),\n",
" annot=True, # Annotate the boxes\n",
" cbar=False)\n",
" plt.xlabel(\"Predicted label\") # predictions go on the x-axis\n",
" plt.ylabel(\"True label\") # true labels go on the y-axis \n",
" \n",
"plot_conf_mat(y_test, y_preds)"
]
},
{
"cell_type": "markdown",
"id": "9740236f",
"metadata": {},
"source": [
"***We can see the model gets confused (predicts the wrong label) relatively the same across both classes. In essence, there are 4 occasaions where the model predicted 0 when it should've been 1 (false negative) and 3 occasions where the model predicted 1 instead of 0 (false positive).***"
]
},
{
"cell_type": "markdown",
"id": "d291030e",
"metadata": {},
"source": [
"***After getting a ROC curve, an AUC metric and a confusion matrix, now we should get a classification report as well as cross-validated precision, recall and f1-score.***"
]
},
{
"cell_type": "markdown",
"id": "82b01b30",
"metadata": {},
"source": [
"### ***Classification report***\n",
"\n",
"> We can make a classification report using [`classification_report()`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html) and passing it the true labels as well as our models predicted labels. \n",
"\n",
"> A classification report will also give us information of the precision and recall of our model for each class."
]
},
{
"cell_type": "code",
"execution_count": 249,
"id": "f75f5995",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 0.89 0.86 0.88 29\n",
" 1 0.88 0.91 0.89 32\n",
"\n",
" accuracy 0.89 61\n",
" macro avg 0.89 0.88 0.88 61\n",
"weighted avg 0.89 0.89 0.89 61\n",
"\n"
]
}
],
"source": [
"print(classification_report(y_test, y_preds))"
]
},
{
"cell_type": "markdown",
"id": "08a55444",
"metadata": {},
"source": [
"### ***Calculating evaluation metrics using cross-validation***\n",
"\n",
"> ***We'll evaluate precision, recall and f1-score of our model using cross-validation and to do so we'll be using `cross_val_score()`.***"
]
},
{
"cell_type": "code",
"execution_count": 250,
"id": "56be68a5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'C': 0.20433597178569418, 'solver': 'liblinear'}"
]
},
"execution_count": 250,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Checking best hyperparameters\n",
"gs_log_reg.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 251,
"id": "e53c1140",
"metadata": {},
"outputs": [],
"source": [
"# Creating a new classifier with best hyperparameters\n",
"clf = LogisticRegression(C = 0.20433597178569418,\n",
" solver = \"liblinear\")"
]
},
{
"cell_type": "markdown",
"id": "5ac78e70",
"metadata": {},
"source": [
"#### ***1. Cross-validated : accuracy***"
]
},
{
"cell_type": "code",
"execution_count": 252,
"id": "a6945bd8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.81967213, 0.90163934, 0.86885246, 0.88333333, 0.75 ])"
]
},
"execution_count": 252,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv_acc = cross_val_score(clf,\n",
" X,\n",
" y,\n",
" cv = 5,\n",
" scoring = \"accuracy\")\n",
"cv_acc"
]
},
{
"cell_type": "code",
"execution_count": 253,
"id": "d28eed93",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8446994535519124"
]
},
"execution_count": 253,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(cv_acc)"
]
},
{
"cell_type": "markdown",
"id": "f585b290",
"metadata": {},
"source": [
"#### ***2. Cross-validated : precision***"
]
},
{
"cell_type": "code",
"execution_count": 254,
"id": "b0e63e3f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8207936507936507"
]
},
"execution_count": 254,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv_precision = cross_val_score(clf,\n",
" X,\n",
" y,\n",
" cv = 5,\n",
" scoring = \"precision\")\n",
"\n",
"cv_precision = np.mean(cv_precision)\n",
"cv_precision"
]
},
{
"cell_type": "markdown",
"id": "a09b312d",
"metadata": {},
"source": [
"#### ***3. Cross-validated : recall***"
]
},
{
"cell_type": "code",
"execution_count": 255,
"id": "017424ac",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9212121212121213"
]
},
"execution_count": 255,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv_recall = cross_val_score(clf,\n",
" X,\n",
" y,\n",
" cv = 5,\n",
" scoring = \"recall\")\n",
"\n",
"cv_recall = np.mean(cv_recall)\n",
"cv_recall"
]
},
{
"cell_type": "markdown",
"id": "79c7d790",
"metadata": {},
"source": [
"#### ***4. Cross-validated : f1-score***"
]
},
{
"cell_type": "code",
"execution_count": 256,
"id": "d4acd737",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8673007976269721"
]
},
"execution_count": 256,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv_f1 = cross_val_score(clf, \n",
" X, \n",
" y, \n",
" cv = 5, \n",
" scoring = \"f1\")\n",
"\n",
"cv_f1 = np.mean(cv_f1)\n",
"cv_f1"
]
},
{
"cell_type": "code",
"execution_count": 257,
"id": "c28a6b5a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Creating visualisation for cross-validated metrics\n",
"cv_metrics = pd.DataFrame({\"Accuracy\": cv_acc,\n",
" \"Precision\": cv_precision,\n",
" \"Recall\": cv_recall,\n",
" \"F1\": cv_f1})\n",
"\n",
"cv_metrics[:1].T.plot.bar(title = \"Cross-Validated Metrics\", legend = False, color ='crimson');\n",
"plt.xticks(rotation = 0)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "2b470859",
"metadata": {},
"source": [
"### ***Feature Importance***\n",
"\n",
"***Feature importance is used to find which features contributed most to the outcomes of the model and how did they contribute?***\n",
"\n",
"***Remember : Finding feature importance is different for each machine learning model.***\n",
"\n",
"> Feature importance is another way of asking, \"which features contributing most to the outcomes of the model?\"\n",
"\n",
"> Or for our problem, trying to predict heart disease using a patient's medical characterisitcs, which charateristics contribute most to a model predicting whether someone has heart disease or not?\n",
"\n",
"> Unlike some of the other functions we've seen, because how each model finds patterns in data is slightly different, how a model judges how important those patterns are is different as well. This means for each model, there's a slightly different way of finding which features were most important.\n",
"\n",
"> You can usually find an example via the Scikit-Learn documentation or via searching for something like \"[MODEL TYPE] feature importance\", such as, \"random forest feature importance\"."
]
},
{
"cell_type": "code",
"execution_count": 258,
"id": "202fe34d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"