2309 lines
127 KiB
Plaintext
2309 lines
127 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "e46934d2-da89-44cb-a2e2-0491b10c1350",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.neighbors import KNeighborsClassifier\n",
|
||
"# from sklearn.metrics import confusion_matrix, roc_curve, roc_auc_score, RocCurveDisplay\n",
|
||
"from sklearn.metrics import confusion_matrix, recall_score, precision_score, roc_auc_score, roc_curve, accuracy_score, RocCurveDisplay\n",
|
||
"\n",
|
||
"import matplotlib.pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "a320a6f1-c80e-4e53-959d-ddf3488f9302",
|
||
"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>Enroll</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Income</th>\n",
|
||
" <th>Hours</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>18000</td>\n",
|
||
" <td>14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>43</td>\n",
|
||
" <td>13000</td>\n",
|
||
" <td>9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>42000</td>\n",
|
||
" <td>16</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>100000</td>\n",
|
||
" <td>13</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>13000</td>\n",
|
||
" <td>12</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Enroll Age Income Hours\n",
|
||
"0 1 26 18000 14\n",
|
||
"1 0 43 13000 9\n",
|
||
"2 1 55 42000 16\n",
|
||
"3 1 55 100000 13\n",
|
||
"4 0 55 13000 12"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Load the data\n",
|
||
"gymEnrollAgeIncomeHoursDf = pd.read_excel(\"gym.xlsx\")\n",
|
||
"gymEnrollAgeIncomeHoursDf.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "5c204cb7-ccaa-4f83-8d44-92adc224e876",
|
||
"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>Enroll</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Income</th>\n",
|
||
" <th>Hours</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>count</th>\n",
|
||
" <td>1000.000000</td>\n",
|
||
" <td>1000.000000</td>\n",
|
||
" <td>1000.000000</td>\n",
|
||
" <td>1000.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>mean</th>\n",
|
||
" <td>0.403000</td>\n",
|
||
" <td>44.582000</td>\n",
|
||
" <td>68340.000000</td>\n",
|
||
" <td>10.182000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>std</th>\n",
|
||
" <td>0.490746</td>\n",
|
||
" <td>13.876737</td>\n",
|
||
" <td>44466.928247</td>\n",
|
||
" <td>4.671263</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>min</th>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>21.000000</td>\n",
|
||
" <td>1000.000000</td>\n",
|
||
" <td>2.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25%</th>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>32.000000</td>\n",
|
||
" <td>31000.000000</td>\n",
|
||
" <td>6.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>50%</th>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>45.000000</td>\n",
|
||
" <td>64000.000000</td>\n",
|
||
" <td>10.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>75%</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>57.000000</td>\n",
|
||
" <td>97000.000000</td>\n",
|
||
" <td>14.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>max</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>68.000000</td>\n",
|
||
" <td>198000.000000</td>\n",
|
||
" <td>18.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Enroll Age Income Hours\n",
|
||
"count 1000.000000 1000.000000 1000.000000 1000.000000\n",
|
||
"mean 0.403000 44.582000 68340.000000 10.182000\n",
|
||
"std 0.490746 13.876737 44466.928247 4.671263\n",
|
||
"min 0.000000 21.000000 1000.000000 2.000000\n",
|
||
"25% 0.000000 32.000000 31000.000000 6.000000\n",
|
||
"50% 0.000000 45.000000 64000.000000 10.000000\n",
|
||
"75% 1.000000 57.000000 97000.000000 14.000000\n",
|
||
"max 1.000000 68.000000 198000.000000 18.000000"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDf.describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "92b6d925-f586-45a6-b89a-3b74204f0b94",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "70586f38-33be-49c7-93c0-867a24de8aa9",
|
||
"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>Enroll</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Income</th>\n",
|
||
" <th>Hours</th>\n",
|
||
" <th>scalerAge</th>\n",
|
||
" <th>scalerIncome</th>\n",
|
||
" <th>scalerHours</th>\n",
|
||
" <th>EnrollCategories</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>18000</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>-1.339746</td>\n",
|
||
" <td>-1.132644</td>\n",
|
||
" <td>0.817747</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>43</td>\n",
|
||
" <td>13000</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>-0.114061</td>\n",
|
||
" <td>-1.245143</td>\n",
|
||
" <td>-0.253163</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>42000</td>\n",
|
||
" <td>16</td>\n",
|
||
" <td>0.751128</td>\n",
|
||
" <td>-0.592647</td>\n",
|
||
" <td>1.246111</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>100000</td>\n",
|
||
" <td>13</td>\n",
|
||
" <td>0.751128</td>\n",
|
||
" <td>0.712346</td>\n",
|
||
" <td>0.603565</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>13000</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>0.751128</td>\n",
|
||
" <td>-1.245143</td>\n",
|
||
" <td>0.389383</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>995</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>39</td>\n",
|
||
" <td>5000</td>\n",
|
||
" <td>13</td>\n",
|
||
" <td>-0.402457</td>\n",
|
||
" <td>-1.425142</td>\n",
|
||
" <td>0.603565</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>996</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>38</td>\n",
|
||
" <td>5000</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>-0.474556</td>\n",
|
||
" <td>-1.425142</td>\n",
|
||
" <td>-1.538255</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>997</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>55</td>\n",
|
||
" <td>70000</td>\n",
|
||
" <td>17</td>\n",
|
||
" <td>0.751128</td>\n",
|
||
" <td>0.037350</td>\n",
|
||
" <td>1.460293</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>998</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>68</td>\n",
|
||
" <td>64000</td>\n",
|
||
" <td>15</td>\n",
|
||
" <td>1.688417</td>\n",
|
||
" <td>-0.097649</td>\n",
|
||
" <td>1.031929</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>999</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>48</td>\n",
|
||
" <td>67000</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>0.246435</td>\n",
|
||
" <td>-0.030150</td>\n",
|
||
" <td>1.674475</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1000 rows × 8 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Enroll Age Income Hours scalerAge scalerIncome scalerHours \\\n",
|
||
"0 1 26 18000 14 -1.339746 -1.132644 0.817747 \n",
|
||
"1 0 43 13000 9 -0.114061 -1.245143 -0.253163 \n",
|
||
"2 1 55 42000 16 0.751128 -0.592647 1.246111 \n",
|
||
"3 1 55 100000 13 0.751128 0.712346 0.603565 \n",
|
||
"4 0 55 13000 12 0.751128 -1.245143 0.389383 \n",
|
||
".. ... ... ... ... ... ... ... \n",
|
||
"995 0 39 5000 13 -0.402457 -1.425142 0.603565 \n",
|
||
"996 0 38 5000 3 -0.474556 -1.425142 -1.538255 \n",
|
||
"997 1 55 70000 17 0.751128 0.037350 1.460293 \n",
|
||
"998 1 68 64000 15 1.688417 -0.097649 1.031929 \n",
|
||
"999 0 48 67000 18 0.246435 -0.030150 1.674475 \n",
|
||
"\n",
|
||
" EnrollCategories \n",
|
||
"0 1 \n",
|
||
"1 0 \n",
|
||
"2 1 \n",
|
||
"3 1 \n",
|
||
"4 0 \n",
|
||
".. ... \n",
|
||
"995 0 \n",
|
||
"996 0 \n",
|
||
"997 1 \n",
|
||
"998 1 \n",
|
||
"999 0 \n",
|
||
"\n",
|
||
"[1000 rows x 8 columns]"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Scale the features\n",
|
||
"scalerAge = StandardScaler()\n",
|
||
"gymEnrollAgeIncomeHoursDf['scalerAge'] = scalerAge.fit_transform(gymEnrollAgeIncomeHoursDf[[\"Age\"]])\n",
|
||
"scalerIncome = StandardScaler()\n",
|
||
"gymEnrollAgeIncomeHoursDf['scalerIncome'] = scalerAge.fit_transform(gymEnrollAgeIncomeHoursDf[[\"Income\"]])\n",
|
||
"scalerHours = StandardScaler()\n",
|
||
"gymEnrollAgeIncomeHoursDf['scalerHours'] = scalerAge.fit_transform(gymEnrollAgeIncomeHoursDf[[\"Hours\"]])\n",
|
||
"gymEnrollAgeIncomeHoursDf['EnrollCategories'] = gymEnrollAgeIncomeHoursDf['Enroll'].astype('category')\n",
|
||
"gymEnrollAgeIncomeHoursDf"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "dcbdbd6a-0569-454d-8f26-4cf7e5c7032d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# testTransformer = pd.DataFrame([[26], [43], [55]], columns=['Age'])\n",
|
||
"# scalerAge.transform(tt)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "c3add96b-f801-4b29-87d8-77dc8057c721",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"indAtts = [\"scalerAge\", \"scalerIncome\", \"scalerHours\"]\n",
|
||
"depAtt = \"EnrollCategories\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "2285e5a5-0a99-4589-b965-3267a543de5e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Split the data into training and testing sets\n",
|
||
"(gymEnrollAgeIncomeHoursDfX_train,\n",
|
||
"gymEnrollAgeIncomeHoursDfX_test,\n",
|
||
"gymEnrollAgeIncomeHoursDfy_train,\n",
|
||
"gymEnrollAgeIncomeHoursDfy_test) = train_test_split(\n",
|
||
" gymEnrollAgeIncomeHoursDf[indAtts],\n",
|
||
" gymEnrollAgeIncomeHoursDf[depAtt],\n",
|
||
" test_size=0.4,\n",
|
||
" random_state=1,\n",
|
||
" stratify=gymEnrollAgeIncomeHoursDf[depAtt]\n",
|
||
")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "550ac433-5d99-46de-9620-7ef93e79fcbe",
|
||
"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>scalerAge</th>\n",
|
||
" <th>scalerIncome</th>\n",
|
||
" <th>scalerHours</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>808</th>\n",
|
||
" <td>0.030137</td>\n",
|
||
" <td>0.824845</td>\n",
|
||
" <td>1.674475</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>393</th>\n",
|
||
" <td>-0.618755</td>\n",
|
||
" <td>-0.975145</td>\n",
|
||
" <td>0.175201</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>416</th>\n",
|
||
" <td>-0.979250</td>\n",
|
||
" <td>-1.425142</td>\n",
|
||
" <td>0.817747</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>486</th>\n",
|
||
" <td>0.679029</td>\n",
|
||
" <td>-1.065144</td>\n",
|
||
" <td>0.817747</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>422</th>\n",
|
||
" <td>-0.114061</td>\n",
|
||
" <td>-1.267643</td>\n",
|
||
" <td>-1.324073</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" scalerAge scalerIncome scalerHours\n",
|
||
"808 0.030137 0.824845 1.674475\n",
|
||
"393 -0.618755 -0.975145 0.175201\n",
|
||
"416 -0.979250 -1.425142 0.817747\n",
|
||
"486 0.679029 -1.065144 0.817747\n",
|
||
"422 -0.114061 -1.267643 -1.324073"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfX_train.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "5799c2d6-26f6-483a-9632-42ae9ca6cf05",
|
||
"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>GridSearchCV(cv=5, estimator=CustomKNNClassifier(),\n",
|
||
" param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})</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-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" 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.5/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=CustomKNNClassifier(),\n",
|
||
" param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})</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-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: CustomKNNClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>CustomKNNClassifier()</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-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">CustomKNNClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>CustomKNNClassifier()</pre></div> </div></div></div></div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GridSearchCV(cv=5, estimator=CustomKNNClassifier(),\n",
|
||
" param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Perform k-NN classification with cross-validation to find the best k\n",
|
||
"class CustomKNNClassifier(KNeighborsClassifier):\n",
|
||
" def prob(self, X):\n",
|
||
" return self.predict_proba(X)[:, 1]\n",
|
||
"# gymEnrollAgeIncomeHoursDfKnn = KNeighborsClassifier()\n",
|
||
"gymEnrollAgeIncomeHoursDfKnn = CustomKNNClassifier()\n",
|
||
"param_grid = {'n_neighbors': list(range(1, 11))}\n",
|
||
"grid_search = GridSearchCV(gymEnrollAgeIncomeHoursDfKnn, param_grid, cv=5)\n",
|
||
"grid_search.fit(gymEnrollAgeIncomeHoursDfX_train, gymEnrollAgeIncomeHoursDfy_train)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "d89ab3d4-4fe5-482c-b447-3334a69b28e2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"bestParameters: {'n_neighbors': 5}\n",
|
||
"bestCrossValidationScore: 0.915\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"bestParameters = grid_search.best_params_\n",
|
||
"bestCrossValidationScore = grid_search.best_score_\n",
|
||
"print(\"bestParameters:\", bestParameters)\n",
|
||
"print(\"bestCrossValidationScore:\", bestCrossValidationScore)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"id": "18fee4f2-df43-4d0f-a1be-1b0b2458f30a",
|
||
"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>mean_fit_time</th>\n",
|
||
" <th>std_fit_time</th>\n",
|
||
" <th>mean_score_time</th>\n",
|
||
" <th>std_score_time</th>\n",
|
||
" <th>param_n_neighbors</th>\n",
|
||
" <th>params</th>\n",
|
||
" <th>split0_test_score</th>\n",
|
||
" <th>split1_test_score</th>\n",
|
||
" <th>split2_test_score</th>\n",
|
||
" <th>split3_test_score</th>\n",
|
||
" <th>split4_test_score</th>\n",
|
||
" <th>mean_test_score</th>\n",
|
||
" <th>std_test_score</th>\n",
|
||
" <th>rank_test_score</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.001510</td>\n",
|
||
" <td>0.000931</td>\n",
|
||
" <td>0.004020</td>\n",
|
||
" <td>0.000658</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>{'n_neighbors': 1}</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.908333</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.900000</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.891667</td>\n",
|
||
" <td>0.021082</td>\n",
|
||
" <td>9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.000738</td>\n",
|
||
" <td>0.000121</td>\n",
|
||
" <td>0.002698</td>\n",
|
||
" <td>0.000260</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>{'n_neighbors': 2}</td>\n",
|
||
" <td>0.833333</td>\n",
|
||
" <td>0.858333</td>\n",
|
||
" <td>0.883333</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.861667</td>\n",
|
||
" <td>0.016330</td>\n",
|
||
" <td>10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.000706</td>\n",
|
||
" <td>0.000082</td>\n",
|
||
" <td>0.002601</td>\n",
|
||
" <td>0.000106</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>{'n_neighbors': 3}</td>\n",
|
||
" <td>0.908333</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.883333</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.900000</td>\n",
|
||
" <td>0.908333</td>\n",
|
||
" <td>0.016667</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.000620</td>\n",
|
||
" <td>0.000074</td>\n",
|
||
" <td>0.002359</td>\n",
|
||
" <td>0.000102</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>{'n_neighbors': 4}</td>\n",
|
||
" <td>0.850000</td>\n",
|
||
" <td>0.925000</td>\n",
|
||
" <td>0.858333</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.900000</td>\n",
|
||
" <td>0.893333</td>\n",
|
||
" <td>0.033912</td>\n",
|
||
" <td>8</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.000538</td>\n",
|
||
" <td>0.000012</td>\n",
|
||
" <td>0.002157</td>\n",
|
||
" <td>0.000035</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>{'n_neighbors': 5}</td>\n",
|
||
" <td>0.875000</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.883333</td>\n",
|
||
" <td>0.950000</td>\n",
|
||
" <td>0.925000</td>\n",
|
||
" <td>0.915000</td>\n",
|
||
" <td>0.030459</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.000511</td>\n",
|
||
" <td>0.000016</td>\n",
|
||
" <td>0.002073</td>\n",
|
||
" <td>0.000035</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>{'n_neighbors': 6}</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.858333</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.903333</td>\n",
|
||
" <td>0.034400</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.000478</td>\n",
|
||
" <td>0.000006</td>\n",
|
||
" <td>0.002026</td>\n",
|
||
" <td>0.000036</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>{'n_neighbors': 7}</td>\n",
|
||
" <td>0.875000</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.858333</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.905000</td>\n",
|
||
" <td>0.032745</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>0.000476</td>\n",
|
||
" <td>0.000017</td>\n",
|
||
" <td>0.001979</td>\n",
|
||
" <td>0.000015</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>{'n_neighbors': 8}</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.858333</td>\n",
|
||
" <td>0.933333</td>\n",
|
||
" <td>0.908333</td>\n",
|
||
" <td>0.900000</td>\n",
|
||
" <td>0.032059</td>\n",
|
||
" <td>7</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>0.000472</td>\n",
|
||
" <td>0.000011</td>\n",
|
||
" <td>0.001990</td>\n",
|
||
" <td>0.000017</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>{'n_neighbors': 9}</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.925000</td>\n",
|
||
" <td>0.883333</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.906667</td>\n",
|
||
" <td>0.027588</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>0.000469</td>\n",
|
||
" <td>0.000008</td>\n",
|
||
" <td>0.002008</td>\n",
|
||
" <td>0.000031</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>{'n_neighbors': 10}</td>\n",
|
||
" <td>0.841667</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.866667</td>\n",
|
||
" <td>0.941667</td>\n",
|
||
" <td>0.916667</td>\n",
|
||
" <td>0.901667</td>\n",
|
||
" <td>0.040620</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" mean_fit_time std_fit_time mean_score_time std_score_time \\\n",
|
||
"0 0.001510 0.000931 0.004020 0.000658 \n",
|
||
"1 0.000738 0.000121 0.002698 0.000260 \n",
|
||
"2 0.000706 0.000082 0.002601 0.000106 \n",
|
||
"3 0.000620 0.000074 0.002359 0.000102 \n",
|
||
"4 0.000538 0.000012 0.002157 0.000035 \n",
|
||
"5 0.000511 0.000016 0.002073 0.000035 \n",
|
||
"6 0.000478 0.000006 0.002026 0.000036 \n",
|
||
"7 0.000476 0.000017 0.001979 0.000015 \n",
|
||
"8 0.000472 0.000011 0.001990 0.000017 \n",
|
||
"9 0.000469 0.000008 0.002008 0.000031 \n",
|
||
"\n",
|
||
" param_n_neighbors params split0_test_score \\\n",
|
||
"0 1 {'n_neighbors': 1} 0.866667 \n",
|
||
"1 2 {'n_neighbors': 2} 0.833333 \n",
|
||
"2 3 {'n_neighbors': 3} 0.908333 \n",
|
||
"3 4 {'n_neighbors': 4} 0.850000 \n",
|
||
"4 5 {'n_neighbors': 5} 0.875000 \n",
|
||
"5 6 {'n_neighbors': 6} 0.866667 \n",
|
||
"6 7 {'n_neighbors': 7} 0.875000 \n",
|
||
"7 8 {'n_neighbors': 8} 0.866667 \n",
|
||
"8 9 {'n_neighbors': 9} 0.866667 \n",
|
||
"9 10 {'n_neighbors': 10} 0.841667 \n",
|
||
"\n",
|
||
" split1_test_score split2_test_score split3_test_score split4_test_score \\\n",
|
||
"0 0.908333 0.866667 0.900000 0.916667 \n",
|
||
"1 0.858333 0.883333 0.866667 0.866667 \n",
|
||
"2 0.916667 0.883333 0.933333 0.900000 \n",
|
||
"3 0.925000 0.858333 0.933333 0.900000 \n",
|
||
"4 0.941667 0.883333 0.950000 0.925000 \n",
|
||
"5 0.941667 0.858333 0.933333 0.916667 \n",
|
||
"6 0.933333 0.858333 0.941667 0.916667 \n",
|
||
"7 0.933333 0.858333 0.933333 0.908333 \n",
|
||
"8 0.925000 0.883333 0.941667 0.916667 \n",
|
||
"9 0.941667 0.866667 0.941667 0.916667 \n",
|
||
"\n",
|
||
" mean_test_score std_test_score rank_test_score \n",
|
||
"0 0.891667 0.021082 9 \n",
|
||
"1 0.861667 0.016330 10 \n",
|
||
"2 0.908333 0.016667 2 \n",
|
||
"3 0.893333 0.033912 8 \n",
|
||
"4 0.915000 0.030459 1 \n",
|
||
"5 0.903333 0.034400 5 \n",
|
||
"6 0.905000 0.032745 4 \n",
|
||
"7 0.900000 0.032059 7 \n",
|
||
"8 0.906667 0.027588 3 \n",
|
||
"9 0.901667 0.040620 6 "
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Display detailed results\n",
|
||
"cv_results = pd.DataFrame(grid_search.cv_results_)\n",
|
||
"cv_results"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"id": "90b63369-b0c5-43ff-a93f-6742af667a8f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfKnnFit = grid_search.best_estimator_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"id": "c230dab1-b0ef-4dde-b3f8-00db325ef856",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# from copy import deepcopy"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "933f59a6-19ca-4d42-81ef-0b7f31c59c59",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# gymEnrollAgeIncomeHoursDfKnnFit.predictHalfCutOff = deepcopy( gymEnrollAgeIncomeHoursDfKnnFit.predict)\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.predictHalfCutOff = gymEnrollAgeIncomeHoursDfKnnFit.predict"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "55875572-b648-486a-9941-5ea39fa37274",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
" gymEnrollAgeIncomeHoursDfKnnFit.predict = gymEnrollAgeIncomeHoursDfKnnFit.prob"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"id": "392ddc06-c0fb-4ac7-b327-89fb9a44cda0",
|
||
"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>scalerAge</th>\n",
|
||
" <th>scalerIncome</th>\n",
|
||
" <th>scalerHours</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>489</th>\n",
|
||
" <td>1.111624</td>\n",
|
||
" <td>1.049844</td>\n",
|
||
" <td>0.389383</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>241</th>\n",
|
||
" <td>-0.041962</td>\n",
|
||
" <td>-0.705146</td>\n",
|
||
" <td>0.175201</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>119</th>\n",
|
||
" <td>-0.186160</td>\n",
|
||
" <td>-0.705146</td>\n",
|
||
" <td>-0.681527</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>577</th>\n",
|
||
" <td>-1.267647</td>\n",
|
||
" <td>-0.052650</td>\n",
|
||
" <td>-1.109891</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>287</th>\n",
|
||
" <td>0.246435</td>\n",
|
||
" <td>-0.885145</td>\n",
|
||
" <td>1.674475</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>804</th>\n",
|
||
" <td>0.174336</td>\n",
|
||
" <td>1.387342</td>\n",
|
||
" <td>-0.895709</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>974</th>\n",
|
||
" <td>1.400020</td>\n",
|
||
" <td>1.139844</td>\n",
|
||
" <td>-1.752437</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>810</th>\n",
|
||
" <td>0.895327</td>\n",
|
||
" <td>0.577347</td>\n",
|
||
" <td>1.246111</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>395</th>\n",
|
||
" <td>0.174336</td>\n",
|
||
" <td>0.172349</td>\n",
|
||
" <td>1.246111</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>861</th>\n",
|
||
" <td>0.246435</td>\n",
|
||
" <td>-0.075150</td>\n",
|
||
" <td>0.603565</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>400 rows × 3 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" scalerAge scalerIncome scalerHours\n",
|
||
"489 1.111624 1.049844 0.389383\n",
|
||
"241 -0.041962 -0.705146 0.175201\n",
|
||
"119 -0.186160 -0.705146 -0.681527\n",
|
||
"577 -1.267647 -0.052650 -1.109891\n",
|
||
"287 0.246435 -0.885145 1.674475\n",
|
||
".. ... ... ...\n",
|
||
"804 0.174336 1.387342 -0.895709\n",
|
||
"974 1.400020 1.139844 -1.752437\n",
|
||
"810 0.895327 0.577347 1.246111\n",
|
||
"395 0.174336 0.172349 1.246111\n",
|
||
"861 0.246435 -0.075150 0.603565\n",
|
||
"\n",
|
||
"[400 rows x 3 columns]"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfX_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"id": "fd901e0c-b0cb-479d-a579-6e2fcd4bd9af",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"predictionProb = gymEnrollAgeIncomeHoursDfKnnFit.predict(gymEnrollAgeIncomeHoursDfX_test)\n",
|
||
"predictHalfCutOff = gymEnrollAgeIncomeHoursDfKnnFit.predictHalfCutOff(gymEnrollAgeIncomeHoursDfX_test)\n",
|
||
"gymEnrollAgeIncomeHoursDfX_test['predictionProb'] = predictionProb\n",
|
||
"gymEnrollAgeIncomeHoursDfX_test['predictHalfCutOff'] = predictHalfCutOff"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"id": "0983f992-c261-402f-8bb2-e120146e0ad8",
|
||
"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>scalerAge</th>\n",
|
||
" <th>scalerIncome</th>\n",
|
||
" <th>scalerHours</th>\n",
|
||
" <th>predictionProb</th>\n",
|
||
" <th>predictHalfCutOff</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>489</th>\n",
|
||
" <td>1.111624</td>\n",
|
||
" <td>1.049844</td>\n",
|
||
" <td>0.389383</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>241</th>\n",
|
||
" <td>-0.041962</td>\n",
|
||
" <td>-0.705146</td>\n",
|
||
" <td>0.175201</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>119</th>\n",
|
||
" <td>-0.186160</td>\n",
|
||
" <td>-0.705146</td>\n",
|
||
" <td>-0.681527</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>577</th>\n",
|
||
" <td>-1.267647</td>\n",
|
||
" <td>-0.052650</td>\n",
|
||
" <td>-1.109891</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>287</th>\n",
|
||
" <td>0.246435</td>\n",
|
||
" <td>-0.885145</td>\n",
|
||
" <td>1.674475</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>804</th>\n",
|
||
" <td>0.174336</td>\n",
|
||
" <td>1.387342</td>\n",
|
||
" <td>-0.895709</td>\n",
|
||
" <td>0.6</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>974</th>\n",
|
||
" <td>1.400020</td>\n",
|
||
" <td>1.139844</td>\n",
|
||
" <td>-1.752437</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>810</th>\n",
|
||
" <td>0.895327</td>\n",
|
||
" <td>0.577347</td>\n",
|
||
" <td>1.246111</td>\n",
|
||
" <td>0.8</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>395</th>\n",
|
||
" <td>0.174336</td>\n",
|
||
" <td>0.172349</td>\n",
|
||
" <td>1.246111</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>861</th>\n",
|
||
" <td>0.246435</td>\n",
|
||
" <td>-0.075150</td>\n",
|
||
" <td>0.603565</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>400 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" scalerAge scalerIncome scalerHours predictionProb predictHalfCutOff\n",
|
||
"489 1.111624 1.049844 0.389383 1.0 1\n",
|
||
"241 -0.041962 -0.705146 0.175201 0.0 0\n",
|
||
"119 -0.186160 -0.705146 -0.681527 0.2 0\n",
|
||
"577 -1.267647 -0.052650 -1.109891 0.4 0\n",
|
||
"287 0.246435 -0.885145 1.674475 0.2 0\n",
|
||
".. ... ... ... ... ...\n",
|
||
"804 0.174336 1.387342 -0.895709 0.6 1\n",
|
||
"974 1.400020 1.139844 -1.752437 1.0 1\n",
|
||
"810 0.895327 0.577347 1.246111 0.8 1\n",
|
||
"395 0.174336 0.172349 1.246111 0.2 0\n",
|
||
"861 0.246435 -0.075150 0.603565 0.2 0\n",
|
||
"\n",
|
||
"[400 rows x 5 columns]"
|
||
]
|
||
},
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfX_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"id": "6adf11fd-106f-42dc-9ac0-fe7b4378fc3e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Confusion Matrix as DataFrame:\n",
|
||
" Actual_0 Actual_1\n",
|
||
"Predicted_0 217 22\n",
|
||
"Predicted_1 17 144\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Confusion matrix\n",
|
||
"conf_matrix = confusion_matrix(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictHalfCutOff'])\n",
|
||
"\n",
|
||
"# Convert confusion matrix to DataFrame with predicted as rows and actual as columns\n",
|
||
"conf_matrix_df = pd.DataFrame(conf_matrix, index=['Predicted_0', 'Predicted_1'], columns=['Actual_0', 'Actual_1'])\n",
|
||
"print(\"Confusion Matrix as DataFrame:\")\n",
|
||
"print(conf_matrix_df)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"id": "0d372830-8fc0-48ae-b4d2-82208c3479e4",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Accuracy: 0.9025\n",
|
||
"Precision: 0.8674698795180723\n",
|
||
"Recall (Sensitivity): 0.8944099378881988\n",
|
||
"Specificity: 0.9079497907949791\n",
|
||
"F1 f1Score: 0.8807339449541285\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Calculate metrics\n",
|
||
"precision = precision_score(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictHalfCutOff'])\n",
|
||
"recall = recall_score(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictHalfCutOff'])\n",
|
||
"accuracy = accuracy_score(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictHalfCutOff'])\n",
|
||
"specificity = conf_matrix[0, 0] / (conf_matrix[0, 0] + conf_matrix[0, 1])\n",
|
||
"f1Score = 2 * (precision * recall) / (precision + recall)\n",
|
||
"\n",
|
||
"print(f\"Accuracy: {accuracy}\")\n",
|
||
"print(f\"Precision: {precision}\")\n",
|
||
"print(f\"Recall (Sensitivity): {recall}\")\n",
|
||
"print(f\"Specificity: {specificity}\")\n",
|
||
"print(f\"F1 f1Score: {f1Score}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"id": "a2929726-c175-4fdf-bedd-6aae4b4b29e1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"ROC AUC: 0.9423191870890616\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"roc_auc = roc_auc_score(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictionProb'])\n",
|
||
"print(\"ROC AUC:\", roc_auc)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"id": "3e864f0c-15ea-44d8-a047-47559c5f2ec3",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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bPHXqlULq1evhrOzM2xtbd8qJiJjx2ZpIiPyzjvvICMjA3PmzMGNGzewfPlyLFy4MNf9U1NTMXjwYOzZswf//fcfDhw4gGPHjmmHvL799lscPHgQgwcPRmRkJK5evYo///xT72bpF33zzTf44YcfsHr1aly+fBkjRoxAZGQkvvzySwDAjBkz8Pvvv+PSpUu4cuUK1q5di1KlSuW4CKSzszMsLCwQERGB+/fvIz4+PtfHDQwMxJYtW7B48WJtk3SWcePGYdmyZZg4cSLOnz+PixcvYtWqVRgzZoxez61Bgwbw8fHBlClTAAAVKlTA8ePHsXXrVly5cgVjx47FsWPHdI7x9PTEmTNncPnyZcTGxiIjIwOBgYFwdHRE+/bt8e+//yIqKgp79uzBkCFDcOfOHb1iIjJ6UjcpEVH+y6nBNsuMGTOEq6ursLCwEP7+/mLZsmUCgHjy5IkQQreZWaVSiU8++UR4eHgIU1NT4ebmJgYPHqzTCH306FHRqlUrYW1tLaysrISPj0+2ZucXvdws/TK1Wi0mTJgg3N3dhVKpFL6+vuKff/7R3v/rr7+KGjVqCCsrK2FraytatmwpTp48qb0fLzRLCyFEaGio8PDwEHK5XDRt2jTX10etVgtXV1cBQFy/fj1bXBEREaJhw4bCwsJC2Nrainr16olff/011+cxfvx44evrm23777//LszMzMStW7dEWlqa6NWrl7CzsxP29vZiwIABYsSIETrHPXjwQPv6AhC7d+8WQggRHR0tevbsKRwdHYWZmZkoX7686Nevn4iPj881JiLKTiaEENKmYkRERETS4NAYERERGS0mQkRERGS0mAgRERGR0WIiREREREaLiRAREREZLSZCREREZLSYCBEREZHRYiJERERERouJEBERERktJkJERERktJgIERERkdFiIkRERERG6//8xRx4Gn1VJwAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Plot ROC curve\n",
|
||
"fpr, tpr, _ = roc_curve(gymEnrollAgeIncomeHoursDfy_test, gymEnrollAgeIncomeHoursDfX_test['predictionProb'] )\n",
|
||
"plt.figure()\n",
|
||
"plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.2f})')\n",
|
||
"plt.plot([0, 1], [0, 1], 'k--')\n",
|
||
"plt.xlim([0.0, 1.0])\n",
|
||
"plt.ylim([0.0, 1.05])\n",
|
||
"plt.xlabel('False Positive Rate')\n",
|
||
"plt.ylabel('True Positive Rate')\n",
|
||
"plt.title('Receiver Operating Characteristic')\n",
|
||
"plt.legend(loc=\"lower right\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"id": "dd3d8160-083d-4748-bb46-576cf43486ae",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'accuracy': 0.9025,\n",
|
||
" 'recall': 0.8944099378881988,\n",
|
||
" 'precision': 0.8674698795180723,\n",
|
||
" 'sensitivity': 0.8944099378881988,\n",
|
||
" 'specificity': 0.9079497907949791,\n",
|
||
" 'f1Score': 0.8807339449541285,\n",
|
||
" 'roc_auc': 0.9423191870890616,\n",
|
||
" 'cvK': 5,\n",
|
||
" 'bestParameters': {'n_neighbors': 5},\n",
|
||
" 'bestCrossValidationScore': 0.915}"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics = {}\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['accuracy'] = accuracy\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['recall'] = recall\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['precision'] = precision\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['sensitivity'] = recall\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['specificity'] = specificity\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['f1Score'] = f1Score\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['roc_auc'] = roc_auc\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['cvK'] = 5\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['bestParameters'] = bestParameters\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics['bestCrossValidationScore'] = bestCrossValidationScore\n",
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.customMetrics"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"id": "ad7005e8-82d3-4ac4-beab-964f0c3992c7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"gymEnrollAgeIncomeHoursDfKnnFit.internaltransformers = [\n",
|
||
" {\n",
|
||
" \"origin\": \"Age\",\n",
|
||
" \"to\": \"scalerAge\",\n",
|
||
" \"transformerModel\": scalerAge,\n",
|
||
" \"methodToCall\": \"fit_transform\"\n",
|
||
" },\n",
|
||
" {\n",
|
||
" \"origin\": \"Income\",\n",
|
||
" \"to\": \"scalerIncome\",\n",
|
||
" \"transformerModel\": scalerIncome,\n",
|
||
" \"methodToCall\": \"fit_transform\"\n",
|
||
" },\n",
|
||
" {\n",
|
||
" \"origin\": \"Hours\",\n",
|
||
" \"to\": \"scalerHours\",\n",
|
||
" \"transformerModel\": scalerHours,\n",
|
||
" \"methodToCall\": \"fit_transform\"\n",
|
||
" },\n",
|
||
"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"id": "8e29e775-b422-4d03-a037-82d8b3795214",
|
||
"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>CustomKNNClassifier()</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-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> CustomKNNClassifier<span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>CustomKNNClassifier()</pre></div> </div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"CustomKNNClassifier()"
|
||
]
|
||
},
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from functions.exportModel import exportModel\n",
|
||
"exportModel({\n",
|
||
" \"modelName\": \"gymEnrollAgeIncomeHoursDfKnnFit\",\n",
|
||
" \"model\": gymEnrollAgeIncomeHoursDfKnnFit,\n",
|
||
" \"description\": \"gymEnrollAgeIncomeHoursDf\",\n",
|
||
" \"modelType\": \"knn\",\n",
|
||
" \"baseRelativePath\": \"..\",\n",
|
||
" \"inputs\": [\n",
|
||
" {\n",
|
||
" \"name\": \"Age\",\n",
|
||
" \"type\": \"int\"\n",
|
||
" },\n",
|
||
" {\n",
|
||
" \"name\": \"Income\",\n",
|
||
" \"type\": \"int\"\n",
|
||
" },\n",
|
||
" {\n",
|
||
" \"name\": \"Hours\",\n",
|
||
" \"type\": \"int\"\n",
|
||
" }\n",
|
||
" ],\n",
|
||
" \"output\": {\n",
|
||
" \"name\": \"Enroll_probibility\",\n",
|
||
" \"type\": \"float\"\n",
|
||
" }\n",
|
||
"})"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"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
|
||
}
|