MII/lec4_1.ipynb
2024-11-15 23:06:57 +04:00

2491 lines
220 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Загрузка набора данных"
]
},
{
"cell_type": "code",
"execution_count": 1,
"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>gender</th>\n",
" <th>age</th>\n",
" <th>hypertension</th>\n",
" <th>heart_disease</th>\n",
" <th>ever_married</th>\n",
" <th>work_type</th>\n",
" <th>Residence_type</th>\n",
" <th>avg_glucose_level</th>\n",
" <th>bmi</th>\n",
" <th>smoking_status</th>\n",
" <th>stroke</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>9046</th>\n",
" <td>Male</td>\n",
" <td>67.0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>228.69</td>\n",
" <td>36.6</td>\n",
" <td>formerly smoked</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51676</th>\n",
" <td>Female</td>\n",
" <td>61.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Rural</td>\n",
" <td>202.21</td>\n",
" <td>NaN</td>\n",
" <td>never smoked</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31112</th>\n",
" <td>Male</td>\n",
" <td>80.0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>105.92</td>\n",
" <td>32.5</td>\n",
" <td>never smoked</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60182</th>\n",
" <td>Female</td>\n",
" <td>49.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>171.23</td>\n",
" <td>34.4</td>\n",
" <td>smokes</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1665</th>\n",
" <td>Female</td>\n",
" <td>79.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Rural</td>\n",
" <td>174.12</td>\n",
" <td>24.0</td>\n",
" <td>never smoked</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",
" </tr>\n",
" <tr>\n",
" <th>18234</th>\n",
" <td>Female</td>\n",
" <td>80.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>83.75</td>\n",
" <td>NaN</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44873</th>\n",
" <td>Female</td>\n",
" <td>81.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Urban</td>\n",
" <td>125.20</td>\n",
" <td>40.0</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19723</th>\n",
" <td>Female</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Rural</td>\n",
" <td>82.99</td>\n",
" <td>30.6</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37544</th>\n",
" <td>Male</td>\n",
" <td>51.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>166.29</td>\n",
" <td>25.6</td>\n",
" <td>formerly smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44679</th>\n",
" <td>Female</td>\n",
" <td>44.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Govt_job</td>\n",
" <td>Urban</td>\n",
" <td>85.28</td>\n",
" <td>26.2</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5110 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" gender age hypertension heart_disease ever_married work_type \\\n",
"id \n",
"9046 Male 67.0 0 1 Yes Private \n",
"51676 Female 61.0 0 0 Yes Self-employed \n",
"31112 Male 80.0 0 1 Yes Private \n",
"60182 Female 49.0 0 0 Yes Private \n",
"1665 Female 79.0 1 0 Yes Self-employed \n",
"... ... ... ... ... ... ... \n",
"18234 Female 80.0 1 0 Yes Private \n",
"44873 Female 81.0 0 0 Yes Self-employed \n",
"19723 Female 35.0 0 0 Yes Self-employed \n",
"37544 Male 51.0 0 0 Yes Private \n",
"44679 Female 44.0 0 0 Yes Govt_job \n",
"\n",
" Residence_type avg_glucose_level bmi smoking_status stroke \n",
"id \n",
"9046 Urban 228.69 36.6 formerly smoked 1 \n",
"51676 Rural 202.21 NaN never smoked 1 \n",
"31112 Rural 105.92 32.5 never smoked 1 \n",
"60182 Urban 171.23 34.4 smokes 1 \n",
"1665 Rural 174.12 24.0 never smoked 1 \n",
"... ... ... ... ... ... \n",
"18234 Urban 83.75 NaN never smoked 0 \n",
"44873 Urban 125.20 40.0 never smoked 0 \n",
"19723 Rural 82.99 30.6 never smoked 0 \n",
"37544 Rural 166.29 25.6 formerly smoked 0 \n",
"44679 Urban 85.28 26.2 Unknown 0 \n",
"\n",
"[5110 rows x 11 columns]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"from sklearn import set_config\n",
"\n",
"set_config(transform_output=\"pandas\")\n",
"\n",
"random_state=9\n",
"\n",
"df = pd.read_csv(\"data/healthcare.csv\", index_col=\"id\")\n",
"\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Разделение набора данных на обучающую и тестовые выборки (80/20) для задачи классификации\n",
"\n",
"Целевой признак -- heart_disease - есть ли заболевания сердца\n",
". x - полная выборка, y - gear box столбец\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'X_train'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>gender</th>\n",
" <th>age</th>\n",
" <th>hypertension</th>\n",
" <th>heart_disease</th>\n",
" <th>ever_married</th>\n",
" <th>work_type</th>\n",
" <th>Residence_type</th>\n",
" <th>avg_glucose_level</th>\n",
" <th>bmi</th>\n",
" <th>smoking_status</th>\n",
" <th>stroke</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>17762</th>\n",
" <td>Female</td>\n",
" <td>3.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>children</td>\n",
" <td>Rural</td>\n",
" <td>114.88</td>\n",
" <td>19.1</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48652</th>\n",
" <td>Female</td>\n",
" <td>8.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>children</td>\n",
" <td>Urban</td>\n",
" <td>83.55</td>\n",
" <td>22.4</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6903</th>\n",
" <td>Female</td>\n",
" <td>15.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>children</td>\n",
" <td>Rural</td>\n",
" <td>77.57</td>\n",
" <td>18.3</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2903</th>\n",
" <td>Female</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>123.83</td>\n",
" <td>23.8</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58153</th>\n",
" <td>Female</td>\n",
" <td>18.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>123.66</td>\n",
" <td>22.2</td>\n",
" <td>never smoked</td>\n",
" <td>0</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",
" </tr>\n",
" <tr>\n",
" <th>34084</th>\n",
" <td>Male</td>\n",
" <td>7.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>children</td>\n",
" <td>Urban</td>\n",
" <td>77.12</td>\n",
" <td>18.6</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11176</th>\n",
" <td>Male</td>\n",
" <td>9.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>children</td>\n",
" <td>Rural</td>\n",
" <td>85.02</td>\n",
" <td>16.3</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52554</th>\n",
" <td>Male</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>64.92</td>\n",
" <td>22.5</td>\n",
" <td>Unknown</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10381</th>\n",
" <td>Female</td>\n",
" <td>38.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Urban</td>\n",
" <td>91.00</td>\n",
" <td>33.3</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70884</th>\n",
" <td>Female</td>\n",
" <td>34.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>79.80</td>\n",
" <td>37.4</td>\n",
" <td>smokes</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4088 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" gender age hypertension heart_disease ever_married work_type \\\n",
"id \n",
"17762 Female 3.0 0 0 No children \n",
"48652 Female 8.0 0 0 No children \n",
"6903 Female 15.0 0 0 No children \n",
"2903 Female 35.0 0 0 No Private \n",
"58153 Female 18.0 0 0 No Private \n",
"... ... ... ... ... ... ... \n",
"34084 Male 7.0 0 0 No children \n",
"11176 Male 9.0 0 0 No children \n",
"52554 Male 19.0 0 0 No Private \n",
"10381 Female 38.0 1 0 Yes Self-employed \n",
"70884 Female 34.0 0 0 Yes Private \n",
"\n",
" Residence_type avg_glucose_level bmi smoking_status stroke \n",
"id \n",
"17762 Rural 114.88 19.1 Unknown 0 \n",
"48652 Urban 83.55 22.4 Unknown 0 \n",
"6903 Rural 77.57 18.3 Unknown 0 \n",
"2903 Rural 123.83 23.8 never smoked 0 \n",
"58153 Urban 123.66 22.2 never smoked 0 \n",
"... ... ... ... ... ... \n",
"34084 Urban 77.12 18.6 Unknown 0 \n",
"11176 Rural 85.02 16.3 Unknown 0 \n",
"52554 Rural 64.92 22.5 Unknown 0 \n",
"10381 Urban 91.00 33.3 never smoked 0 \n",
"70884 Urban 79.80 37.4 smokes 0 \n",
"\n",
"[4088 rows x 11 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'y_train'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>heart_disease</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>17762</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48652</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6903</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2903</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58153</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34084</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11176</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52554</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10381</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70884</th>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4088 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
" heart_disease\n",
"id \n",
"17762 0\n",
"48652 0\n",
"6903 0\n",
"2903 0\n",
"58153 0\n",
"... ...\n",
"34084 0\n",
"11176 0\n",
"52554 0\n",
"10381 0\n",
"70884 0\n",
"\n",
"[4088 rows x 1 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'X_test'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>gender</th>\n",
" <th>age</th>\n",
" <th>hypertension</th>\n",
" <th>heart_disease</th>\n",
" <th>ever_married</th>\n",
" <th>work_type</th>\n",
" <th>Residence_type</th>\n",
" <th>avg_glucose_level</th>\n",
" <th>bmi</th>\n",
" <th>smoking_status</th>\n",
" <th>stroke</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2520</th>\n",
" <td>Female</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>84.90</td>\n",
" <td>26.2</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56855</th>\n",
" <td>Male</td>\n",
" <td>46.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>137.77</td>\n",
" <td>29.3</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27034</th>\n",
" <td>Female</td>\n",
" <td>65.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Govt_job</td>\n",
" <td>Urban</td>\n",
" <td>82.72</td>\n",
" <td>29.8</td>\n",
" <td>smokes</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>641</th>\n",
" <td>Male</td>\n",
" <td>52.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Govt_job</td>\n",
" <td>Rural</td>\n",
" <td>87.26</td>\n",
" <td>40.1</td>\n",
" <td>smokes</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65407</th>\n",
" <td>Female</td>\n",
" <td>64.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Rural</td>\n",
" <td>65.46</td>\n",
" <td>32.5</td>\n",
" <td>formerly smoked</td>\n",
" <td>0</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",
" </tr>\n",
" <tr>\n",
" <th>40447</th>\n",
" <td>Female</td>\n",
" <td>59.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Private</td>\n",
" <td>Rural</td>\n",
" <td>82.42</td>\n",
" <td>28.8</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56324</th>\n",
" <td>Female</td>\n",
" <td>53.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Rural</td>\n",
" <td>81.76</td>\n",
" <td>34.3</td>\n",
" <td>formerly smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4813</th>\n",
" <td>Male</td>\n",
" <td>27.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>Private</td>\n",
" <td>Urban</td>\n",
" <td>112.98</td>\n",
" <td>44.7</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14372</th>\n",
" <td>Male</td>\n",
" <td>50.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Self-employed</td>\n",
" <td>Urban</td>\n",
" <td>192.16</td>\n",
" <td>43.6</td>\n",
" <td>never smoked</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50522</th>\n",
" <td>Female</td>\n",
" <td>72.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>Govt_job</td>\n",
" <td>Urban</td>\n",
" <td>131.41</td>\n",
" <td>28.4</td>\n",
" <td>never smoked</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1022 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" gender age hypertension heart_disease ever_married work_type \\\n",
"id \n",
"2520 Female 26.0 0 0 Yes Private \n",
"56855 Male 46.0 0 0 Yes Private \n",
"27034 Female 65.0 0 0 Yes Govt_job \n",
"641 Male 52.0 0 0 Yes Govt_job \n",
"65407 Female 64.0 0 0 Yes Self-employed \n",
"... ... ... ... ... ... ... \n",
"40447 Female 59.0 0 0 Yes Private \n",
"56324 Female 53.0 0 0 Yes Self-employed \n",
"4813 Male 27.0 0 0 No Private \n",
"14372 Male 50.0 0 0 Yes Self-employed \n",
"50522 Female 72.0 0 0 Yes Govt_job \n",
"\n",
" Residence_type avg_glucose_level bmi smoking_status stroke \n",
"id \n",
"2520 Rural 84.90 26.2 never smoked 0 \n",
"56855 Urban 137.77 29.3 never smoked 0 \n",
"27034 Urban 82.72 29.8 smokes 0 \n",
"641 Rural 87.26 40.1 smokes 0 \n",
"65407 Rural 65.46 32.5 formerly smoked 0 \n",
"... ... ... ... ... ... \n",
"40447 Rural 82.42 28.8 never smoked 0 \n",
"56324 Rural 81.76 34.3 formerly smoked 0 \n",
"4813 Urban 112.98 44.7 never smoked 0 \n",
"14372 Urban 192.16 43.6 never smoked 0 \n",
"50522 Urban 131.41 28.4 never smoked 1 \n",
"\n",
"[1022 rows x 11 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'y_test'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>heart_disease</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2520</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56855</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27034</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>641</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65407</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40447</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56324</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4813</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14372</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50522</th>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1022 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
" heart_disease\n",
"id \n",
"2520 0\n",
"56855 0\n",
"27034 0\n",
"641 0\n",
"65407 0\n",
"... ...\n",
"40447 0\n",
"56324 0\n",
"4813 0\n",
"14372 0\n",
"50522 0\n",
"\n",
"[1022 rows x 1 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from utils import split_stratified_into_train_val_test\n",
"\n",
"X_train, X_val, X_test, y_train, y_val, y_test = split_stratified_into_train_val_test(\n",
" df, stratify_colname=\"heart_disease\", frac_train=0.80, frac_val=0, frac_test=0.20, random_state=random_state\n",
")\n",
"\n",
"display(\"X_train\", X_train)\n",
"display(\"y_train\", y_train)\n",
"\n",
"display(\"X_test\", X_test)\n",
"display(\"y_test\", y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В итоге, этот код выполняет следующие действия:\n",
"\n",
"* Заполняет пропущенные значения: В числовых столбцах медианой, в категориальных - значением \"unknown\".\n",
"* Стандартизирует числовые данные: приводит их к нулевому среднему и единичному стандартному отклонению.\n",
"* Преобразует категориальные данные: использует one-hot-кодирование.\n",
"* Удаляет ненужные столбцы: из списка `columns_to_drop`.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Формирование конвейера для классификации данных\n",
"\n",
"preprocessing_num -- конвейер для обработки числовых данных: заполнение пропущенных значений и стандартизация\n",
"\n",
"preprocessing_cat -- конвейер для обработки категориальных данных: заполнение пропущенных данных и унитарное кодирование\n",
"\n",
"features_preprocessing -- трансформер для предобработки признаков\n",
"\n",
"features_engineering -- трансформер для конструирования признаков\n",
"\n",
"drop_columns -- трансформер для удаления колонок\n",
"\n",
"features_postprocessing -- трансформер для унитарного кодирования новых признаков\n",
"\n",
"pipeline_end -- основной конвейер предобработки данных и конструирования признаков\n",
"\n",
"Конвейер выполняется последовательно.\n",
"\n",
"Трансформер выполняет параллельно для указанного набора колонок.\n",
"\n",
"Документация: \n",
"\n",
"https://scikit-learn.org/1.5/api/sklearn.pipeline.html\n",
"\n",
"https://scikit-learn.org/1.5/modules/generated/sklearn.compose.ColumnTransformer.html#sklearn.compose.ColumnTransformer"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.discriminant_analysis import StandardScaler\n",
"from sklearn.impute import SimpleImputer\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"from transformers import TitanicFeatures\n",
"\n",
"\n",
"columns_to_drop = []\n",
"#columns_to_drop = [\"Doors\", \"Color\", \"Gear box type\", \"Prod_year\", \"Mileage\", \"Airbags\", \"Levy\", \"Leather_interior\", \"Fuel type\", \"Drive wheels\"]\n",
"num_columns = [\n",
" column\n",
" for column in df.columns\n",
" if column not in columns_to_drop and df[column].dtype != \"object\"\n",
"]\n",
"cat_columns = [\n",
" column\n",
" for column in df.columns\n",
" if column not in columns_to_drop and df[column].dtype == \"object\"\n",
"]\n",
"\n",
"num_imputer = SimpleImputer(strategy=\"median\")\n",
"num_scaler = StandardScaler()\n",
"preprocessing_num = Pipeline(\n",
" [\n",
" (\"imputer\", num_imputer),\n",
" (\"scaler\", num_scaler),\n",
" ]\n",
")\n",
"\n",
"cat_imputer = SimpleImputer(strategy=\"constant\", fill_value=\"unknown\")\n",
"cat_encoder = OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False, drop=\"first\")\n",
"preprocessing_cat = Pipeline(\n",
" [\n",
" (\"imputer\", cat_imputer),\n",
" (\"encoder\", cat_encoder),\n",
" ]\n",
")\n",
"\n",
"features_preprocessing = ColumnTransformer(\n",
" verbose_feature_names_out=False,\n",
" transformers=[\n",
" (\"prepocessing_num\", preprocessing_num, num_columns),\n",
" (\"prepocessing_cat\", preprocessing_cat, cat_columns),\n",
" #(\"prepocessing_features\", cat_imputer, [\"Name\", \"Cabin\"]),\n",
" ],\n",
" remainder=\"passthrough\"\n",
")\n",
"\n",
"# features_engineering = ColumnTransformer(\n",
"# verbose_feature_names_out=False,\n",
"# transformers=[\n",
"# (\"add_features\", TitanicFeatures(), [\"Name\", \"Cabin\"]),\n",
"# ],\n",
"# remainder=\"passthrough\",\n",
"# )\n",
"\n",
"drop_columns = ColumnTransformer(\n",
" verbose_feature_names_out=False,\n",
" transformers=[\n",
" (\"drop_columns\", \"drop\", columns_to_drop),\n",
" ],\n",
" remainder=\"passthrough\",\n",
")\n",
"\n",
"# features_postprocessing = ColumnTransformer(\n",
"# verbose_feature_names_out=False,\n",
"# transformers=[\n",
"# (\"prepocessing_cat\", preprocessing_cat, [\"Cabin_type\"]),\n",
"# ],\n",
"# remainder=\"passthrough\",\n",
"# )\n",
"\n",
"pipeline_end = Pipeline(\n",
" [\n",
" (\"features_preprocessing\", features_preprocessing),\n",
" # (\"features_engineering\", features_engineering),\n",
" (\"drop_columns\", drop_columns),\n",
" # (\"features_postprocessing\", features_postprocessing),\n",
" ]\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Демонстрация работы конвейера для предобработки данных при классификации"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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>age</th>\n",
" <th>hypertension</th>\n",
" <th>heart_disease</th>\n",
" <th>avg_glucose_level</th>\n",
" <th>bmi</th>\n",
" <th>stroke</th>\n",
" <th>gender_Male</th>\n",
" <th>ever_married_Yes</th>\n",
" <th>work_type_Never_worked</th>\n",
" <th>work_type_Private</th>\n",
" <th>work_type_Self-employed</th>\n",
" <th>work_type_children</th>\n",
" <th>Residence_type_Urban</th>\n",
" <th>smoking_status_formerly smoked</th>\n",
" <th>smoking_status_never smoked</th>\n",
" <th>smoking_status_smokes</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>17762</th>\n",
" <td>-1.767059</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>0.202705</td>\n",
" <td>-1.260486</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48652</th>\n",
" <td>-1.546212</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.493692</td>\n",
" <td>-0.834786</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6903</th>\n",
" <td>-1.237027</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.626614</td>\n",
" <td>-1.363686</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2903</th>\n",
" <td>-0.353640</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>0.401643</td>\n",
" <td>-0.654186</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58153</th>\n",
" <td>-1.104519</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>0.397865</td>\n",
" <td>-0.860586</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</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",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34084</th>\n",
" <td>-1.590381</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.636617</td>\n",
" <td>-1.324986</td>\n",
" <td>-0.221387</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11176</th>\n",
" <td>-1.502043</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.461017</td>\n",
" <td>-1.621686</td>\n",
" <td>-0.221387</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52554</th>\n",
" <td>-1.060349</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.907796</td>\n",
" <td>-0.821886</td>\n",
" <td>-0.221387</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10381</th>\n",
" <td>-0.221132</td>\n",
" <td>3.019737</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.328095</td>\n",
" <td>0.571314</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70884</th>\n",
" <td>-0.397810</td>\n",
" <td>-0.331155</td>\n",
" <td>-0.239061</td>\n",
" <td>-0.577046</td>\n",
" <td>1.100214</td>\n",
" <td>-0.221387</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>4088 rows × 16 columns</p>\n",
"</div>"
],
"text/plain": [
" age hypertension heart_disease avg_glucose_level bmi \\\n",
"id \n",
"17762 -1.767059 -0.331155 -0.239061 0.202705 -1.260486 \n",
"48652 -1.546212 -0.331155 -0.239061 -0.493692 -0.834786 \n",
"6903 -1.237027 -0.331155 -0.239061 -0.626614 -1.363686 \n",
"2903 -0.353640 -0.331155 -0.239061 0.401643 -0.654186 \n",
"58153 -1.104519 -0.331155 -0.239061 0.397865 -0.860586 \n",
"... ... ... ... ... ... \n",
"34084 -1.590381 -0.331155 -0.239061 -0.636617 -1.324986 \n",
"11176 -1.502043 -0.331155 -0.239061 -0.461017 -1.621686 \n",
"52554 -1.060349 -0.331155 -0.239061 -0.907796 -0.821886 \n",
"10381 -0.221132 3.019737 -0.239061 -0.328095 0.571314 \n",
"70884 -0.397810 -0.331155 -0.239061 -0.577046 1.100214 \n",
"\n",
" stroke gender_Male ever_married_Yes work_type_Never_worked \\\n",
"id \n",
"17762 -0.221387 0.0 0.0 0.0 \n",
"48652 -0.221387 0.0 0.0 0.0 \n",
"6903 -0.221387 0.0 0.0 0.0 \n",
"2903 -0.221387 0.0 0.0 0.0 \n",
"58153 -0.221387 0.0 0.0 0.0 \n",
"... ... ... ... ... \n",
"34084 -0.221387 1.0 0.0 0.0 \n",
"11176 -0.221387 1.0 0.0 0.0 \n",
"52554 -0.221387 1.0 0.0 0.0 \n",
"10381 -0.221387 0.0 1.0 0.0 \n",
"70884 -0.221387 0.0 1.0 0.0 \n",
"\n",
" work_type_Private work_type_Self-employed work_type_children \\\n",
"id \n",
"17762 0.0 0.0 1.0 \n",
"48652 0.0 0.0 1.0 \n",
"6903 0.0 0.0 1.0 \n",
"2903 1.0 0.0 0.0 \n",
"58153 1.0 0.0 0.0 \n",
"... ... ... ... \n",
"34084 0.0 0.0 1.0 \n",
"11176 0.0 0.0 1.0 \n",
"52554 1.0 0.0 0.0 \n",
"10381 0.0 1.0 0.0 \n",
"70884 1.0 0.0 0.0 \n",
"\n",
" Residence_type_Urban smoking_status_formerly smoked \\\n",
"id \n",
"17762 0.0 0.0 \n",
"48652 1.0 0.0 \n",
"6903 0.0 0.0 \n",
"2903 0.0 0.0 \n",
"58153 1.0 0.0 \n",
"... ... ... \n",
"34084 1.0 0.0 \n",
"11176 0.0 0.0 \n",
"52554 0.0 0.0 \n",
"10381 1.0 0.0 \n",
"70884 1.0 0.0 \n",
"\n",
" smoking_status_never smoked smoking_status_smokes \n",
"id \n",
"17762 0.0 0.0 \n",
"48652 0.0 0.0 \n",
"6903 0.0 0.0 \n",
"2903 1.0 0.0 \n",
"58153 1.0 0.0 \n",
"... ... ... \n",
"34084 0.0 0.0 \n",
"11176 0.0 0.0 \n",
"52554 0.0 0.0 \n",
"10381 1.0 0.0 \n",
"70884 0.0 1.0 \n",
"\n",
"[4088 rows x 16 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preprocessing_result = pipeline_end.fit_transform(X_train)\n",
"preprocessed_df = pd.DataFrame(\n",
" preprocessing_result,\n",
" columns=pipeline_end.get_feature_names_out(),\n",
")\n",
"\n",
"preprocessed_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Формирование набора моделей для классификации\n",
"\n",
"logistic -- логистическая регрессия\n",
"\n",
"ridge -- гребневая регрессия\n",
"\n",
"decision_tree -- дерево решений\n",
"\n",
"knn -- k-ближайших соседей\n",
"\n",
"naive_bayes -- наивный Байесовский классификатор\n",
"\n",
"gradient_boosting -- метод градиентного бустинга (набор деревьев решений)\n",
"\n",
"random_forest -- метод случайного леса (набор деревьев решений)\n",
"\n",
"mlp -- многослойный персептрон (нейронная сеть)\n",
"\n",
"Документация: https://scikit-learn.org/1.5/supervised_learning.html"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from sklearn import ensemble, linear_model, naive_bayes, neighbors, neural_network, tree\n",
"\n",
"class_models = {\n",
" \"logistic\": {\"model\": linear_model.LogisticRegression()},\n",
" # \"ridge\": {\"model\": linear_model.RidgeClassifierCV(cv=5, class_weight=\"balanced\")},\n",
" \"ridge\": {\"model\": linear_model.LogisticRegression(penalty=\"l2\", class_weight=\"balanced\")},\n",
" \"decision_tree\": {\n",
" \"model\": tree.DecisionTreeClassifier(max_depth=7, random_state=random_state)\n",
" },\n",
" \"knn\": {\"model\": neighbors.KNeighborsClassifier(n_neighbors=7)},\n",
" \"naive_bayes\": {\"model\": naive_bayes.GaussianNB()},\n",
" \"gradient_boosting\": {\n",
" \"model\": ensemble.GradientBoostingClassifier(n_estimators=210)\n",
" },\n",
" \"random_forest\": {\n",
" \"model\": ensemble.RandomForestClassifier(\n",
" max_depth=11, class_weight=\"balanced\", random_state=random_state\n",
" )\n",
" },\n",
" \"mlp\": {\n",
" \"model\": neural_network.MLPClassifier(\n",
" hidden_layer_sizes=(7,),\n",
" max_iter=100000,\n",
" early_stopping=True,\n",
" random_state=random_state,\n",
" )\n",
" },\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" heart_disease\n",
"id \n",
"17762 0\n",
"48652 0\n",
"6903 0\n",
"2903 0\n",
"58153 0\n",
" heart_disease\n",
"id \n",
"2520 0\n",
"56855 0\n",
"27034 0\n",
"641 0\n",
"65407 0\n"
]
}
],
"source": [
"# print(y_train.dtypes)\n",
"# print(y_test.dtypes)\n",
"# df.info()\n",
"print(y_train.head())\n",
"print(y_test.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Обучение моделей на обучающем наборе данных и оценка на тестовом"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: logistic\n",
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: ridge\n",
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: decision_tree\n",
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: knn\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n",
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n",
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n",
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n",
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: naive_bayes\n",
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: gradient_boosting\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: random_forest\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n",
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n",
"Model: mlp\n",
"[0 0 0 ... 0 0 0]\n",
"[0 0 0 ... 0 0 0]\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn import metrics\n",
"\n",
"for model_name in class_models.keys():\n",
" print(f\"Model: {model_name}\")\n",
" model = class_models[model_name][\"model\"]\n",
"\n",
" model_pipeline = Pipeline([(\"pipeline\", pipeline_end), (\"model\", model)])\n",
" model_pipeline = model_pipeline.fit(X_train, y_train.values.ravel())\n",
"\n",
" y_train_predict = model_pipeline.predict(X_train)\n",
" y_test_probs = model_pipeline.predict_proba(X_test)[:, 1]\n",
" y_test_predict = np.where(y_test_probs > 0.5, 1, 0)\n",
"\n",
" class_models[model_name][\"pipeline\"] = model_pipeline\n",
" class_models[model_name][\"probs\"] = y_test_probs\n",
" class_models[model_name][\"preds\"] = y_test_predict\n",
"\n",
" print(y_train_predict)\n",
" print(y_test_predict)\n",
" class_models[model_name][\"Precision_train\"] = metrics.precision_score(\n",
" y_train, y_train_predict, \n",
" )\n",
" class_models[model_name][\"Precision_test\"] = metrics.precision_score(\n",
" y_test, y_test_predict, \n",
" )\n",
" class_models[model_name][\"Recall_train\"] = metrics.recall_score(\n",
" y_train, y_train_predict, \n",
" )\n",
" class_models[model_name][\"Recall_test\"] = metrics.recall_score(\n",
" y_test, y_test_predict\n",
" )\n",
" class_models[model_name][\"Accuracy_train\"] = metrics.accuracy_score(\n",
" y_train, y_train_predict\n",
" )\n",
" class_models[model_name][\"Accuracy_test\"] = metrics.accuracy_score(\n",
" y_test, y_test_predict\n",
" )\n",
" class_models[model_name][\"ROC_AUC_test\"] = metrics.roc_auc_score(\n",
" y_test, y_test_probs\n",
" )\n",
" class_models[model_name][\"F1_train\"] = metrics.f1_score(y_train, y_train_predict)\n",
" class_models[model_name][\"F1_test\"] = metrics.f1_score(y_test, y_test_predict)\n",
" class_models[model_name][\"MCC_test\"] = metrics.matthews_corrcoef(\n",
" y_test, y_test_predict\n",
" )\n",
" class_models[model_name][\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(\n",
" y_test, y_test_predict\n",
" )\n",
" class_models[model_name][\"Confusion_matrix\"] = metrics.confusion_matrix(\n",
" y_test, y_test_predict\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Сводная таблица оценок качества для использованных моделей классификации\n",
"\n",
"Документация: https://scikit-learn.org/1.5/modules/model_evaluation.html"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Матрица неточностей"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 1200x1000 with 16 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import ConfusionMatrixDisplay\n",
"import matplotlib.pyplot as plt\n",
"\n",
"_, ax = plt.subplots(int(len(class_models) / 2), 2, figsize=(12, 10), sharex=False, sharey=False)\n",
"for index, key in enumerate(class_models.keys()):\n",
" c_matrix = class_models[key][\"Confusion_matrix\"]\n",
" disp = ConfusionMatrixDisplay(\n",
" confusion_matrix=c_matrix, display_labels=[\"bad heart\", \"nice heart\"]\n",
" ).plot(ax=ax.flat[index])\n",
" disp.ax_.set_title(key)\n",
"\n",
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.1)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Точность, полнота, верность (аккуратность), F-мера"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"#T_4edf2_row0_col0, #T_4edf2_row0_col1, #T_4edf2_row0_col2, #T_4edf2_row0_col3, #T_4edf2_row1_col0, #T_4edf2_row1_col1, #T_4edf2_row1_col2, #T_4edf2_row1_col3, #T_4edf2_row2_col0, #T_4edf2_row2_col1, #T_4edf2_row2_col2, #T_4edf2_row2_col3, #T_4edf2_row3_col0, #T_4edf2_row3_col1, #T_4edf2_row3_col2, #T_4edf2_row3_col3, #T_4edf2_row4_col0, #T_4edf2_row4_col1, #T_4edf2_row4_col2, #T_4edf2_row4_col3, #T_4edf2_row5_col0, #T_4edf2_row5_col1, #T_4edf2_row5_col2, #T_4edf2_row5_col3, #T_4edf2_row6_col0, #T_4edf2_row6_col1, #T_4edf2_row6_col2, #T_4edf2_row6_col3, #T_4edf2_row7_col0, #T_4edf2_row7_col1, #T_4edf2_row7_col2, #T_4edf2_row7_col3 {\n",
" background-color: #440154;\n",
" color: #f1f1f1;\n",
"}\n",
"#T_4edf2_row0_col4, #T_4edf2_row0_col5, #T_4edf2_row0_col6, #T_4edf2_row0_col7, #T_4edf2_row1_col4, #T_4edf2_row1_col5, #T_4edf2_row1_col6, #T_4edf2_row1_col7, #T_4edf2_row2_col4, #T_4edf2_row2_col5, #T_4edf2_row2_col6, #T_4edf2_row2_col7, #T_4edf2_row3_col4, #T_4edf2_row3_col5, #T_4edf2_row3_col6, #T_4edf2_row3_col7, #T_4edf2_row4_col4, #T_4edf2_row4_col5, #T_4edf2_row4_col6, #T_4edf2_row4_col7, #T_4edf2_row5_col4, #T_4edf2_row5_col5, #T_4edf2_row5_col6, #T_4edf2_row5_col7, #T_4edf2_row6_col4, #T_4edf2_row6_col5, #T_4edf2_row6_col6, #T_4edf2_row6_col7, #T_4edf2_row7_col4, #T_4edf2_row7_col5, #T_4edf2_row7_col6, #T_4edf2_row7_col7 {\n",
" background-color: #0d0887;\n",
" color: #f1f1f1;\n",
"}\n",
"</style>\n",
"<table id=\"T_4edf2\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_4edf2_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
" <th id=\"T_4edf2_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
" <th id=\"T_4edf2_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
" <th id=\"T_4edf2_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
" <th id=\"T_4edf2_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
" <th id=\"T_4edf2_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
" <th id=\"T_4edf2_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
" <th id=\"T_4edf2_level0_col7\" class=\"col_heading level0 col7\" >F1_test</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
" <td id=\"T_4edf2_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col6\" class=\"data row0 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row0_col7\" class=\"data row0 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row1\" class=\"row_heading level0 row1\" >ridge</th>\n",
" <td id=\"T_4edf2_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col5\" class=\"data row1 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col6\" class=\"data row1 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row1_col7\" class=\"data row1 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row2\" class=\"row_heading level0 row2\" >decision_tree</th>\n",
" <td id=\"T_4edf2_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col5\" class=\"data row2 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col6\" class=\"data row2 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row2_col7\" class=\"data row2 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row3\" class=\"row_heading level0 row3\" >knn</th>\n",
" <td id=\"T_4edf2_row3_col0\" class=\"data row3 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col2\" class=\"data row3 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col4\" class=\"data row3 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col5\" class=\"data row3 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col6\" class=\"data row3 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row3_col7\" class=\"data row3 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row4\" class=\"row_heading level0 row4\" >naive_bayes</th>\n",
" <td id=\"T_4edf2_row4_col0\" class=\"data row4 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col1\" class=\"data row4 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col2\" class=\"data row4 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col3\" class=\"data row4 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col4\" class=\"data row4 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col5\" class=\"data row4 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col6\" class=\"data row4 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row4_col7\" class=\"data row4 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row5\" class=\"row_heading level0 row5\" >gradient_boosting</th>\n",
" <td id=\"T_4edf2_row5_col0\" class=\"data row5 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col1\" class=\"data row5 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col2\" class=\"data row5 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col3\" class=\"data row5 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col4\" class=\"data row5 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col5\" class=\"data row5 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col6\" class=\"data row5 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row5_col7\" class=\"data row5 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row6\" class=\"row_heading level0 row6\" >random_forest</th>\n",
" <td id=\"T_4edf2_row6_col0\" class=\"data row6 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col1\" class=\"data row6 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col2\" class=\"data row6 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col3\" class=\"data row6 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col4\" class=\"data row6 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col5\" class=\"data row6 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col6\" class=\"data row6 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row6_col7\" class=\"data row6 col7\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_4edf2_level0_row7\" class=\"row_heading level0 row7\" >mlp</th>\n",
" <td id=\"T_4edf2_row7_col0\" class=\"data row7 col0\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col1\" class=\"data row7 col1\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col2\" class=\"data row7 col2\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col3\" class=\"data row7 col3\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col4\" class=\"data row7 col4\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col5\" class=\"data row7 col5\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col6\" class=\"data row7 col6\" >1.000000</td>\n",
" <td id=\"T_4edf2_row7_col7\" class=\"data row7 col7\" >1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x26164c85940>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
" [\n",
" \"Precision_train\",\n",
" \"Precision_test\",\n",
" \"Recall_train\",\n",
" \"Recall_test\",\n",
" \"Accuracy_train\",\n",
" \"Accuracy_test\",\n",
" \"F1_train\",\n",
" \"F1_test\",\n",
" ]\n",
"]\n",
"class_metrics.sort_values(\n",
" by=\"Accuracy_test\", ascending=False\n",
").style.background_gradient(\n",
" cmap=\"plasma\",\n",
" low=0.3,\n",
" high=1,\n",
" subset=[\"Accuracy_train\", \"Accuracy_test\", \"F1_train\", \"F1_test\"],\n",
").background_gradient(\n",
" cmap=\"viridis\",\n",
" low=1,\n",
" high=0.3,\n",
" subset=[\n",
" \"Precision_train\",\n",
" \"Precision_test\",\n",
" \"Recall_train\",\n",
" \"Recall_test\",\n",
" ],\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ROC-кривая, каппа Коэна, коэффициент корреляции Мэтьюса"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"#T_02096_row0_col0, #T_02096_row0_col1, #T_02096_row1_col0, #T_02096_row1_col1, #T_02096_row2_col0, #T_02096_row2_col1, #T_02096_row3_col0, #T_02096_row3_col1, #T_02096_row4_col0, #T_02096_row4_col1, #T_02096_row5_col0, #T_02096_row5_col1, #T_02096_row6_col0, #T_02096_row6_col1, #T_02096_row7_col0, #T_02096_row7_col1 {\n",
" background-color: #440154;\n",
" color: #f1f1f1;\n",
"}\n",
"#T_02096_row0_col2, #T_02096_row0_col3, #T_02096_row0_col4, #T_02096_row1_col2, #T_02096_row1_col3, #T_02096_row1_col4, #T_02096_row2_col2, #T_02096_row2_col3, #T_02096_row2_col4, #T_02096_row3_col2, #T_02096_row3_col3, #T_02096_row3_col4, #T_02096_row4_col2, #T_02096_row4_col3, #T_02096_row4_col4, #T_02096_row5_col2, #T_02096_row5_col3, #T_02096_row5_col4, #T_02096_row6_col2, #T_02096_row6_col3, #T_02096_row6_col4, #T_02096_row7_col2, #T_02096_row7_col3, #T_02096_row7_col4 {\n",
" background-color: #0d0887;\n",
" color: #f1f1f1;\n",
"}\n",
"</style>\n",
"<table id=\"T_02096\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_02096_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
" <th id=\"T_02096_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
" <th id=\"T_02096_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
" <th id=\"T_02096_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
" <th id=\"T_02096_level0_col4\" class=\"col_heading level0 col4\" >MCC_test</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
" <td id=\"T_02096_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row1\" class=\"row_heading level0 row1\" >ridge</th>\n",
" <td id=\"T_02096_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row2\" class=\"row_heading level0 row2\" >decision_tree</th>\n",
" <td id=\"T_02096_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row3\" class=\"row_heading level0 row3\" >knn</th>\n",
" <td id=\"T_02096_row3_col0\" class=\"data row3 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row3_col2\" class=\"data row3 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row3_col4\" class=\"data row3 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row4\" class=\"row_heading level0 row4\" >naive_bayes</th>\n",
" <td id=\"T_02096_row4_col0\" class=\"data row4 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row4_col1\" class=\"data row4 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row4_col2\" class=\"data row4 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row4_col3\" class=\"data row4 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row4_col4\" class=\"data row4 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row5\" class=\"row_heading level0 row5\" >gradient_boosting</th>\n",
" <td id=\"T_02096_row5_col0\" class=\"data row5 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row5_col1\" class=\"data row5 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row5_col2\" class=\"data row5 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row5_col3\" class=\"data row5 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row5_col4\" class=\"data row5 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row6\" class=\"row_heading level0 row6\" >random_forest</th>\n",
" <td id=\"T_02096_row6_col0\" class=\"data row6 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row6_col1\" class=\"data row6 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row6_col2\" class=\"data row6 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row6_col3\" class=\"data row6 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row6_col4\" class=\"data row6 col4\" >1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_02096_level0_row7\" class=\"row_heading level0 row7\" >mlp</th>\n",
" <td id=\"T_02096_row7_col0\" class=\"data row7 col0\" >1.000000</td>\n",
" <td id=\"T_02096_row7_col1\" class=\"data row7 col1\" >1.000000</td>\n",
" <td id=\"T_02096_row7_col2\" class=\"data row7 col2\" >1.000000</td>\n",
" <td id=\"T_02096_row7_col3\" class=\"data row7 col3\" >1.000000</td>\n",
" <td id=\"T_02096_row7_col4\" class=\"data row7 col4\" >1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x26164c17020>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
" [\n",
" \"Accuracy_test\",\n",
" \"F1_test\",\n",
" \"ROC_AUC_test\",\n",
" \"Cohen_kappa_test\",\n",
" \"MCC_test\",\n",
" ]\n",
"]\n",
"class_metrics.sort_values(by=\"ROC_AUC_test\", ascending=False).style.background_gradient(\n",
" cmap=\"plasma\",\n",
" low=0.3,\n",
" high=1,\n",
" subset=[\n",
" \"ROC_AUC_test\",\n",
" \"MCC_test\",\n",
" \"Cohen_kappa_test\",\n",
" ],\n",
").background_gradient(\n",
" cmap=\"viridis\",\n",
" low=1,\n",
" high=0.3,\n",
" subset=[\n",
" \"Accuracy_test\",\n",
" \"F1_test\",\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'logistic'"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"best_model = str(class_metrics.sort_values(by=\"MCC_test\", ascending=False).iloc[0].name)\n",
"\n",
"display(best_model)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Вывод данных с ошибкой предсказания для оценки"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\sklearn\\preprocessing\\_encoders.py:242: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros\n",
" warnings.warn(\n"
]
},
{
"ename": "KeyError",
"evalue": "'Survived'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3804\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 3805\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
"File \u001b[1;32mindex.pyx:167\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"File \u001b[1;32mindex.pyx:196\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"File \u001b[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7081\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"File \u001b[1;32mpandas\\\\_libs\\\\hashtable_class_helper.pxi:7089\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: 'Survived'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[12], line 9\u001b[0m\n\u001b[0;32m 2\u001b[0m preprocessed_df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[0;32m 3\u001b[0m preprocessing_result,\n\u001b[0;32m 4\u001b[0m columns\u001b[38;5;241m=\u001b[39mpipeline_end\u001b[38;5;241m.\u001b[39mget_feature_names_out(),\n\u001b[0;32m 5\u001b[0m )\n\u001b[0;32m 7\u001b[0m y_pred \u001b[38;5;241m=\u001b[39m class_models[best_model][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpreds\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m----> 9\u001b[0m error_index \u001b[38;5;241m=\u001b[39m y_test[\u001b[43my_test\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mSurvived\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m!=\u001b[39m y_pred]\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mtolist()\n\u001b[0;32m 10\u001b[0m display(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError items count: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(error_index)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 12\u001b[0m error_predicted \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mSeries(y_pred, index\u001b[38;5;241m=\u001b[39my_test\u001b[38;5;241m.\u001b[39mindex)\u001b[38;5;241m.\u001b[39mloc[error_index]\n",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\frame.py:4102\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 4100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mnlevels \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 4101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[1;32m-> 4102\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4103\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n\u001b[0;32m 4104\u001b[0m indexer \u001b[38;5;241m=\u001b[39m [indexer]\n",
"File \u001b[1;32mc:\\Users\\1\\Desktop\\улгту\\3 курс\\МИИ\\mai\\.venv\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3812\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3807\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(casted_key, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[0;32m 3808\u001b[0m \u001b[38;5;28misinstance\u001b[39m(casted_key, abc\u001b[38;5;241m.\u001b[39mIterable)\n\u001b[0;32m 3809\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[38;5;28misinstance\u001b[39m(x, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m casted_key)\n\u001b[0;32m 3810\u001b[0m ):\n\u001b[0;32m 3811\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidIndexError(key)\n\u001b[1;32m-> 3812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[0;32m 3813\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[0;32m 3814\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[0;32m 3815\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[0;32m 3816\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n\u001b[0;32m 3817\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n",
"\u001b[1;31mKeyError\u001b[0m: 'Survived'"
]
}
],
"source": [
"preprocessing_result = pipeline_end.transform(X_test)\n",
"preprocessed_df = pd.DataFrame(\n",
" preprocessing_result,\n",
" columns=pipeline_end.get_feature_names_out(),\n",
")\n",
"\n",
"y_pred = class_models[best_model][\"preds\"]\n",
"\n",
"error_index = y_test[y_test[\"Survived\"] != y_pred].index.tolist()\n",
"display(f\"Error items count: {len(error_index)}\")\n",
"\n",
"error_predicted = pd.Series(y_pred, index=y_test.index).loc[error_index]\n",
"error_df = X_test.loc[error_index].copy()\n",
"error_df.insert(loc=1, column=\"Predicted\", value=error_predicted)\n",
"error_df.sort_index()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Пример использования обученной модели (конвейера) для предсказания"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model = class_models[best_model][\"pipeline\"]\n",
"\n",
"example_id = 450\n",
"test = pd.DataFrame(X_test.loc[example_id, :]).T\n",
"test_preprocessed = pd.DataFrame(preprocessed_df.loc[example_id, :]).T\n",
"display(test)\n",
"display(test_preprocessed)\n",
"result_proba = model.predict_proba(test)[0]\n",
"result = model.predict(test)[0]\n",
"real = int(y_test.loc[example_id].values[0])\n",
"display(f\"predicted: {result} (proba: {result_proba})\")\n",
"display(f\"real: {real}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Подбор гиперпараметров методом поиска по сетке\n",
"\n",
"https://www.kaggle.com/code/sociopath00/random-forest-using-gridsearchcv\n",
"\n",
"https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"optimized_model_type = \"random_forest\"\n",
"\n",
"random_forest_model = class_models[optimized_model_type][\"pipeline\"]\n",
"\n",
"param_grid = {\n",
" \"model__n_estimators\": [10, 20, 30, 40, 50, 100, 150, 200, 250, 500],\n",
" \"model__max_features\": [\"sqrt\", \"log2\", 2],\n",
" \"model__max_depth\": [2, 3, 4, 5, 6, 7, 8, 9 ,10],\n",
" \"model__criterion\": [\"gini\", \"entropy\", \"log_loss\"],\n",
"}\n",
"\n",
"gs_optomizer = GridSearchCV(\n",
" estimator=random_forest_model, param_grid=param_grid, n_jobs=-1\n",
")\n",
"gs_optomizer.fit(X_train, y_train.values.ravel())\n",
"gs_optomizer.best_params_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Обучение модели с новыми гиперпараметрами"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"optimized_model = ensemble.RandomForestClassifier(\n",
" random_state=random_state,\n",
" criterion=\"gini\",\n",
" max_depth=7,\n",
" max_features=\"sqrt\",\n",
" n_estimators=30,\n",
")\n",
"\n",
"result = {}\n",
"\n",
"result[\"pipeline\"] = Pipeline([(\"pipeline\", pipeline_end), (\"model\", optimized_model)]).fit(X_train, y_train.values.ravel())\n",
"result[\"train_preds\"] = result[\"pipeline\"].predict(X_train)\n",
"result[\"probs\"] = result[\"pipeline\"].predict_proba(X_test)[:, 1]\n",
"result[\"preds\"] = np.where(result[\"probs\"] > 0.5, 1, 0)\n",
"\n",
"result[\"Precision_train\"] = metrics.precision_score(y_train, result[\"train_preds\"])\n",
"result[\"Precision_test\"] = metrics.precision_score(y_test, result[\"preds\"])\n",
"result[\"Recall_train\"] = metrics.recall_score(y_train, result[\"train_preds\"])\n",
"result[\"Recall_test\"] = metrics.recall_score(y_test, result[\"preds\"])\n",
"result[\"Accuracy_train\"] = metrics.accuracy_score(y_train, result[\"train_preds\"])\n",
"result[\"Accuracy_test\"] = metrics.accuracy_score(y_test, result[\"preds\"])\n",
"result[\"ROC_AUC_test\"] = metrics.roc_auc_score(y_test, result[\"probs\"])\n",
"result[\"F1_train\"] = metrics.f1_score(y_train, result[\"train_preds\"])\n",
"result[\"F1_test\"] = metrics.f1_score(y_test, result[\"preds\"])\n",
"result[\"MCC_test\"] = metrics.matthews_corrcoef(y_test, result[\"preds\"])\n",
"result[\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(y_test, result[\"preds\"])\n",
"result[\"Confusion_matrix\"] = metrics.confusion_matrix(y_test, result[\"preds\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Формирование данных для оценки старой и новой версии модели"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"optimized_metrics = pd.DataFrame(columns=list(result.keys()))\n",
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
" data=class_models[optimized_model_type]\n",
")\n",
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
" data=result\n",
")\n",
"optimized_metrics.insert(loc=0, column=\"Name\", value=[\"Old\", \"New\"])\n",
"optimized_metrics = optimized_metrics.set_index(\"Name\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оценка параметров старой и новой модели"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"optimized_metrics[\n",
" [\n",
" \"Precision_train\",\n",
" \"Precision_test\",\n",
" \"Recall_train\",\n",
" \"Recall_test\",\n",
" \"Accuracy_train\",\n",
" \"Accuracy_test\",\n",
" \"F1_train\",\n",
" \"F1_test\",\n",
" ]\n",
"].style.background_gradient(\n",
" cmap=\"plasma\",\n",
" low=0.3,\n",
" high=1,\n",
" subset=[\"Accuracy_train\", \"Accuracy_test\", \"F1_train\", \"F1_test\"],\n",
").background_gradient(\n",
" cmap=\"viridis\",\n",
" low=1,\n",
" high=0.3,\n",
" subset=[\n",
" \"Precision_train\",\n",
" \"Precision_test\",\n",
" \"Recall_train\",\n",
" \"Recall_test\",\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"optimized_metrics[\n",
" [\n",
" \"Accuracy_test\",\n",
" \"F1_test\",\n",
" \"ROC_AUC_test\",\n",
" \"Cohen_kappa_test\",\n",
" \"MCC_test\",\n",
" ]\n",
"].style.background_gradient(\n",
" cmap=\"plasma\",\n",
" low=0.3,\n",
" high=1,\n",
" subset=[\n",
" \"ROC_AUC_test\",\n",
" \"MCC_test\",\n",
" \"Cohen_kappa_test\",\n",
" ],\n",
").background_gradient(\n",
" cmap=\"viridis\",\n",
" low=1,\n",
" high=0.3,\n",
" subset=[\n",
" \"Accuracy_test\",\n",
" \"F1_test\",\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'optimized_metrics' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[14], line 4\u001b[0m\n\u001b[0;32m 1\u001b[0m _, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m, figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m10\u001b[39m, \u001b[38;5;241m4\u001b[39m), sharex\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, sharey\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 2\u001b[0m )\n\u001b[1;32m----> 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m index \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;28mlen\u001b[39m(\u001b[43moptimized_metrics\u001b[49m)):\n\u001b[0;32m 5\u001b[0m c_matrix \u001b[38;5;241m=\u001b[39m optimized_metrics\u001b[38;5;241m.\u001b[39miloc[index][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConfusion_matrix\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 6\u001b[0m disp \u001b[38;5;241m=\u001b[39m ConfusionMatrixDisplay(\n\u001b[0;32m 7\u001b[0m confusion_matrix\u001b[38;5;241m=\u001b[39mc_matrix, display_labels\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDied\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSirvived\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 8\u001b[0m )\u001b[38;5;241m.\u001b[39mplot(ax\u001b[38;5;241m=\u001b[39max\u001b[38;5;241m.\u001b[39mflat[index])\n",
"\u001b[1;31mNameError\u001b[0m: name 'optimized_metrics' is not defined"
]
},
{
"data": {
"image/png": "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//Vf2a233pqdd955WU9PT971P/vZz7KysrLsgQceyF555ZXsnnvuyc4666zs5ZdfLvLkk6vQfbnpppuytra2bN++fdn+/fuzv/u7v8uqqqqy//7v/y7y5JOv0L15zxtvvJHNmzcvu+aaa7K//uu/Ls6wRVTovgwMDGSLFy/Orr/++uzFF1/M3njjjWzXrl1ZV1dXkSefXIXuy/e+970sl8tl3/ve97I33ngje/7557M5c+Zka9asKfLkk2/nzp3Z+vXrs2eeeSaLiOzZZ5/9wPUHDx7MzjnnnKy5uTl75ZVXsm9961tZWVlZ1t7eXpyBi0QujU025SeXxiab8pNN+U1VLp0WpWjJkiXZ6tWrR/49NDSUzZ07N2ttbc27/gtf+EJ2ww03jDpWV1eX/f3f//2kzllshe7L+x0/fjw799xzs+9+97uTNeKUGc/eHD9+PLvqqquy73znO9nKlSunZfgUui/f/va3swsvvDAbHBws1ohTotB9Wb16dfbZz3521LHm5ubs6quvntQ5p9rJhM9Xv/rV7FOf+tSoY01NTVljY+MkTlZ8cmlssik/uTQ22ZSfbPpwxcylKX/53ODgYOzZsycaGhpGjpWWlkZDQ0N0dnbmPaezs3PU+oiIxsbGMdeficazL+/3zjvvxLvvvhvnn3/+ZI05Jca7N1//+tdj9uzZcfPNNxdjzKIbz7788Ic/jPr6+li9enVUV1fHpZdeGhs3boyhoaFijT3pxrMvV111VezZs2fkZQwHDx6MnTt3xvXXX1+UmU9nrr/p5lKEbBqLXBqbbMpPNp06p+r6O+NUDjUeR48ejaGhoZFvHX9PdXV1HDhwIO853d3dedd3d3dP2pzFNp59eb+77ror5s6de8IvypluPHvz4osvxuOPPx5dXV1FmHBqjGdfDh48GP/xH/8RX/ziF2Pnzp3x+uuvx5e//OV49913o6WlpRhjT7rx7MtNN90UR48ejc985jORZVkcP348br/99rj77ruLMfJpbazrb19fX/zud7+Ls88+e4omO3Xk0thkU35yaWyyKT/ZdOqcqlya8meKmBybNm2Kbdu2xbPPPhsVFRVTPc6UOnbsWCxfvjy2bt0as2bNmupxTivDw8Mxe/bseOyxx2LRokXR1NQU69evjy1btkz1aFNq165dsXHjxnj00Udj79698cwzz8SOHTvi/vvvn+rR4Iwmm/5ALn0w2ZSfbJpcU/5M0axZs6KsrCx6enpGHe/p6Ymampq859TU1BS0/kw0nn15z4MPPhibNm2Kf//3f4/LL798MsecEoXuzS9/+ct48803Y+nSpSPHhoeHIyJixowZ8eqrr8ZFF100uUMXwXh+Z+bMmRNnnXVWlJWVjRz7xCc+Ed3d3TE4OBjl5eWTOnMxjGdf7r333li+fHnccsstERFx2WWXRX9/f9x2222xfv36KC1N9+9JY11/Kysrp8WzRBFy6YPIpvzk0thkU36y6dQ5Vbk05btXXl4eixYtio6OjpFjw8PD0dHREfX19XnPqa+vH7U+IuKFF14Yc/2ZaDz7EhHxwAMPxP333x/t7e2xePHiYoxadIXuzSWXXBIvv/xydHV1jdw+//nPx3XXXRddXV1RW1tbzPEnzXh+Z66++up4/fXXR8I4IuK1116LOXPmTIvQiRjfvrzzzjsnhMt74fyH932my/U33VyKkE1jkUtjk035yaZT55Rdfwv6WIZJsm3btiyXy2VPPvlk9sorr2S33XZbdt5552Xd3d1ZlmXZ8uXLs7Vr146s/9nPfpbNmDEje/DBB7P9+/dnLS0t0/KjTwvdl02bNmXl5eXZ008/nf3mN78ZuR07dmyqHsKkKXRv3m+6fspPofty6NCh7Nxzz83+4R/+IXv11VezH/3oR9ns2bOzb3zjG1P1ECZFofvS0tKSnXvuudm//du/ZQcPHsx+/OMfZxdddFH2hS98YaoewqQ5duxYtm/fvmzfvn1ZRGQPP/xwtm/fvuxXv/pVlmVZtnbt2mz58uUj69/76NN/+qd/yvbv35+1tbVN24/klkv5yab85NLYZFN+sim/qcql06IUZVmWfetb38ouuOCCrLy8PFuyZEn2n//5nyP/7dprr81Wrlw5av33v//97OKLL87Ky8uzT33qU9mOHTuKPHFxFLIvH/3oR7OIOOHW0tJS/MGLoNDfmf/fdA6fQvflpZdeyurq6rJcLpddeOGF2Te/+c3s+PHjRZ568hWyL++++272ta99LbvooouyioqKrLa2Nvvyl7+c/e///m/xB59kP/nJT/JeN97bj5UrV2bXXnvtCecsXLgwKy8vzy688MLsX//1X4s+dzHIpbHJpvzk0thkU36y6URTlUslWZbw820AAEDypvw9RQAAAFNJKQIAAJKmFAEAAElTigAAgKQpRQAAQNKUIgAAIGlKEQAAkDSlCAAASJpSBAAAJE0pAgAAkqYUAQAASVOKAACApP0/Ur3MSCKgqcQAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1000x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"_, ax = plt.subplots(1, 2, figsize=(10, 4), sharex=False, sharey=False\n",
")\n",
"\n",
"for index in range(0, len(optimized_metrics)):\n",
" c_matrix = optimized_metrics.iloc[index][\"Confusion_matrix\"]\n",
" disp = ConfusionMatrixDisplay(\n",
" confusion_matrix=c_matrix, display_labels=[\"Died\", \"Sirvived\"]\n",
" ).plot(ax=ax.flat[index])\n",
"\n",
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.3)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}