4286 lines (4285 with data), 227.3 kB
{
"cells": [
{
"cell_type": "markdown",
"id": "24fda7b6-4e16-44c9-abef-9c790cf286d0",
"metadata": {},
"source": [
"Breast cancer"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "6853550c-51ef-4fe6-8e66-b51eb64eb4c4",
"metadata": {},
"outputs": [],
"source": [
"# Importing libraries\n",
"\n",
"import pandas as pd\n",
"\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"sns.set()\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "fbe6e81a-874c-4df0-a5b4-5382d1c4b644",
"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>id</th>\n",
" <th>diagnosis</th>\n",
" <th>radius_mean</th>\n",
" <th>texture_mean</th>\n",
" <th>perimeter_mean</th>\n",
" <th>area_mean</th>\n",
" <th>smoothness_mean</th>\n",
" <th>compactness_mean</th>\n",
" <th>concavity_mean</th>\n",
" <th>concave points_mean</th>\n",
" <th>...</th>\n",
" <th>texture_worst</th>\n",
" <th>perimeter_worst</th>\n",
" <th>area_worst</th>\n",
" <th>smoothness_worst</th>\n",
" <th>compactness_worst</th>\n",
" <th>concavity_worst</th>\n",
" <th>concave points_worst</th>\n",
" <th>symmetry_worst</th>\n",
" <th>fractal_dimension_worst</th>\n",
" <th>Unnamed: 32</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>842302</td>\n",
" <td>M</td>\n",
" <td>17.99</td>\n",
" <td>10.38</td>\n",
" <td>122.80</td>\n",
" <td>1001.0</td>\n",
" <td>0.11840</td>\n",
" <td>0.27760</td>\n",
" <td>0.3001</td>\n",
" <td>0.14710</td>\n",
" <td>...</td>\n",
" <td>17.33</td>\n",
" <td>184.60</td>\n",
" <td>2019.0</td>\n",
" <td>0.1622</td>\n",
" <td>0.6656</td>\n",
" <td>0.7119</td>\n",
" <td>0.2654</td>\n",
" <td>0.4601</td>\n",
" <td>0.11890</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>842517</td>\n",
" <td>M</td>\n",
" <td>20.57</td>\n",
" <td>17.77</td>\n",
" <td>132.90</td>\n",
" <td>1326.0</td>\n",
" <td>0.08474</td>\n",
" <td>0.07864</td>\n",
" <td>0.0869</td>\n",
" <td>0.07017</td>\n",
" <td>...</td>\n",
" <td>23.41</td>\n",
" <td>158.80</td>\n",
" <td>1956.0</td>\n",
" <td>0.1238</td>\n",
" <td>0.1866</td>\n",
" <td>0.2416</td>\n",
" <td>0.1860</td>\n",
" <td>0.2750</td>\n",
" <td>0.08902</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>84300903</td>\n",
" <td>M</td>\n",
" <td>19.69</td>\n",
" <td>21.25</td>\n",
" <td>130.00</td>\n",
" <td>1203.0</td>\n",
" <td>0.10960</td>\n",
" <td>0.15990</td>\n",
" <td>0.1974</td>\n",
" <td>0.12790</td>\n",
" <td>...</td>\n",
" <td>25.53</td>\n",
" <td>152.50</td>\n",
" <td>1709.0</td>\n",
" <td>0.1444</td>\n",
" <td>0.4245</td>\n",
" <td>0.4504</td>\n",
" <td>0.2430</td>\n",
" <td>0.3613</td>\n",
" <td>0.08758</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>84348301</td>\n",
" <td>M</td>\n",
" <td>11.42</td>\n",
" <td>20.38</td>\n",
" <td>77.58</td>\n",
" <td>386.1</td>\n",
" <td>0.14250</td>\n",
" <td>0.28390</td>\n",
" <td>0.2414</td>\n",
" <td>0.10520</td>\n",
" <td>...</td>\n",
" <td>26.50</td>\n",
" <td>98.87</td>\n",
" <td>567.7</td>\n",
" <td>0.2098</td>\n",
" <td>0.8663</td>\n",
" <td>0.6869</td>\n",
" <td>0.2575</td>\n",
" <td>0.6638</td>\n",
" <td>0.17300</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>84358402</td>\n",
" <td>M</td>\n",
" <td>20.29</td>\n",
" <td>14.34</td>\n",
" <td>135.10</td>\n",
" <td>1297.0</td>\n",
" <td>0.10030</td>\n",
" <td>0.13280</td>\n",
" <td>0.1980</td>\n",
" <td>0.10430</td>\n",
" <td>...</td>\n",
" <td>16.67</td>\n",
" <td>152.20</td>\n",
" <td>1575.0</td>\n",
" <td>0.1374</td>\n",
" <td>0.2050</td>\n",
" <td>0.4000</td>\n",
" <td>0.1625</td>\n",
" <td>0.2364</td>\n",
" <td>0.07678</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 33 columns</p>\n",
"</div>"
],
"text/plain": [
" id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n",
"0 842302 M 17.99 10.38 122.80 1001.0 \n",
"1 842517 M 20.57 17.77 132.90 1326.0 \n",
"2 84300903 M 19.69 21.25 130.00 1203.0 \n",
"3 84348301 M 11.42 20.38 77.58 386.1 \n",
"4 84358402 M 20.29 14.34 135.10 1297.0 \n",
"\n",
" smoothness_mean compactness_mean concavity_mean concave points_mean \\\n",
"0 0.11840 0.27760 0.3001 0.14710 \n",
"1 0.08474 0.07864 0.0869 0.07017 \n",
"2 0.10960 0.15990 0.1974 0.12790 \n",
"3 0.14250 0.28390 0.2414 0.10520 \n",
"4 0.10030 0.13280 0.1980 0.10430 \n",
"\n",
" ... texture_worst perimeter_worst area_worst smoothness_worst \\\n",
"0 ... 17.33 184.60 2019.0 0.1622 \n",
"1 ... 23.41 158.80 1956.0 0.1238 \n",
"2 ... 25.53 152.50 1709.0 0.1444 \n",
"3 ... 26.50 98.87 567.7 0.2098 \n",
"4 ... 16.67 152.20 1575.0 0.1374 \n",
"\n",
" compactness_worst concavity_worst concave points_worst symmetry_worst \\\n",
"0 0.6656 0.7119 0.2654 0.4601 \n",
"1 0.1866 0.2416 0.1860 0.2750 \n",
"2 0.4245 0.4504 0.2430 0.3613 \n",
"3 0.8663 0.6869 0.2575 0.6638 \n",
"4 0.2050 0.4000 0.1625 0.2364 \n",
"\n",
" fractal_dimension_worst Unnamed: 32 \n",
"0 0.11890 NaN \n",
"1 0.08902 NaN \n",
"2 0.08758 NaN \n",
"3 0.17300 NaN \n",
"4 0.07678 NaN \n",
"\n",
"[5 rows x 33 columns]"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Diagnosis (malignant (cancerous) or benign (non-cancerous))\n",
"df = pd.read_csv(r'C:\\Users\\Pranshu Saini\\Desktop\\disease-prediction-main\\docpat\\datasets\\breast_cancer.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "37a2d7c4-ce0a-4532-bb12-60c908f91992",
"metadata": {},
"outputs": [],
"source": [
"df.drop(['id', 'Unnamed: 32'], axis = 1, inplace = True)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "85a23ebe-5735-4535-8ac4-aa1dcde8c0e5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['M', 'B'], dtype=object)"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.diagnosis.unique()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "31f9fac3-323d-4556-94f5-b2a2f1390a3d",
"metadata": {},
"outputs": [],
"source": [
"df['diagnosis'] = df['diagnosis'].apply(lambda val: 1 if val == 'M' else 0)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "551ba2a1-6f0d-4644-aca9-226671a1d2dc",
"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>diagnosis</th>\n",
" <th>radius_mean</th>\n",
" <th>texture_mean</th>\n",
" <th>perimeter_mean</th>\n",
" <th>area_mean</th>\n",
" <th>smoothness_mean</th>\n",
" <th>compactness_mean</th>\n",
" <th>concavity_mean</th>\n",
" <th>concave points_mean</th>\n",
" <th>symmetry_mean</th>\n",
" <th>...</th>\n",
" <th>radius_worst</th>\n",
" <th>texture_worst</th>\n",
" <th>perimeter_worst</th>\n",
" <th>area_worst</th>\n",
" <th>smoothness_worst</th>\n",
" <th>compactness_worst</th>\n",
" <th>concavity_worst</th>\n",
" <th>concave points_worst</th>\n",
" <th>symmetry_worst</th>\n",
" <th>fractal_dimension_worst</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>...</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" <td>569.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.372583</td>\n",
" <td>14.127292</td>\n",
" <td>19.289649</td>\n",
" <td>91.969033</td>\n",
" <td>654.889104</td>\n",
" <td>0.096360</td>\n",
" <td>0.104341</td>\n",
" <td>0.088799</td>\n",
" <td>0.048919</td>\n",
" <td>0.181162</td>\n",
" <td>...</td>\n",
" <td>16.269190</td>\n",
" <td>25.677223</td>\n",
" <td>107.261213</td>\n",
" <td>880.583128</td>\n",
" <td>0.132369</td>\n",
" <td>0.254265</td>\n",
" <td>0.272188</td>\n",
" <td>0.114606</td>\n",
" <td>0.290076</td>\n",
" <td>0.083946</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.483918</td>\n",
" <td>3.524049</td>\n",
" <td>4.301036</td>\n",
" <td>24.298981</td>\n",
" <td>351.914129</td>\n",
" <td>0.014064</td>\n",
" <td>0.052813</td>\n",
" <td>0.079720</td>\n",
" <td>0.038803</td>\n",
" <td>0.027414</td>\n",
" <td>...</td>\n",
" <td>4.833242</td>\n",
" <td>6.146258</td>\n",
" <td>33.602542</td>\n",
" <td>569.356993</td>\n",
" <td>0.022832</td>\n",
" <td>0.157336</td>\n",
" <td>0.208624</td>\n",
" <td>0.065732</td>\n",
" <td>0.061867</td>\n",
" <td>0.018061</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000000</td>\n",
" <td>6.981000</td>\n",
" <td>9.710000</td>\n",
" <td>43.790000</td>\n",
" <td>143.500000</td>\n",
" <td>0.052630</td>\n",
" <td>0.019380</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.106000</td>\n",
" <td>...</td>\n",
" <td>7.930000</td>\n",
" <td>12.020000</td>\n",
" <td>50.410000</td>\n",
" <td>185.200000</td>\n",
" <td>0.071170</td>\n",
" <td>0.027290</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.156500</td>\n",
" <td>0.055040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.000000</td>\n",
" <td>11.700000</td>\n",
" <td>16.170000</td>\n",
" <td>75.170000</td>\n",
" <td>420.300000</td>\n",
" <td>0.086370</td>\n",
" <td>0.064920</td>\n",
" <td>0.029560</td>\n",
" <td>0.020310</td>\n",
" <td>0.161900</td>\n",
" <td>...</td>\n",
" <td>13.010000</td>\n",
" <td>21.080000</td>\n",
" <td>84.110000</td>\n",
" <td>515.300000</td>\n",
" <td>0.116600</td>\n",
" <td>0.147200</td>\n",
" <td>0.114500</td>\n",
" <td>0.064930</td>\n",
" <td>0.250400</td>\n",
" <td>0.071460</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.000000</td>\n",
" <td>13.370000</td>\n",
" <td>18.840000</td>\n",
" <td>86.240000</td>\n",
" <td>551.100000</td>\n",
" <td>0.095870</td>\n",
" <td>0.092630</td>\n",
" <td>0.061540</td>\n",
" <td>0.033500</td>\n",
" <td>0.179200</td>\n",
" <td>...</td>\n",
" <td>14.970000</td>\n",
" <td>25.410000</td>\n",
" <td>97.660000</td>\n",
" <td>686.500000</td>\n",
" <td>0.131300</td>\n",
" <td>0.211900</td>\n",
" <td>0.226700</td>\n",
" <td>0.099930</td>\n",
" <td>0.282200</td>\n",
" <td>0.080040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.000000</td>\n",
" <td>15.780000</td>\n",
" <td>21.800000</td>\n",
" <td>104.100000</td>\n",
" <td>782.700000</td>\n",
" <td>0.105300</td>\n",
" <td>0.130400</td>\n",
" <td>0.130700</td>\n",
" <td>0.074000</td>\n",
" <td>0.195700</td>\n",
" <td>...</td>\n",
" <td>18.790000</td>\n",
" <td>29.720000</td>\n",
" <td>125.400000</td>\n",
" <td>1084.000000</td>\n",
" <td>0.146000</td>\n",
" <td>0.339100</td>\n",
" <td>0.382900</td>\n",
" <td>0.161400</td>\n",
" <td>0.317900</td>\n",
" <td>0.092080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>1.000000</td>\n",
" <td>28.110000</td>\n",
" <td>39.280000</td>\n",
" <td>188.500000</td>\n",
" <td>2501.000000</td>\n",
" <td>0.163400</td>\n",
" <td>0.345400</td>\n",
" <td>0.426800</td>\n",
" <td>0.201200</td>\n",
" <td>0.304000</td>\n",
" <td>...</td>\n",
" <td>36.040000</td>\n",
" <td>49.540000</td>\n",
" <td>251.200000</td>\n",
" <td>4254.000000</td>\n",
" <td>0.222600</td>\n",
" <td>1.058000</td>\n",
" <td>1.252000</td>\n",
" <td>0.291000</td>\n",
" <td>0.663800</td>\n",
" <td>0.207500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 31 columns</p>\n",
"</div>"
],
"text/plain": [
" diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n",
"count 569.000000 569.000000 569.000000 569.000000 569.000000 \n",
"mean 0.372583 14.127292 19.289649 91.969033 654.889104 \n",
"std 0.483918 3.524049 4.301036 24.298981 351.914129 \n",
"min 0.000000 6.981000 9.710000 43.790000 143.500000 \n",
"25% 0.000000 11.700000 16.170000 75.170000 420.300000 \n",
"50% 0.000000 13.370000 18.840000 86.240000 551.100000 \n",
"75% 1.000000 15.780000 21.800000 104.100000 782.700000 \n",
"max 1.000000 28.110000 39.280000 188.500000 2501.000000 \n",
"\n",
" smoothness_mean compactness_mean concavity_mean concave points_mean \\\n",
"count 569.000000 569.000000 569.000000 569.000000 \n",
"mean 0.096360 0.104341 0.088799 0.048919 \n",
"std 0.014064 0.052813 0.079720 0.038803 \n",
"min 0.052630 0.019380 0.000000 0.000000 \n",
"25% 0.086370 0.064920 0.029560 0.020310 \n",
"50% 0.095870 0.092630 0.061540 0.033500 \n",
"75% 0.105300 0.130400 0.130700 0.074000 \n",
"max 0.163400 0.345400 0.426800 0.201200 \n",
"\n",
" symmetry_mean ... radius_worst texture_worst perimeter_worst \\\n",
"count 569.000000 ... 569.000000 569.000000 569.000000 \n",
"mean 0.181162 ... 16.269190 25.677223 107.261213 \n",
"std 0.027414 ... 4.833242 6.146258 33.602542 \n",
"min 0.106000 ... 7.930000 12.020000 50.410000 \n",
"25% 0.161900 ... 13.010000 21.080000 84.110000 \n",
"50% 0.179200 ... 14.970000 25.410000 97.660000 \n",
"75% 0.195700 ... 18.790000 29.720000 125.400000 \n",
"max 0.304000 ... 36.040000 49.540000 251.200000 \n",
"\n",
" area_worst smoothness_worst compactness_worst concavity_worst \\\n",
"count 569.000000 569.000000 569.000000 569.000000 \n",
"mean 880.583128 0.132369 0.254265 0.272188 \n",
"std 569.356993 0.022832 0.157336 0.208624 \n",
"min 185.200000 0.071170 0.027290 0.000000 \n",
"25% 515.300000 0.116600 0.147200 0.114500 \n",
"50% 686.500000 0.131300 0.211900 0.226700 \n",
"75% 1084.000000 0.146000 0.339100 0.382900 \n",
"max 4254.000000 0.222600 1.058000 1.252000 \n",
"\n",
" concave points_worst symmetry_worst fractal_dimension_worst \n",
"count 569.000000 569.000000 569.000000 \n",
"mean 0.114606 0.290076 0.083946 \n",
"std 0.065732 0.061867 0.018061 \n",
"min 0.000000 0.156500 0.055040 \n",
"25% 0.064930 0.250400 0.071460 \n",
"50% 0.099930 0.282200 0.080040 \n",
"75% 0.161400 0.317900 0.092080 \n",
"max 0.291000 0.663800 0.207500 \n",
"\n",
"[8 rows x 31 columns]"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "97ded7b0-cb65-43db-a79e-80bb90e43d89",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"diagnosis 0\n",
"radius_mean 0\n",
"texture_mean 0\n",
"perimeter_mean 0\n",
"area_mean 0\n",
"smoothness_mean 0\n",
"compactness_mean 0\n",
"concavity_mean 0\n",
"concave points_mean 0\n",
"symmetry_mean 0\n",
"fractal_dimension_mean 0\n",
"radius_se 0\n",
"texture_se 0\n",
"perimeter_se 0\n",
"area_se 0\n",
"smoothness_se 0\n",
"compactness_se 0\n",
"concavity_se 0\n",
"concave points_se 0\n",
"symmetry_se 0\n",
"fractal_dimension_se 0\n",
"radius_worst 0\n",
"texture_worst 0\n",
"perimeter_worst 0\n",
"area_worst 0\n",
"smoothness_worst 0\n",
"compactness_worst 0\n",
"concavity_worst 0\n",
"concave points_worst 0\n",
"symmetry_worst 0\n",
"fractal_dimension_worst 0\n",
"dtype: int64"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# checking for null values\n",
"\n",
"df.isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "f73513a5-0374-4ed0-a1d4-43ac2c9c41b1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The reduced dataframe has 23 columns.\n",
" diagnosis texture_mean smoothness_mean compactness_mean \\\n",
"0 1 10.38 0.11840 0.27760 \n",
"1 1 17.77 0.08474 0.07864 \n",
"2 1 21.25 0.10960 0.15990 \n",
"3 1 20.38 0.14250 0.28390 \n",
"4 1 14.34 0.10030 0.13280 \n",
".. ... ... ... ... \n",
"564 1 22.39 0.11100 0.11590 \n",
"565 1 28.25 0.09780 0.10340 \n",
"566 1 28.08 0.08455 0.10230 \n",
"567 1 29.33 0.11780 0.27700 \n",
"568 0 24.54 0.05263 0.04362 \n",
"\n",
" concave points_mean symmetry_mean fractal_dimension_mean texture_se \\\n",
"0 0.14710 0.2419 0.07871 0.9053 \n",
"1 0.07017 0.1812 0.05667 0.7339 \n",
"2 0.12790 0.2069 0.05999 0.7869 \n",
"3 0.10520 0.2597 0.09744 1.1560 \n",
"4 0.10430 0.1809 0.05883 0.7813 \n",
".. ... ... ... ... \n",
"564 0.13890 0.1726 0.05623 1.2560 \n",
"565 0.09791 0.1752 0.05533 2.4630 \n",
"566 0.05302 0.1590 0.05648 1.0750 \n",
"567 0.15200 0.2397 0.07016 1.5950 \n",
"568 0.00000 0.1587 0.05884 1.4280 \n",
"\n",
" area_se smoothness_se ... symmetry_se fractal_dimension_se \\\n",
"0 153.40 0.006399 ... 0.03003 0.006193 \n",
"1 74.08 0.005225 ... 0.01389 0.003532 \n",
"2 94.03 0.006150 ... 0.02250 0.004571 \n",
"3 27.23 0.009110 ... 0.05963 0.009208 \n",
"4 94.44 0.011490 ... 0.01756 0.005115 \n",
".. ... ... ... ... ... \n",
"564 158.70 0.010300 ... 0.01114 0.004239 \n",
"565 99.04 0.005769 ... 0.01898 0.002498 \n",
"566 48.55 0.005903 ... 0.01318 0.003892 \n",
"567 86.22 0.006522 ... 0.02324 0.006185 \n",
"568 19.15 0.007189 ... 0.02676 0.002783 \n",
"\n",
" texture_worst area_worst smoothness_worst compactness_worst \\\n",
"0 17.33 2019.0 0.16220 0.66560 \n",
"1 23.41 1956.0 0.12380 0.18660 \n",
"2 25.53 1709.0 0.14440 0.42450 \n",
"3 26.50 567.7 0.20980 0.86630 \n",
"4 16.67 1575.0 0.13740 0.20500 \n",
".. ... ... ... ... \n",
"564 26.40 2027.0 0.14100 0.21130 \n",
"565 38.25 1731.0 0.11660 0.19220 \n",
"566 34.12 1124.0 0.11390 0.30940 \n",
"567 39.42 1821.0 0.16500 0.86810 \n",
"568 30.37 268.6 0.08996 0.06444 \n",
"\n",
" concavity_worst concave points_worst symmetry_worst \\\n",
"0 0.7119 0.2654 0.4601 \n",
"1 0.2416 0.1860 0.2750 \n",
"2 0.4504 0.2430 0.3613 \n",
"3 0.6869 0.2575 0.6638 \n",
"4 0.4000 0.1625 0.2364 \n",
".. ... ... ... \n",
"564 0.4107 0.2216 0.2060 \n",
"565 0.3215 0.1628 0.2572 \n",
"566 0.3403 0.1418 0.2218 \n",
"567 0.9387 0.2650 0.4087 \n",
"568 0.0000 0.0000 0.2871 \n",
"\n",
" fractal_dimension_worst \n",
"0 0.11890 \n",
"1 0.08902 \n",
"2 0.08758 \n",
"3 0.17300 \n",
"4 0.07678 \n",
".. ... \n",
"564 0.07115 \n",
"565 0.06637 \n",
"566 0.07820 \n",
"567 0.12400 \n",
"568 0.07039 \n",
"\n",
"[569 rows x 23 columns]\n"
]
}
],
"source": [
"# removing highly correlated features\n",
"\n",
"corr_matrix = df.corr().abs() \n",
"\n",
"mask = np.triu(np.ones_like(corr_matrix, dtype = bool))\n",
"tri_df = corr_matrix.mask(mask)\n",
"\n",
"to_drop = [x for x in tri_df.columns if any(tri_df[x] > 0.92)]\n",
"\n",
"df = df.drop(to_drop, axis = 1)\n",
"\n",
"print(f\"The reduced dataframe has {df.shape[1]} columns.\")\n",
"print(df)\n"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "62fb56f2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.0, 10.38, 0.1184, 0.2776, 0.1471, 0.2419, 0.07871, 0.9053, 153.4, 0.006399, 0.04904, 0.05373, 0.01587, 0.03003, 0.006193, 17.33, 2019.0, 0.1622, 0.6656, 0.7119, 0.2654, 0.4601, 0.1189]\n",
"23\n"
]
}
],
"source": [
"# Filter rows where diagnosis == 1\n",
"filtered_df = df[df['diagnosis'] == 1]\n",
"\n",
"# Select the first row and convert it to a list\n",
"if not filtered_df.empty: # Ensure there is at least one matching row\n",
" first_row_values = filtered_df.iloc[0].tolist()\n",
" print(first_row_values)\n",
"else:\n",
" print(\"No rows with diagnosis == 1\")\n",
"print(len(first_row_values))"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "05eb4899-946c-44c2-bc4f-e2046b236c50",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['radius_mean',\n",
" 'perimeter_mean',\n",
" 'area_mean',\n",
" 'concavity_mean',\n",
" 'radius_se',\n",
" 'perimeter_se',\n",
" 'radius_worst',\n",
" 'perimeter_worst']"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to_drop"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "ccb85aaf-b9e3-47a1-9b79-83f9ac2a2ea6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 569 entries, 0 to 568\n",
"Data columns (total 23 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 diagnosis 569 non-null int64 \n",
" 1 texture_mean 569 non-null float64\n",
" 2 smoothness_mean 569 non-null float64\n",
" 3 compactness_mean 569 non-null float64\n",
" 4 concave points_mean 569 non-null float64\n",
" 5 symmetry_mean 569 non-null float64\n",
" 6 fractal_dimension_mean 569 non-null float64\n",
" 7 texture_se 569 non-null float64\n",
" 8 area_se 569 non-null float64\n",
" 9 smoothness_se 569 non-null float64\n",
" 10 compactness_se 569 non-null float64\n",
" 11 concavity_se 569 non-null float64\n",
" 12 concave points_se 569 non-null float64\n",
" 13 symmetry_se 569 non-null float64\n",
" 14 fractal_dimension_se 569 non-null float64\n",
" 15 texture_worst 569 non-null float64\n",
" 16 area_worst 569 non-null float64\n",
" 17 smoothness_worst 569 non-null float64\n",
" 18 compactness_worst 569 non-null float64\n",
" 19 concavity_worst 569 non-null float64\n",
" 20 concave points_worst 569 non-null float64\n",
" 21 symmetry_worst 569 non-null float64\n",
" 22 fractal_dimension_worst 569 non-null float64\n",
"dtypes: float64(22), int64(1)\n",
"memory usage: 102.4 KB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "00204005-3df0-420d-a39e-8335e2acc8d3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAG4CAYAAABrdsxmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8GUlEQVR4nO3de1yUdd7/8ffAzCCoxCCYIR4jFcQk9PZw22puZZgd1LbbDmql3WJqabXl7m0H01zbtFZNy9ZaOojbmqZ3aYorZbmtrHlnaQlpnvAcwXgCYhiY3x/+ZlYElYFh5hp7PR8PHg+5Dt/rc30ua95e13dmTC6XyyUAAAADCgl0AQAAAOdDUAEAAIZFUAEAAIZFUAEAAIZFUAEAAIZFUAEAAIZFUAEAAIZFUAEAAIZFUAEAAIZFUAFq8Morr6hjx45Vfjp16qSUlBQNGDBATz/9tHbv3l1tv4MHD6pjx44aN25cAKr2r4Y81/379+uaa67Rtm3bJEn/+te/PNfh/vvvv+C+69at82z7wQcf+KymxYsXq2PHjjp58qTPxnQ7+/zO/rn66qt1ww03aPr06SoqKvLJsX744QeNGzdOvXv3Vrdu3TR69Gh99913VbZxOBy64YYblJmZ6ZNjAvVhDnQBgJFdf/31SkxMlCRVVlbq9OnTysvL09KlS/Xhhx9q7ty5uu666zzbR0ZGasKECWrfvn2AKvafhjpXl8ulp556Stdff72uvvrqauu//PJLHT9+XFFRUTXun5WV5dN63MecNWuWz8c9V6dOnXTDDTdIOtOH0tJS7dy5U5mZmfrss8+0fPlyXXbZZXUef/fu3br77rtVWVmpW2+9VSaTSR9++KHuvvtuLV682NNvq9Wqxx57TE8//bSuv/56tWjRwifnB9SJC0A18+bNc3Xo0MG1fPnyGtdv2LDB1blzZ1dKSopr3759fq7u0vbBBx+4EhMTq/Q1JyfH1aFDB1efPn0ueF3Kyspc11xzjSslJeWC23lj1apVrq5du7o6dOjg6tChg+vEiRP1HvNc7vObPHlyjevfeOMNV4cOHVxz5syp13EeeOABV1JSkmvHjh2eZd9//72ra9eurqFDh1bZtrKy0nX77be7Hn744XodE6gvHv0AddCvXz9NnDhRJSUlevXVVwNdziXD5XJp0aJF6tu3r9q0aVNt/a9+9StZLBb9/e9/r3H/jRs3qri4WL/+9a/rXUtRUZHGjx+vxx57TNHR0TXW4y933HGHpDN3dupq3759+uKLL6rcJZSkDh066LbbbtO3336r3Nxcz3KTyaR7771X69at0549e+pePFBPBBWgjoYPH66wsDCtW7dOTqdT0vnnbezcuVNPPPGE+vXrp+TkZKWmpuquu+6q8THFTz/9pGeeeUa/+tWv1LVrV91zzz366quvdP/991d5Af7ggw/UsWNHbdq0SW+++aYGDBig5ORk3XDDDXrttddUUVFRZdzKykotWbJEgwcP1tVXX61u3brpgQce0BdffFGthu3btys9PV3XXnutunTpoptuukmzZ8/W6dOnPdvUdK5Op1Pz58/XrbfeqpSUFPXo0UOjR4/Wpk2batXTzz//XLt379Ztt91W4/omTZqoT58++uKLL1RSUlJtfVZWluLi4tSlS5dq62qaA3LuzyuvvOLZfteuXcrOztbQoUO1cuVKXX755bU6h4ZgNp95Sm+1Wj3L3P2/2I97no475PTs2bPa+O5lmzdvrrJ84MCBMpvNeuuttxritIBaYY4KUEfh4eFKSkrS1q1blZubW+OLoyRt27ZNI0aMkNVq1YABAxQdHa39+/crOztbjzzyiBYuXKj+/ftLkux2u+655x7t379f1157rTp27KicnBzdd999ioqKksViqTb+rFmztHfvXqWlpal///5avXq15syZo59//lmPPvqopDMh5dFHH9XatWvVqlUr3XHHHSopKVF2drZGjx6tp59+Wvfee68kae/evXrggQcUEhKitLQ0RUZGauvWrVq0aJG2b9+ut99++7w9mT59ut577z316NFDffv21alTp/Txxx9r9OjRysjIqPFF8myrVq1SSEiI/vM///O82wwYMEAbNmzQZ599poEDB3qWOxwOffrpp567D+eaMGHCBY8tST169PD8uXXr1vrf//1fdezY8aL7NbTly5dLkm666SbPMvccoYtx3z05cOCAJKlVq1bVtmnZsqWkM3ddztakSRN17dpVa9as0dSpUxUSwr9t4X8EFaAe3P/KLigoOO82c+fOldPp1AcffKArr7zSs/zjjz/Wo48+qlWrVnmCyvz587V//349+eSTGj16tKQzIeOxxx7TmjVrPC8oZ8vPz9fKlSs9jyZGjBihtLQ0LVu2zBNUPvzwQ61du1bXXnutXnnlFUVEREg68+J199136w9/+IP69u2rVq1aaenSpTp16pTefvtt9erVy3Oc9PR0bdiwQbt27dJVV11VrY7Tp09r6dKl+o//+A+9++67nuV33nmnfvOb3ygzM/OiQWXz5s2Kj48/70RZ6cwEZ7PZrPXr11cJKps2bdLJkyeVlpamr7/+utp+Dz/88AWPfa4rrrhCV1xxhVf71Fdubm6VuzplZWXauXOnPv/8cw0ePFj/9V//5VkXGRnp1TkdP37cs9+5mjZtKkk6depUtXXJycnasmWLcnNz1blz51ofD/AVggpQD+5b8Wc/EjnX/fffrzvuuKNKSJH+fbu9sLBQklRRUaGPPvpILVu2rPIW3JCQED355JNat25djeMPGDCgyvyJ+Ph4XXnllcrLy1NZWZnCwsK0YsUKSdLUqVM9IUU686/rhx56SNOmTdPKlSv18MMPq7KyUtKZxz9nB5WZM2dKkqKjo2uso7KyUi6XS0eOHFFBQYFiY2MlSV26dNH69esv+s6RoqIiHT161BPazicqKko9evTQhg0b5HA4PNdg7dq1uuKKK9S1a9cag0owyMvLU15eXrXlISEhCgsLk91uP2//L6a8vFxS1cdHbu5lDoej2rqEhARJ0nfffUdQQUAQVIB6KC4ulqQqL/7n+tWvfiXpzF2XvLw85efna+/evfq///s/SfLMJdm/f79OnDihXr16KTQ0tMoYcXFx532hb9u2bbVl7n8hOxwOhYWFKS8vT5dffnmNt/27desmSZ4XyCFDhuivf/2rZs+ercWLF6tv377q27ev+vTpc8HzjIyM1M0336zVq1erf//+uuaaa9S3b1/179/f82J3Ie7AZrPZLrrtgAED9M9//lObNm1Sv3795HQ69cknn2jw4MEymUw17nP2nYrz6dGjx0Xv+jSkIUOG6IUXXvD8XlZWpqNHj+r999/XokWLtGXLFq1YsUJhYWE6efLkBR/Dud1www1KTExUo0aNJP07sJzNHVDCw8OrrXNfD199jgvgLYIKUA+HDh2SVPNzf7fDhw/r+eef1yeffCKXy6WQkBC1bdtW3bp1044dOzzb2e12SVJMTEyN4zRv3lw//vhjteU1/QvZ/WLtcrkknbnjc6FxJennn3+WdOazPJYuXaqFCxfqs88+09KlS7V06VJFRERo5MiRmjRp0nnDwB//+EclJyfrgw8+0ObNm7V582bNnj1bycnJev7556u82+Rc7scONb1YnuvGG2/UtGnT9Pe//139+vVTTk6Ojh8/XmUOx7nmz59/0XEnTJgQ0KByrrCwMLVp00a//e1vlZ+fr6ysLK1cuVLDhg3TyZMna3VOLVu2VGJioueRT02Pd9zL3AH3bO5weuLEifqcClBnBBWgjo4fP64ffvhBkZGR571j4HK5lJ6erh9++EHp6em64YYbdNVVV6lRo0b66aef9P7773u2bdKkiaTzP0Zy372pi8aNG+vYsWM1rnO/AJ09L6RTp06aM2eOHA6Htm7dqs8//1wffPCBFi5cqMsvv1z33HNPjWNZLBaNGjVKo0aN0uHDh/XFF19o7dq1+sc//qH09HRlZ2fXOCFYkueDzGp6IT1XTEyMUlNTlZ2dreeee07r1q3T5Zdfrmuuuea8+3z//fcXHdfIevbsqaysLM+dr/j4eK/OqV27dpLOvFvoXO5l7m3O5v4kXvcdGcDfmMIN1NHSpUvldDo1cODAao9q3L7//nvt3LlTN954ox599FF16dLF8z9890fwu+96tG/fXhEREZ6PjT/byZMntXfv3jrX2qlTJ506dUo7d+6stm7Lli2S/j0XYeXKlZo+fbpcLpesVqt69uypJ554wvPoxP3I6lwHDhzQyy+/rE8//VTSmcdVd955p95880316tVLx44dq/FF0s19Z8d9Z+liBgwYoKKiIm3ZskXr16/XTTfddN47PZcCd2Co6a5Hbbgf8dX0WSzutyWnpKRUW+e+Hv6eWAy4EVSAOti0aZMWLFigiIgIpaenn3c792OZc5/vHz9+XC+++KIkeT6DxWKx6NZbb9XevXv117/+1bNtZWWlZs2aVePcgtoaOnSoJGnGjBlVPn/kwIEDWrBggSwWiwYNGiRJ+vrrr7V48WKtWbOmyhjukBEXF1fjMRo1aqRFixZp7ty5VSZlOhwOFRQUyGq1eibY1qRp06a64oor9MMPP9TqnAYMGCCTyaSXX35ZhYWFSktLq9V+wchut3vuvtX1w+xatWql1NRUZWVlafv27Z7lO3fu1Icffqjk5OQaJ8vu2rVL0pmwCwQCj36AC1i/fr1nHor7u3527NihLVu2qFGjRvrTn/5U41uG3dq2baurr75aX375pe655x6lpqbKbrdr/fr1cjgcCg8Pr3IHYdKkSdq4caOmTp2q7OxsJSQk6Msvv9SePXvUqFGjOn+Oxe23365PPvlEWVlZuu2229S3b1/P56icPn1aTz31lFq3bi1JevDBB7VmzRr99re/1dq1a9WmTRsdOnRI69atU2xsrIYPH17jMWJjY3XfffcpIyNDt9xyi/r166eQkBBt3LhRu3fv1rhx4zyPt86nb9+++tvf/qbDhw+fNxC5XXHFFerSpYu+/vprXX755UpNTa1TbxqS+y5Ubd9GfO7bk10ul3788UdlZWXp5MmTuvPOO2u861FbU6ZM0fDhwzVy5EjdeuutCg0N1YcffiiXy6Vnn322xn2++uorRUVF8Y4fBAxBBbiA7OxsZWdne34PDw9Xy5YtNXz4cN13332eF/fzCQkJ0auvvqqXX35ZX3zxhb777ju1aNFCffv21UMPPaSXXnpJ69evV35+vlq3bq3o6GjPO242btyozZs3q2vXrnrnnXeUnp5eq4mmNTGZTJozZ44yMzO1bNkyLVu2TOHh4UpJSdHo0aOrvA05Pj5ef/3rX/Xqq6/qq6++0ieffCKbzabbbrtNEyZMuOAntD7xxBNq06aN3n//fa1YsUIVFRVKSEjQCy+8oCFDhly0zuuvv15/+9vf9MUXX+jOO++86PYDBgzQtm3bPHdXjMY92bW2QeXctyeHhoaqadOmSkxM1O23316rHl5IcnKyMjMz9fLLL+ujjz6SxWJRSkqKJk2aVOMHFhYUFGjnzp268847z/t4E2hoJpf7ATmAgMvPz1eLFi2qvZPH4XAoNTVVvXv31qJFiwJUXcNzuVwaNGiQIiMj9d577wW6nHo7deqUevfurW+//TbQpdTJokWL9PLLL+vjjz+ucaIt4A/MUQEMZNy4cerTp49n4qTb22+/rfLyckO9dbYhmEwmpaena+vWrbWeq2Jkq1atCtq5HZWVlVq2bJnS0tIIKQgo7qgABpKZmalp06apRYsWuv766xUeHq4dO3bon//8pzp27Kj3339fYWFhgS6zQVVWVuqee+5R8+bNNW/evECXU2cVFRV66KGH9NhjjwVlWFm5cqWee+45ffjhhxf8nCCgoRFUAINZt26d3n33Xe3atUslJSW64oordNNNNyk9PV2NGzcOdHl+sXfvXg0ePFjvvPOOunbtGuhyfnEcDofS0tI0atSo806eBvyFoAIAAAyLOSoAAMCwCCoAAMCwCCoAAMCwCCoAAMCwLplPprXb7Z7vTPEFs9ksm83m83FRFX32H3rtH/TZP+izfzRkn91jX3Q7nx41gJxOZ72+tM3f46Iq+uw/9No/6LN/0Gf/CGSfefQDAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMyxzoAozs5MF8mU7YZXG5Al1K7YU3Vnl440BXAQCAT3gdVE6cOKF33nlHX3/9tRwOh5KSkjRy5Ei1bNlSkrRw4UJ98sknVfaJjY3VggULJEmVlZVatmyZsrOzVVJSoqSkJI0ePVrNmzf3wen4VsXpkyp9cnSgy/BKoz++IRFUAACXCK+DyqxZs+RyufT73/9ejRo10t/+9jdNmzZN8+bNU1hYmPLz8zVkyBANHDjQs09IyL+fMC1fvlxZWVkaP368oqOjlZmZqRkzZuill16S2cwNHgAA8G9ezVE5ffq0YmNjlZ6eroSEBMXHx+uOO+6Q3W7XgQMH5HK5dODAAV155ZWKiory/ERGRkqSnE6nVq1apWHDhik1NVVt27bVpEmTVFhYqJycnAY5QQAAELy8CipNmjTRxIkT1bp1a0nSyZMntXr1ajVr1kzx8fE6duyYysrKPI+BzrVv3z6VlpYqOTnZs6xx48Zq166dcnNz63EaAADgUlTnZy2vv/66srOzZbFY9OSTT6pRo0bKz8+XJK1Zs0Zbt25VSEiIUlJSdPfddysiIkKFhYWSpJiYmCpj2Ww2zzoAAAC3OgeVQYMG6cYbb9TatWs1a9YsTZs2Tfn5+TKZTLLZbJo8ebKOHTumd999VwcOHNAzzzyjsrKyMwc9Zy6K1WpVcXFx/U7Ex/NbgnW+jMlkksViCXQZtebuc7D2O5jQa/+gz/5Bn/2jIftc2zHrfOT4+HhJ0tixY7Vr1y6tXbtWY8eO1U033aSmTZtKklq3bq2oqChNmTJFu3fvltVqlXRmror7z5LkcDgUFhZW11Iknbkr42v2Y4d8PmZDCw0NlS02NtBleK0hrh9qRq/9gz77B332j0D22augcvLkSW3fvl29evVSaGiopDPv6GnVqpXsdrtCQkI8IcWtVatWkqTCwkLPI5+ioiK1aNHCs43dblebNm3qdSJ2u11Op7NeY5wtWFN6RUWFCgoKAl1GrZnNZtlsNp9fP1RHr/2DPvsHffaPhuyze+yLbufNoMePH9fcuXPVuHFjpaSkSDpzd2Tv3r3q1q2b5s+fL7vdrqefftqzz+7duyWdCSzNmzdXeHi4duzY4QkqxcXF2rt3r9LS0rwppRqn06ny8vJ6jXGuYIwqLpfL533wh4a4fqgZvfYP+uwf9Nk/Atlnr16LW7durWuuuUYZGRlKT09XkyZNtGLFCp0+fVq33HKL9u3bpxdffFHLli3TtddeqyNHjujNN9/Utdde63knUFpamjIzMxUZGanY2FgtXrxYzZo1U8+ePRvkBAEAQPDy+qbBxIkTtWTJEs2dO1fFxcVKTEzUtGnTFBMTo5iYGD366KNauXKlVq5cqcaNG6tPnz666667PPsPGzZMFRUVWrhwoRwOhxITEzVlypSgfdQCAAAajsnlCqYvsjm/goICn96WslgsMhce0+nH7/fZmP7Q6I9vqDzaeF9HcD4Wi0WxsbE+v36ojl77B332D/rsHw3ZZ/fYF8O3JwMAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMiqAAAAMMye7vDiRMn9M477+jrr7+Ww+FQUlKSRo4cqZYtW0qS9u3bp4yMDO3Zs0eRkZEaNGiQbr75Zs/+lZWVWrZsmbKzs1VSUqKkpCSNHj1azZs3991ZAQCAS4LXd1RmzZqlo0eP6ve//71mzpwpq9WqadOmqaysTKdOndL06dPVokULzZw5U7/5zW+UmZmpTz/91LP/8uXLlZWVpfT0dE2fPl2VlZWaMWOGnE6nT08MAAAEP6+CyunTpxUbG6v09HQlJCQoPj5ed9xxh+x2uw4cOKD169fLbDZrzJgxio+PV//+/TVo0CCtXLlSkuR0OrVq1SoNGzZMqampatu2rSZNmqTCwkLl5OQ0xPkBAIAg5lVQadKkiSZOnKjWrVtLkk6ePKnVq1erWbNmio+PV15enpKSkhQaGurZJzk5WUeOHNHx48e1b98+lZaWKjk52bO+cePGateunXJzc310SgAA4FLh9RwVt9dff13Z2dmyWCx68skn1ahRIxUWFqpVq1ZVtouOjpYkFRYWqrCwUJIUExNTZRubzeZZV1dmc51PxS/j+YvJZJLFYgl0GbXm7nOw9juY0Gv/oM/+QZ/9oyH7XNsx63zkQYMG6cYbb9TatWs1a9YszzyVc18k3b+Xl5errKysxuKsVquKi4vrWoqkM2HH1+zHDvl8zIYWGhoqW2xsoMvwWkNcP9SMXvsHffYP+uwfgexznYNKfHy8JGns2LHatWuX1q5dK6vVqvLy8irbuX8PCwuT1WqVdGauivvPkuRwOBQWFlbXUiRJdrvdpxNygzWlV1RUqKCgINBl1JrZbJbNZvP59UN19No/6LN/0Gf/aMg+u8e+6HbeDHry5Elt375dvXr18sxDCQkJUatWrWS32xUTEyO73V5ln6KiIklnHgFVVFR4lrVo0cKzjd1uV5s2bbwppRqn01ktJNVXMEYVl8vl8z74Q0NcP9SMXvsHffYP+uwfgeyzV5Npjx8/rrlz52r79u2eZU6nU3v37lXLli2VmJiovLw8VVZWetZ/++23iouL02WXXaY2bdooPDxcO3bs8KwvLi7W3r17lZiY6IPTAQAAlxKvgkrr1q11zTXXKCMjQzt27FB+fr4WLFig06dP65ZbblH//v1VUlKi1157TQcPHtSGDRu0evVqDR48WNKZ+SppaWnKzMzUli1btH//fs2ZM0fNmjVTz549G+L8AABAEPP66cbEiRO1ZMkSzZ07V8XFxUpMTNS0adM87+SZMmWKMjIyNHnyZEVFRWnEiBG67rrrPPsPGzZMFRUVWrhwoRwOhxITEzVlypSgnRMCAAAajsnlcrkCXYQvFBQU+PT5mcVikbnwmE4/fr/PxvSHRn98Q+XRwfN1BBaLRbGxsT6/fqiOXvsHffYP+uwfDdln99gXw5cSAgAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwyKoAAAAwzJ7u8Pp06e1ZMkSffXVVyotLVXr1q117733qlOnTpKk6dOna/v27VX2SUpK0tSpUyVJDodD77zzjnJycuRwONStWzc98MADioyMrP/ZAACAS4rXQWXOnDk6fvy4Jk6cqMsuu0xr1qzR888/rxdffFFxcXHKz8/Xgw8+qB49evz7IOZ/H+aNN95Qbm6uHn/8cVksFi1atEgvvfSSnnvuOd+cEQAAuGR49ejn6NGj2rZtmx588EElJiYqLi5Oo0aNks1m08aNG3XixAmdOHFCV111laKiojw/TZo0kSQVFRXps88+06hRo5SYmKiEhARNnDhRubm52rlzZ4OcIAAACF5eBZWmTZvqd7/7na688krPMpPJJJPJpOLiYu3fv18mk0lxcXE17p+XlydJ6ty5s2dZXFycoqOjtWPHjrrUDwAALmFePfpp3LixUlNTqyzLycnR0aNHlZKSovz8fEVEROjNN9/Utm3b1KhRI/Xq1Ut33HGHLBaLioqKFBkZKavVWmUMm82mwsLC+p2I2eunWH4dz19MJpMsFkugy6g1d5+Dtd/BhF77B332D/rsHw3Z59qOWa8jf//993rttdfUo0cPpaam6l//+pccDocSEhJ0yy23aN++fXr33Xf1008/acKECSorK6uxMKvVqvLy8vqUIpvNVq/9a2I/dsjnYza00NBQ2WJjA12G1xri+qFm9No/6LN/0Gf/CGSf6xxUvvzyS82bN08dO3bUI488IkkaM2aMRowY4ZmT0rp1a5nNZs2ZM0fDhw+X1WqV0+msNpbD4VBYWFhdS5Ek2e32Gseuq2BN6RUVFSooKAh0GbVmNptls9l8fv1QHb32D/rsH/TZPxqyz+6xL7pdXQZfu3atMjIy1Lt3b02YMMHzoh4aGuoJKW6tWrWSdGYibbNmzXTq1Ck5nc4qQcButys6OroupXg4nc5635U5VzBGFZfL5fM++ENDXD/UjF77B332D/rsH4Hss9cf+LZu3Tr95S9/UVpamiZOnFglcEydOlWvvvpqle13794ts9msFi1aqFOnTnK5XMrNzfWsP3z4sIqKipSYmFiP0wAAAJcir24aHD58WBkZGerRo4eGDBmiEydOeNZZrVb16tVLb731lhISEtS1a1ft3r1b7777rm699VZFREQoIiJCffr00euvv66HHnpIYWFhWrRokTp37qwOHTr4/OQAAEBw8yqo5OTkqKKiQps3b9bmzZurrOvXr5/Gjx8vk8mkNWvW6O2331ZUVJQGDRqkwYMHe7YbM2aM3nrrLc2ePVuSlJKSolGjRtX/TAAAwCXH5HK5XIEuwhcKCgp8+vzMYrHIXHhMpx+/32dj+kOjP76h8ujmgS6j1iwWi2JjY31+/VAdvfYP+uwf9Nk/GrLP7rEvhi8lBAAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhkVQAQAAhmUOdAEAAPxSWEqLpdLiQJdRayaTSSfLSqWw8IDVQFABAMBfSov18+QHA12FV0JfeiugQYVHPwAAwLAIKgAAwLAIKgAAwLAIKgAAwLC8nkx7+vRpLVmyRF999ZVKS0vVunVr3XvvverUqZMk6dtvv9XixYt18OBBxcTE6M4771SfPn08+zscDr3zzjvKycmRw+FQt27d9MADDygyMtJ3ZwUAAC4JXt9RmTNnjnbu3KmJEydq5syZatu2rZ5//nkdPnxYhw4d0syZM5WSkqI//vGP+vWvf6358+dr+/btnv3feOMNffPNN3r88cf1zDPP6PDhw3rppZd8elIAAODS4FVQOXr0qLZt26YHH3xQiYmJiouL06hRo2Sz2bRx40atXr1abdq00V133aWWLVvqtttuU69evfThhx9KkoqKivTZZ59p1KhRSkxMVEJCgiZOnKjc3Fzt3LmzQU4QAAAEL6+CStOmTfW73/1OV155pWeZyWSSyWRScXGxcnNzlZycXGWf5ORk5eXlyeVyKS8vT5LUuXNnz/q4uDhFR0drx44d9TkPAABwCfIqqDRu3FipqamyWCyeZTk5OTp69KhSUlJUVFSkmJiYKvvYbDaVlZXp1KlTKioqUmRkpKxWa7VtCgsL63EaAADgUlSvT6b9/vvv9dprr6lHjx5KTU1VWVmZzOaqQ7pDSXl5eY3r3duUl5fXp5QaxzXSeP5iMpmqBEmjc/c5WPsdTOi1f9Bn/wjWPptMpkCXUCcN0efajlnnI3/55ZeaN2+eOnbsqEceeUTSmcDhdDqrbOdwOCRJYWFhNa53bxMWFlbXUiSduSvja/Zjh3w+ZkMLDQ2VLTY20GV4rSGuH2pGr/2DPvtHsPXZXngs0CXUSSD7XKegsnbtWmVkZKh3796aMGGCJxU1a9ZMRUVFVba12+1q1KiRIiIi1KxZM506dUpOp7NKkrLb7YqOjq7HaZwZo6YQVFfBltLdKioqVFBQEOgyas1sNstms/n8+qE6eu0f9Nk/grXPpoqKQJdQJw3RZ/c1vOh23g68bt06/eUvf9HAgQN1//33V7mNlZiYWG1S7LfffquOHTsqJCREnTp1ksvlUm5urrp06SJJOnz4sIqKipSYmOhtKVU4nc56Pz46VzBGFZfL5fM++ENDXD/UjF77B332j2Drs8XlCnQJdRLIPns1mfbw4cPKyMhQjx49NGTIEJ04cULHjx/X8ePHVVJSooEDB2rXrl3KzMzUoUOH9NFHHyknJ0e33367JCk6Olp9+vTR66+/ru+++04//PCD5s6dq86dO6tDhw4NcoIAACB4eXXTICcnRxUVFdq8ebM2b95cZV2/fv00fvx4TZ48WYsXL9bHH3+s5s2b6+GHH67yluUxY8borbfe0uzZsyVJKSkpGjVqlA9OBQAAXGq8CipDhw7V0KFDL7hNSkqKUlJSzru+UaNGGjt2rMaOHevNoQEAwC8QX0oIAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMi6ACAAAMy1yfnVesWKFvvvlGU6dO9SxbuHChPvnkkyrbxcbGasGCBZKkyspKLVu2TNnZ2SopKVFSUpJGjx6t5s2b16cUAABwCapzUMnKytJ7772nxMTEKsvz8/M1ZMgQDRw40LMsJOTfN26WL1+urKwsjR8/XtHR0crMzNSMGTP00ksvyWyuV24CAACXGK8f/RQVFemFF17Q4sWLFRcXV2Wdy+XSgQMHdOWVVyoqKsrzExkZKUlyOp1atWqVhg0bptTUVLVt21aTJk1SYWGhcnJyfHNGAADgkuF1UNmzZ4/MZrNmz56thISEKuuOHTumsrIytWzZssZ99+3bp9LSUiUnJ3uWNW7cWO3atVNubq63pQAAgEuc189aunfvru7du9e4Lj8/X5K0Zs0abd26VSEhIUpJSdHdd9+tiIgIFRYWSpJiYmKq7Gez2Tzr6srXj42C9TGUyWSSxWIJdBm15u5zsPY7mNBr/6DP/hGsfTaZTIEuoU4aos+1HdOnR87Pz5fJZJLNZtPkyZN17Ngxvfvuuzpw4ICeeeYZlZWV1Vic1WpVcXFxvY5ts9nqtX9N7McO+XzMhhYaGipbbGygy/BaQ1w/1Ixe+wd99o9g67O98FigS6iTQPbZp0Fl6NChuummm9S0aVNJUuvWrRUVFaUpU6Zo9+7dslqtks7MVXH/WZIcDofCwsLqdWy73S6n01mvMc4WbCndraKiQgUFBYEuo9bMZrNsNpvPrx+qo9f+QZ/9I1j7bKqoCHQJddIQfXZfw4tu58uDhoSEeEKKW6tWrSRJhYWFnkc+RUVFatGihWcbu92uNm3a1OvYTqdT5eXl9RrjXMEYVVwul8/74A8Ncf1QM3rtH/TZP4KtzxaXK9Al1Ekg++zTD3ybP3++pk+fXmXZ7t27JZ0JLG3atFF4eLh27NjhWV9cXKy9e/dWe5szAACAT4NKr169tH37di1btkxHjx7V1q1b9dprr+naa69Vy5YtZbFYlJaWpszMTG3ZskX79+/XnDlz1KxZM/Xs2dOXpQAAgEuAT59udO/eXY8++qhWrlyplStXqnHjxurTp4/uuusuzzbDhg1TRUWFFi5cKIfDocTERE2ZMiVo54QAAICGU690MH78+GrLevfurd69e593n5CQEA0fPlzDhw+vz6EBAMAvAF9KCAAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADIugAgAADMtcn51XrFihb775RlOnTvUs27dvnzIyMrRnzx5FRkZq0KBBuvnmmz3rKysrtWzZMmVnZ6ukpERJSUkaPXq0mjdvXp9SAADAJajOd1SysrL03nvvVVl26tQpTZ8+XS1atNDMmTP1m9/8RpmZmfr000892yxfvlxZWVlKT0/X9OnTVVlZqRkzZsjpdNb9LAAAwCXJ66BSVFSkF154QYsXL1ZcXFyVdevXr5fZbNaYMWMUHx+v/v37a9CgQVq5cqUkyel0atWqVRo2bJhSU1PVtm1bTZo0SYWFhcrJyfHJCQEAgEuH10Flz549MpvNmj17thISEqqsy8vLU1JSkkJDQz3LkpOTdeTIER0/flz79u1TaWmpkpOTPesbN26sdu3aKTc3tx6nAQAALkVez1Hp3r27unfvXuO6wsJCtWrVqsqy6Ohoz7rCwkJJUkxMTJVtbDabZ11dmc31mm7T4OP5i8lkksViCXQZtebuc7D2O5jQa/+gz/4RrH02mUyBLqFOGqLPtR3Tp0cuKyur9iLp/r28vFxlZWU1Fme1WlVcXFyvY9tstnrtXxP7sUM+H7OhhYaGyhYbG+gyvNYQ1w81o9f+QZ/9I9j6bC88FugS6iSQffZpULFarSovL6+yzP17WFiYrFarpDNzVdx/liSHw6GwsLB6Hdtut/t0Qm6wpXS3iooKFRQUBLqMWjObzbLZbD6/fqiOXvsHffaPYO2zqaIi0CXUSUP02X0NL7qdLw8aExMju91eZVlRUZGkM4+AKv7/BSoqKlKLFi0829jtdrVp06Zex3Y6ndVCUn0FY1RxuVw+74M/NMT1Q83otX/QZ/8Itj5bXK5Al1AngeyzTz/wLTExUXl5eaqsrPQs+/bbbxUXF6fLLrtMbdq0UXh4uHbs2OFZX1xcrL179yoxMdGXpQAAgEuAT4NK//79VVJSotdee00HDx7Uhg0btHr1ag0ePFjSmfkq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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.describe()\n",
"plt.hist(df['diagnosis'])\n",
"plt.title('Diagnosis (M=1 , B=0)')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d387c1e9-bce6-4b0d-9a60-64abc4428ffc",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 14,
"id": "91687a11-60d1-4f73-9643-7db868ba4d26",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(569, 22)\n"
]
}
],
"source": [
"# creating features and label \n",
"\n",
"X = df.drop('diagnosis', axis = 1)\n",
"y = df['diagnosis']\n",
"print(X.shape)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d7835666-a4a1-4813-a05a-2f78a7226fb9",
"metadata": {},
"outputs": [],
"source": [
"# splitting data into training and test set\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 0)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "597ed2b7-1e2c-4c4a-9dc0-b6fd1584fd9d",
"metadata": {},
"outputs": [],
"source": [
"# scaling data\n",
"\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"scaler = StandardScaler()\n",
"\n",
"X_train = scaler.fit_transform(X_train)\n",
"X_test = scaler.transform(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "2a3673cf-d003-45be-9709-aa624c8ff82d",
"metadata": {},
"outputs": [],
"source": [
"#Logistic Regression"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "56268b65-d0c7-459a-b271-621c24323747",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-1 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-1 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-1 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-1 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-1 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-1 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-1 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-1 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression()</pre></div> </div></div></div></div>"
],
"text/plain": [
"LogisticRegression()"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# fitting data to model\n",
"\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"log_reg = LogisticRegression()\n",
"log_reg.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "0c5dee15-65a4-42db-a13e-830bda27448a",
"metadata": {},
"outputs": [],
"source": [
"# model predictions\n",
"\n",
"y_pred = log_reg.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "9d60f6bb-7df3-45a3-b7b9-941a3a426bc1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9899497487437185\n",
"0.9590643274853801\n",
"[[106 2]\n",
" [ 5 58]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.95 0.98 0.97 108\n",
" 1 0.97 0.92 0.94 63\n",
"\n",
" accuracy 0.96 171\n",
" macro avg 0.96 0.95 0.96 171\n",
"weighted avg 0.96 0.96 0.96 171\n",
"\n"
]
}
],
"source": [
"# accuracy score\n",
"\n",
"from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n",
"\n",
"print(accuracy_score(y_train, log_reg.predict(X_train)))\n",
"\n",
"log_reg_acc = accuracy_score(y_test, log_reg.predict(X_test))\n",
"print(log_reg_acc)\n",
"\n",
"# confusion matrix\n",
"\n",
"print(confusion_matrix(y_test, y_pred))\n",
"\n",
"# classification report\n",
"\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "4562d0a2-f764-4616-bb97-51bfed00c49f",
"metadata": {},
"outputs": [],
"source": [
"#K Neighbors Classifier (KNN)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "e5f1df4d-ca96-43a1-8075-f4154f7e8423",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-2 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-2 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-2 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-2 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-2 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-2 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-2 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-2 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-2 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier()</pre></div> </div></div></div></div>"
],
"text/plain": [
"KNeighborsClassifier()"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"\n",
"knn = KNeighborsClassifier()\n",
"knn.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "6b97f6ac-8aaf-4d21-bb52-7daf80946b1b",
"metadata": {},
"outputs": [],
"source": [
"# model predictions \n",
"\n",
"y_pred = knn.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "b5c9a2e3-f6c1-4b0d-b3fb-3062a1f94601",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9623115577889447\n",
"0.935672514619883\n"
]
}
],
"source": [
"# accuracy score\n",
"\n",
"print(accuracy_score(y_train, knn.predict(X_train)))\n",
"\n",
"knn_acc = accuracy_score(y_test, knn.predict(X_test))\n",
"print(knn_acc)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "e883bd32-64a0-4b11-acfb-caaf79e2e4d4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[105 3]\n",
" [ 8 55]]\n"
]
}
],
"source": [
"# confusion matrix\n",
"\n",
"print(confusion_matrix(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "f7efba3c-78c6-416e-a0a6-37b3e1274792",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 0.93 0.97 0.95 108\n",
" 1 0.95 0.87 0.91 63\n",
"\n",
" accuracy 0.94 171\n",
" macro avg 0.94 0.92 0.93 171\n",
"weighted avg 0.94 0.94 0.94 171\n",
"\n"
]
}
],
"source": [
"# classification report\n",
"\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "257247cb-3666-4f34-9fcb-4f577a0f76d0",
"metadata": {},
"outputs": [],
"source": [
"#Support Vector Machine (SVM)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "9b313b13-c437-4a06-8dbd-687744187b8e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-3 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-3 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-3 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-3 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-3 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-3 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-3 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-3 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-3 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-3 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-3 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-3 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-3 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-3 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-3 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-3 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(estimator=SVC(probability=True),\n",
" param_grid={'C': [0.01, 0.05, 0.5, 0.1, 1, 10, 15, 20],\n",
" 'gamma': [0.0001, 0.001, 0.01, 0.1]})</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(estimator=SVC(probability=True),\n",
" param_grid={'C': [0.01, 0.05, 0.5, 0.1, 1, 10, 15, 20],\n",
" 'gamma': [0.0001, 0.001, 0.01, 0.1]})</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: SVC</label><div class=\"sk-toggleable__content fitted\"><pre>SVC(probability=True)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(probability=True)</pre></div> </div></div></div></div></div></div></div></div></div>"
],
"text/plain": [
"GridSearchCV(estimator=SVC(probability=True),\n",
" param_grid={'C': [0.01, 0.05, 0.5, 0.1, 1, 10, 15, 20],\n",
" 'gamma': [0.0001, 0.001, 0.01, 0.1]})"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"svc = SVC(probability=True)\n",
"parameters = {\n",
" 'gamma' : [0.0001, 0.001, 0.01, 0.1],\n",
" 'C' : [0.01, 0.05, 0.5, 0.1, 1, 10, 15, 20]\n",
"}\n",
"\n",
"grid_search = GridSearchCV(svc, parameters)\n",
"grid_search.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "8e4df41f-e105-4673-9fdf-f18db0ebbbe7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9774683544303798"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# best parameters\n",
"\n",
"grid_search.best_params_\n",
"\n",
"# best score \n",
"\n",
"grid_search.best_score_"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "6076c39d-66fa-47f2-bffb-6575d3375b4c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-4 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-4 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-4 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-4 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-4 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-4 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-4 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-4 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-4 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-4 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-4 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-4 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-4 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-4 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-4 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-4 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>SVC(C=10, gamma=0.01, probability=True)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" checked><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=10, gamma=0.01, probability=True)</pre></div> </div></div></div></div>"
],
"text/plain": [
"SVC(C=10, gamma=0.01, probability=True)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"svc = SVC(C = 10, gamma = 0.01, probability=True)\n",
"svc.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "1f87cfee-c742-4c21-beaf-ab385161289a",
"metadata": {},
"outputs": [],
"source": [
"# model predictions \n",
"\n",
"y_pred = svc.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "0d2dbb00-9681-440b-9c0b-db06448077d4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9874371859296482\n",
"0.9766081871345029\n",
"[[107 1]\n",
" [ 3 60]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.97 0.99 0.98 108\n",
" 1 0.98 0.95 0.97 63\n",
"\n",
" accuracy 0.98 171\n",
" macro avg 0.98 0.97 0.97 171\n",
"weighted avg 0.98 0.98 0.98 171\n",
"\n"
]
}
],
"source": [
"# accuracy score\n",
"\n",
"print(accuracy_score(y_train, svc.predict(X_train)))\n",
"\n",
"svc_acc = accuracy_score(y_test, svc.predict(X_test))\n",
"print(svc_acc)\n",
"\n",
"# confusion matrix\n",
"\n",
"print(confusion_matrix(y_test, y_pred))\n",
"\n",
"# classification report\n",
"\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "81886176-aad3-4c2d-a285-4fd3f3d1ebca",
"metadata": {},
"outputs": [],
"source": [
"#Decision Tree Classifier"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "c1678772-3656-4443-9f16-fc749ecc3b54",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fitting 5 folds for each of 8640 candidates, totalling 43200 fits\n"
]
},
{
"data": {
"text/html": [
"<style>#sk-container-id-5 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-5 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-5 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-5 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-5 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-5 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-5 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-5 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-5 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-5 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-5 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-5 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-5 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-5 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-5 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-5 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(), n_jobs=-1,\n",
" param_grid={'criterion': ['gini', 'entropy'],\n",
" 'max_depth': range(2, 32),\n",
" 'min_samples_leaf': range(1, 10),\n",
" 'min_samples_split': range(2, 10),\n",
" 'splitter': ['best', 'random']},\n",
" verbose=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(), n_jobs=-1,\n",
" param_grid={'criterion': ['gini', 'entropy'],\n",
" 'max_depth': range(2, 32),\n",
" 'min_samples_leaf': range(1, 10),\n",
" 'min_samples_split': range(2, 10),\n",
" 'splitter': ['best', 'random']},\n",
" verbose=1)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier()</pre></div> </div></div></div></div></div></div></div></div></div>"
],
"text/plain": [
"GridSearchCV(cv=5, estimator=DecisionTreeClassifier(), n_jobs=-1,\n",
" param_grid={'criterion': ['gini', 'entropy'],\n",
" 'max_depth': range(2, 32),\n",
" 'min_samples_leaf': range(1, 10),\n",
" 'min_samples_split': range(2, 10),\n",
" 'splitter': ['best', 'random']},\n",
" verbose=1)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.tree import DecisionTreeClassifier\n",
"\n",
"dtc = DecisionTreeClassifier()\n",
"\n",
"parameters = {\n",
" 'criterion' : ['gini', 'entropy'],\n",
" 'max_depth' : range(2, 32, 1),\n",
" 'min_samples_leaf' : range(1, 10, 1),\n",
" 'min_samples_split' : range(2, 10, 1),\n",
" 'splitter' : ['best', 'random']\n",
"}\n",
"\n",
"grid_search_dt = GridSearchCV(dtc, parameters, cv = 5, n_jobs = -1, verbose = 1)\n",
"grid_search_dt.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "96fb1e94-efa2-4981-82d4-2e6049c70031",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'criterion': 'entropy',\n",
" 'max_depth': 12,\n",
" 'min_samples_leaf': 4,\n",
" 'min_samples_split': 2,\n",
" 'splitter': 'random'}"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# best parameters\n",
"\n",
"grid_search_dt.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "c9880239-069c-4ee8-b5d7-15c97ffcb467",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9623734177215189"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# best score\n",
"\n",
"grid_search_dt.best_score_"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "f2a4bd0f-3c12-41ea-a335-4212fb48030b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-6 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-6 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-6 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-6 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-6 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-6 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-6 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-6 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-6 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-6 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-6 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-6 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-6 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-6 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-6 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-6 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-6 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-6 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-6 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-6 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(criterion='entropy', max_depth=19, min_samples_leaf=4,\n",
" min_samples_split=6, splitter='random')</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" checked><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(criterion='entropy', max_depth=19, min_samples_leaf=4,\n",
" min_samples_split=6, splitter='random')</pre></div> </div></div></div></div>"
],
"text/plain": [
"DecisionTreeClassifier(criterion='entropy', max_depth=19, min_samples_leaf=4,\n",
" min_samples_split=6, splitter='random')"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dtc = DecisionTreeClassifier(criterion= 'entropy', max_depth= 19, min_samples_leaf= 4, min_samples_split= 6, splitter= 'random')\n",
"dtc.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "682c5cf4-bc68-4751-ad34-6b21b24e232e",
"metadata": {},
"outputs": [],
"source": [
"y_pred = dtc.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "c7c6d8a4-9c4e-4d9c-b1fc-b2e4cd93f224",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9673366834170855\n",
"0.9298245614035088\n",
"[[100 8]\n",
" [ 4 59]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.96 0.93 0.94 108\n",
" 1 0.88 0.94 0.91 63\n",
"\n",
" accuracy 0.93 171\n",
" macro avg 0.92 0.93 0.93 171\n",
"weighted avg 0.93 0.93 0.93 171\n",
"\n"
]
}
],
"source": [
"# accuracy score\n",
"\n",
"print(accuracy_score(y_train, dtc.predict(X_train)))\n",
"\n",
"dtc_acc = accuracy_score(y_test, dtc.predict(X_test))\n",
"print(dtc_acc)\n",
"\n",
"# confusion matrix\n",
"\n",
"print(confusion_matrix(y_test, y_pred))\n",
"\n",
"# classification report\n",
"\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "6295c993-7685-4e18-90a7-ccc6864d2502",
"metadata": {},
"outputs": [],
"source": [
"#Model Comparison"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "1c52303f-c9ca-46cc-833b-136d95546b1c",
"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>Model</th>\n",
" <th>Score</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>SVM</td>\n",
" <td>97.66</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Logistic Regression</td>\n",
" <td>95.91</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>KNN</td>\n",
" <td>93.57</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Decision Tree Classifier</td>\n",
" <td>92.98</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Model Score\n",
"2 SVM 97.66\n",
"0 Logistic Regression 95.91\n",
"1 KNN 93.57\n",
"3 Decision Tree Classifier 92.98"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"models = pd.DataFrame({\n",
" 'Model': ['Logistic Regression', 'KNN', 'SVM', 'Decision Tree Classifier'],\n",
" 'Score': [100*round(log_reg_acc,4), 100*round(knn_acc,4), 100*round(svc_acc,4), 100*round(dtc_acc,4)]\n",
"})\n",
"models.sort_values(by = 'Score', ascending = False)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "54f350fc-845d-448c-b7ef-76ab096d9f94",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1]\n",
"M\n"
]
}
],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"input_data =(10.38, 0.1184, 0.2776, 0.1471, 0.2419, 0.07871, 0.9053, 153.4, 0.006399, 0.04904, 0.05373, 0.01587, 0.03003, 0.006193, 17.33, 2019.0, 0.1622, 0.6656, 0.7119, 0.2654, 0.4601, 0.1189\n",
")\n",
"#100,12,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,1) \n",
"\n",
"'''(14.36,0.09779,0.08129,0.04781,0.1885,0.05766,0.7886,23.56,0.008462,\n",
"0.0146,0.02387,0.01315,0.0198,0.0023,15.11,711.2,0.144,0.1773,0.239,0.1288,0.2977,0.07259\n",
")'''\n",
"\n",
"from sklearn import svm\n",
"# changing the input_data to numpy array\n",
"input_data_as_numpy_array = np.asarray(input_data)\n",
"model = LogisticRegression()\n",
"model.fit(X_test, y_test)\n",
"\n",
"# reshape the array as we are predicting for one instance\n",
"input_data_reshaped = input_data_as_numpy_array.reshape(1,-1)\n",
"predictions = model.predict(input_data_reshaped)\n",
"print(predictions)\n",
"if (predictions == 0):\n",
" print('B')\n",
"else:\n",
" print('M')"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "06e06ade-cff3-45ae-95cd-c8eb82bd21fd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: LR\n",
"Mean Accuracy: 95.91%\n",
"Mean ROC AUC: 99.37%\n",
"------------------------------\n",
"Model: DT\n",
"Mean Accuracy: 92.98%\n",
"Mean ROC AUC: 95.06%\n",
"------------------------------\n",
"Model: SVM\n",
"Mean Accuracy: 97.66%\n",
"Mean ROC AUC: 99.81%\n",
"------------------------------\n",
"Model: KNN\n",
"Mean Accuracy: 93.57%\n",
"Mean ROC AUC: 97.02%\n",
"------------------------------\n"
]
},
{
"data": {
"image/png": "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pjtqERWHvtoWwy4REREViYWFBVJTUxl4Se9UKhVSU1NhYWFR7HXxAjUiIiIqEplMBktLS6SlpZXYNhS5QMpzZYmt3yAkQI4CeP40BWIaytnIVAFjM6ne1mdpaQmZrPhRlWGXiIiIikwmk5XojSUykqW4eKZ83XzhbdQ3Lvlr0zVR3bik92R/2DiXvRvjsBsDEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiZbM0AUUhlKpxLZt2xAZGYm0tDR4eHhg4MCBkMvlAIDY2FisWbMG0dHRsLGxQefOndGpUycDV01EREREhlYuzuyGhYUhIiICI0eOxNdff43KlStj7ty5SEpKQmpqKmbNmoVKlSph3rx56N27NzZs2IAjR44YumwiIiIiMrBycWb37NmzCAwMRL169QAAgwcPxuHDh3Hr1i08evQIMpkMH3zwAaRSKVxdXfH48WPs2LEDbdq0MXDlRERERGRI5eLMrq2tLc6fP49nz55BpVLh0KFDMDY2hpubG6KiouDj4wOpVKpZ3tfXF48fP0ZycrLhiiYiIiIigysXZ3aHDBmCRYsWYezYsTAyMoKRkREmT56MSpUqISEhAVWrVtVa3sHBAQCQkJAAOzu7Im1TJiu9p0YiESCRSEpte6VBvTsSSAAR7ZpEIoGxsbGhy9CZ2NoY21fZwvZVfpTHNia29gWIt42VZvvSJaeVi7D78OFDWFhYYMqUKXBwcEBERASWLFmCr776CtnZ2XmeWPXfubm5Rd6mvb19sWrWRdaLpFIN16VHAalM+vbFyhETExM4OTkZugydibONsX2VFWxf5Ud5bGPibF+AGNtYWW1fZb71PH/+HEuWLMGMGTNQq1YtAICXlxcePnyI33//HSYmJnlCrfpvU1PTIm83KSkJCoWi6IXrICdXKLVtlRb1t1alQgkBgmGL0aOcnBzEx8cbugydia2NsX2VLWxf5Ud5bGNia1+AeNtYabYvmUxW6BOTZT7s3rlzBwqFAl5eXlrTa9SogQsXLsDJyQlJSUla8xITEwH8252hKBQKRbHODOtCEKQQBPE09pdeHskCBFHtmyAIpdYu9El8bYztqyxh+yo/ymMbE1/7AsTaxspq+yrzF6ipA+v9+/e1pt+/fx+VK1dGrVq1EBUVBZVKpZl39epVVKlSBba2tqVaKxERERGVLWU+7FavXh01a9bEsmXLcPXqVTx+/BibN2/GlStX0KNHD7Rp0wYZGRlYsWIFHj58iKNHj2LPnj3o0aOHoUsnIiIiIgMr890YjIyMMHXqVGzevBnLly9Heno6qlWrhi+++AI1atQAAHz++edYs2YNpk2bBjs7O4SGhqJ169aGLZyIiIiIDK7Mh10AsLKywvvvv1/g/OrVq2POnDmlWBERERERlQdlvhsDEREREVFRMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaDHsEhEREZFoMewSERERkWgx7BIRERGRaMmK+sCsrCwkJCQgIyMD1tbWcHBwgImJiT5rIyIiIiIqFp3Cbm5uLo4cOYLjx4/jzp07UKlUmnlGRkbw8fFBs2bN0KpVKxgbG+u9WCIiIiIiXRQ67B49ehQbNmxAbm4uGjZsiGbNmsHZ2RmmpqZIT09HQkICoqKisHHjRmzduhUhISF45513SrJ2IiIiIqI3KlTYnT9/PpKTkzF8+HA0bNiwwLO2nTt3Rm5uLk6dOoVdu3bhzJkz+PTTT/VaMBERERFRYRUq7DZp0gRt2rQp1AqNjY3RsmVLtGjRAkeOHClWcURERERExVGo0RgKG3RfJZFIEBQUpPPjiIiIiIj0pcijMQCAQqHA7du3kZycDFtbW9SoUYMXphER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zg6LFy/GvXv3cPbsWWzcuBFdunQRaR8fIiIiIiosndNgrVq1MH36dGzatAk7d+4EAOzevRuenp749NNP4evrq/cie/XqBVNTU2zevBmJiYlwcXHBxx9/jNq1awN4OQzZzz//jM8++wxWVlZ499130atXL73XQURERETlS5FOffr4+GDWrFnIyclBWloaLCwsinUxWGF06dIFXbp0yXdepUqVMH369BLdPhERERGVPzp3YwCAHTt2YN68eTAxMYGDgwPu3r2LDz74APv27dN3fURERERERaZz2N21axc2b96MypUra6ZVrFgRzZo1w2+//YaIiAi9FkhEREREVFQ6d2M4ePAg+vXrhx49emimVahQAUOHDoWtrS327NmDd955R581EhEREREVic5ndhMTE1G9evV858nlcjx79qzYRRERERER6YPOYdfJyQmXL1/Od97169fh6OhY7KKIiIiIiPRB524M77zzDjZs2ACFQoHGjRvD1tYWKSkpOH/+PHbv3o0BAwaURJ1ERERERDrTOex26dIFSUlJ2Lt3L/bs2aOZLpVK0alTpwKHByMiIiIiKm1FGmc3NDQUvXr1wq1btzTj7NaoUQPW1tb6ro+IiIiIqMiKfD9dCwsL+Pn56bEUIiIiIiL90jns5uTkICwsDP/88w+ysrIgCILWfIlEgh9++EFvBRIRERERFZXOYXfNmjU4fPgwateuDTc3NxgZFekmbEREREREJU7nsPv333+jf//+WjeVICIiIiIqi3Q+LatUKgu8qQQRERERUVmic9itV68eLl68WAKlEBERERHpl87dGAICArBq1Sq8ePECNWrUgKmpaZ5lWrVqpZfiiIiIiIiKQ+ewu2jRIgDAsWPHcOzYsXyXYdglIiIiorJA57C7dOnSkqiDiIiIiEjvdA67Tk5Ob5z/+ri7RERERESGUqQ7qJ08eRLXr19Hbm6uJtwKgoDs7GzcunULK1eu1GuRRERERERFoXPY3bp1K7Zt2wYLCwsolUpIpVLIZDKkpKRAIpHgnXfeKYk6iYiIiIh0pvPQY5GRkWjZsiVWr16Nzp07o2HDhli1ahXmzZsHa2trVK1atSTqJCIiIiLSmc5hNzExES1atIBEIoG7uztu3boFAPD09ERwcDAiIiL0XiQRERERUVHoHHZfHVe3cuXKePbsGXJycgAA7u7uePbsmf6q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9OgR1qxZg8aNGyM4OBgvXrxAcnIykpOTkZGRgY4dO+L27dvYsGED4uLisGvXLpw+fRrdu3c3dOlEREREZGBl/szu6dOnoVQqcebMGZw5c0ZrXqtWrTBmzBhMmzYN69evx969e+Hs7Ixx48blGY6MiIiIiP57ynzY7dmzJ3r27PnGZfz8/ODn51c6BRERERFRuVHmuzEQERERERUVwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiRbDLhERERGJFsMuEREREYkWwy4RERERiZbM0AXog0qlwrZt2xAREYGMjAz4+Phg+PDhcHZ2NnRpRERERGRAojizGxYWhv3792PkyJGYNWsWVCoV5syZA4VCYejSiIiIiMiAyn3YVSgU2L17N/r27YsGDRrA3d0dEydOREJCAk6fPm3o8oiIiIjIgMp9N4bY2FhkZmbC19dXM83S0hIeHh64ceMGAgMDi7ReU1NTyGSl8/QoswU4VDItlW2VFokEMLMAKrvbQ4Bg6HL0xtzSFObm5oYuQ2dia2NsX2UL21f5UR7bmNjaFyDeNlaa7UsqlRZ62XIfdhMSEgAAFSpU0Jpub2+vmVcUNjY2xapLF/b2QFWPUttcqapR18XQJRDE28bYvsoGti8qSWJtXwDbWGkp990YsrOzASDPWVgTExPk5uYaoiQiIiIiKiPKfdg1MTEBgDwXo+Xk5MDUVFw/exARERGRbsp92FV3X0hMTNSanpSUBAcHB0OURERERERlRLkPu25ubjA3N8f169c109LT0xETE4NatWoZsDIiIiIiMrRyf4GasbExOnTogA0bNsDGxgZOTk5Yv349HB0d0aRJE0OXR0REREQGJBEEodyPeaFSqbBx40YcPXoUOTk5qFWrFu+gRkRERETiCLtERERERPkp9312iYiIiIgKwrBLRERERKLFsEtEREREosWwS0RERESixbBLRERERKLFsEtEREREosWwS0RERESixbBLRERUBBymnqh8YNglonLr8OHDOHfunKHLoP+QlStX4uDBgwAAiURi4GpIrFQqlaFLEBWGXSoRR44cwb59+3DmzBketFQiNm/ejB9//BFZWVmGLoX+Iw4cOIAjR45g7969uHDhAgCe3SX9SUtLw4YNGwAARkZGbFt6JDN0ASQuWVlZmDVrFpKSkpCbm4uUlBR06NABISEhsLS0NHR5JBKLFy/G1atXMX/+fHh4eBi6HPqPcHZ2ho2NDczNzbF9+3bY2trC09MTKpUKRkY8d0TFc/bsWYSHh0OlUiE0NJS/HOgRj07Sm/v372PMmDGws7PDrFmzMHv2bAwdOhT79+9HXFycocsjEcjKysLMmTNx6tQpfPDBB5qgyzMgVBr8/PxQoUIFKJVK2NjYYPPmzUhKSoKRkRF/waJi8/f3R3BwMP766y+Eh4cbuhxRYdglvTh16hSmTZuG1q1bY8qUKXB0dETFihXRuHFjmJubIyYmxtAlUjl37949jBkzBpaWlqhYsSL27NmD2NhYAOw7SSVPqVQCALp3746KFSuiWrVqSElJwYYNG6BQKPizMxWJ+kuSSqWCtbU1WrZsiUaNGmHHjh34559/tJahomPYpWI7efIkFi9ejEmTJiE0NBSCICA3N1czv0KFCqhevTqAfw9afiiQLm7duoXp06ejZcuWmDJlCr788ktER0djx44diI+PN3R5JEK7d+9GVFSU5m+pVAoAsLOzQ0ZGBgICAtCyZUvcvXsXmzdvBvDySxff26iwMjIyNN1f1P91cnLCO++8A29vb6xZswb379/nLwd6wLBLxaJQKJCSkgIASExM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6dOn0aVLF615J0+eRNOmTXHhwgXNtJycHOzcuRN//fUX4uPj4ejoiKCgIHTr1g1GRv+exzh48CB2796N58+fo3r16mjTpk2ebT9//hzr16/HpUuXkJubC7lcjtDQUHh4eORba05ODn777TecO3cOKSkpcHZ21mybiKis4ZldIqIyIiAgIE9XhoyMDFy8eBHNmzfXTBMEAQsWLMDOnTsRFBSEadOmoWnTpti8eTNWrVqlWW7fvn1YtWoV6tevj6lTp6JGjRr46aeftLaZkpKC6dOnIyYmBsOHD8eECRMgCAK+/PJLPHz4MN86165diwsXLiA0NBSff/45/P39sX79ehw5ckTPzwgRUfHxzC4RURnRoEEDmJqa4tSpU5qzu2fOnIGNjQ1q1qypWe7ixYu4cuUKJkyYoAnBdevWhampKbZs2YJOnTrB1dUVYWFhCAgIwJAhQwAA9erVQ2ZmJg4ePKhZ1549e5CamopZs2bByckJAFC/fn1MmjQJv//+Oz766KM8dV6/fh1169bVbLt27dowMzODra1tiTwvRETFwTO7RERlhImJCRo2bIjTp09rpp08eRIBAQGQSCSaadeuXYNUKkWzZs20Ht+iRQsAL8Poo0eP8OLFCzRs2FBrmdcfc/XqVbi7u8PBwQFKpRJKpRISiQR+fn64fPlyvnXWrl0bERERmDdvHvbt24dnz56hd+/eaNCgQbH2n4ioJPDMLhFRGRIQEICFCxciISEBJiYmuHLlCvr166e1TFpaGqytrbX65gKAnZ0dACA9PR1paWkAAGtra61l7O3ttf5OTU3FkydP0L9//3zryc7OzjNtyJAhcHR0xPHjx7F69WqsXr0acrkc77//Ptzd3XXZXSKiEsewS0RUhvj5+cHMzAynT5+GqakpnJ2d4enpqbWMlZUVUlNToVKptAJvcnIyAMDGxkYTcl+8eKH12NTUVK2/LS0t4ePjg9DQ0HzrMTY2zndaz5490bNnTzx//hznzp1DWFgYlixZgu+++07nfSYiKknsxkBEVIYYGxujUaNGOH36NE6dOqV1YZqaj48PlEplnmHKjh07BgCoWbMmKleuDEdHxzzLvD5eb61atfDo0SNUrlwZXl5emn/Hjh3D4cOH85w9zsnJwYQJE7Br1y4AQIUKFdChQwc0b94c8fHxxd5/IiJ945ldIqIyJiAgAAsWLIBEIsGwYcPyzK9fvz5q166NH3/8EYmJiXBzc8P169fx559/olWrVnB1dQUADBw4EEuWLMHKlSvRrFkz3Lp1CwcOHNBaV5cuXXD8+HHMmjULXbt2hbW1NU6ePImIiAi89957ebZtYmICDw8PbNu2DTKZDG5ubnj06BEiIyPRtGnTknlCiIiKgWGXiKiMqVu3LiwsLFChQgW4uLjkmS+RSPDJJ59gy5Yt2LNnj2as2/79+2uN0RsYGAgjIyOEhYXh+PHjqFatGj744AN8//33mmUcHBwwa9YsbNy4EatWrUJubi4qV66MDz/8EEFBQfnWN3LkSGzevBm7du1CcnIybG1tERQUhL59++r/ySAiKiaJIAiCoYsgIiIiIioJ7LNLRERERKLFsEtEREREosWwS0RERESixbBLRERERKLFsEtEREREosWwS0RERESixbBLRERERKLFsEtEREREosWwS0RERESixbBLRERERKLFsEtEREREovV/oR6LB+OKB0kAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn import metrics\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Define models with labels\n",
"models = [\n",
" {'label': 'LR', 'model': log_reg},\n",
" {'label': 'DT', 'model': dtc},\n",
" {'label': 'SVM', 'model': svc},\n",
" {'label': 'KNN', 'model': knn}\n",
"]\n",
"\n",
"# Performance metrics\n",
"means_roc = []\n",
"means_accuracy = []\n",
"\n",
"# Evaluate each model\n",
"for m in models:\n",
" model = m['model']\n",
" label = m['label']\n",
" \n",
" # Calculate predictions and probabilities\n",
" y_pred = model.predict(X_test)\n",
" y_pred_prob = model.predict_proba(X_test)[:,1] if hasattr(model, 'predict_proba') else None\n",
" \n",
" # Calculate accuracy\n",
" accuracy = metrics.accuracy_score(y_test, y_pred)\n",
" mean_accuracy = 100 * round(accuracy, 4)\n",
" means_accuracy.append(mean_accuracy)\n",
" \n",
" # Calculate ROC AUC\n",
" if y_pred_prob is not None:\n",
" auc = metrics.roc_auc_score(y_test, y_pred_prob)\n",
" mean_roc = 100 * round(auc, 4)\n",
" else:\n",
" mean_roc = np.nan # Append NaN if predict_proba is not available\n",
" \n",
" means_roc.append(mean_roc)\n",
" \n",
" # Display mean accuracy and mean ROC for each model\n",
" print(f\"Model: {label}\")\n",
" print(f\"Mean Accuracy: {mean_accuracy:.2f}%\")\n",
" print(f\"Mean ROC AUC: {mean_roc:.2f}%\")\n",
" print(\"-\" * 30)\n",
"\n",
"# Plotting\n",
"index = np.arange(len(models))\n",
"bar_width = 0.35\n",
"\n",
"# Create plot\n",
"fig, ax = plt.subplots(figsize=(8, 5))\n",
"\n",
"rects1 = plt.bar(index, means_accuracy, bar_width, alpha=0.8, color='mediumpurple', label='Accuracy (%)')\n",
"rects2 = plt.bar(index + bar_width, means_roc, bar_width, alpha=0.8, color='rebeccapurple', label='ROC AUC (%)')\n",
"\n",
"# Labeling\n",
"ax.set_xlabel('Models')\n",
"ax.set_ylabel('Performance (%)')\n",
"ax.set_title('Performance Evaluation - Breast Cancer Prediction')\n",
"ax.set_xticks(index + bar_width / 2)\n",
"ax.set_xticklabels([m['label'] for m in models], rotation=40, ha='center')\n",
"ax.legend()\n",
"\n",
"# Display plot\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "cff6a609-fd28-43b7-bf32-879226455388",
"metadata": {},
"outputs": [],
"source": [
"\n",
"import pickle\n",
"model = log_reg\n",
"filename = r'C:\\Users\\Pranshu Saini\\Desktop\\disease-prediction-main\\docpat\\model\\breast_cancer_svm_model.pkl'\n",
"pickle.dump(model, open(filename,'wb'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "38d0b155-68d7-4b66-850d-5eefedf09eae",
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 159-160: truncated \\UXXXXXXXX escape (1223555901.py, line 8)",
"output_type": "error",
"traceback": [
"\u001b[1;36m Cell \u001b[1;32mIn[57], line 8\u001b[1;36m\u001b[0m\n\u001b[1;33m return breast_cancer_model.predict(inputs)'''\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 159-160: truncated \\UXXXXXXXX escape\n"
]
}
],
"source": [
"'''import pickle\n",
"def load_model(path):\n",
" with open(path, 'rb') as file:\n",
" model = pickle.load(file)\n",
" return model\n",
"breast_cancer_model = load_model(r'C:\\Users\\DELL\\Desktop\\app\\breast_cancer.pkl')\n",
"def predict(inputs):\n",
" return breast_cancer_model.predict(inputs)'''"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "29b7193c-5ee9-4324-be94-85c758937ff3",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d00dae6-9852-45c0-bddd-828316c8b1df",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "e8cb62fc-c2ba-4f52-8d41-a88f89ef09b6",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}