Small bug fixes

This commit is contained in:
Petrus committed 2025-10-25 18:38:53 +02:00
1 parent c0ffaa45c9
commit 5c1b77358f
2 files changed
+81 -60

No files matched your search

+3 -8
View File
@@ -59,27 +59,22 @@
"from sklearn.preprocessing import LabelEncoder\n", "from sklearn.preprocessing import LabelEncoder\n",
"import seaborn as sns\n", "import seaborn as sns\n",
"\n", "\n",
"\n",
"df = pd.read_csv('./Datasets/adult.csv', comment = '#')\n", "df = pd.read_csv('./Datasets/adult.csv', comment = '#')\n",
"\n", "\n",
"\n",
"# First, create a copy of the dataframe to avoid modifying the original\n", "# First, create a copy of the dataframe to avoid modifying the original\n",
"df_encoded = df.copy()\n", "df_encoded = df.copy()\n",
"df_encoded.drop(['fnlwgt', 'education'], axis=1, inplace=True)\n", "df_encoded.drop(['fnlwgt', 'education'], axis=1, inplace=True)\n",
"\n", "\n",
"\n",
"# drop all rows that contain '?'\n", "# drop all rows that contain '?'\n",
"for column in df_encoded.columns:\n", "df_encoded = df_encoded[(df_encoded != '?').all(axis=1)]\n",
" df_encoded = df_encoded[df_encoded[column] != '?']\n",
"\n", "\n",
"# Apply label encoding to categorical columns\n", "# Apply label encoding to categorical columns\n",
"label_encoder = LabelEncoder()\n",
"categorical_columns = ['workclass', 'marital.status', 'occupation', \n", "categorical_columns = ['workclass', 'marital.status', 'occupation', \n",
" 'relationship', 'race', 'sex', 'native.country', 'income']\n", " 'relationship', 'race', 'sex', 'native.country', 'income']\n",
"\n", "\n",
"for column in categorical_columns:\n", "for column in categorical_columns:\n",
" df_encoded[column] = label_encoder.fit_transform(df_encoded[column])\n", " le = LabelEncoder()\n",
"\n", " df_encoded[column] = le.fit_transform(df_encoded[column])\n",
"\n", "\n",
"matrix = df_encoded.corr()\n", "matrix = df_encoded.corr()\n",
"\n", "\n",
+78 -52
View File
@@ -11,18 +11,48 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"id": "0952f099", "id": "0952f099",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"ename": "", "data": {
"evalue": "", "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7sAAAOwCAYAAAD/XWM1AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XmcjfX/xvHXmX03ZsXYxr7vRGQnKSmFJEUkWSOUJKENRcoWSZGdRGRnxr7v+76MbWYYZl/O8vtDpq9fKsvM3LNcz8ejx5cz97nPdeZr5pzr3PfnfZtsNpsNERERERERkWzEzugAIiIiIiIiImlNZVdERERERESyHZVdERERERERyXZUdkVERERERCTbUdkVERERERGRbEdlV0RERERERLIdlV0RERERERHJdlR2RUREREREJNtR2RUREREREZFsR2VXREREREREsh2VXREREREREcl2VHZFREREREQk21HZFRERERERkWxHZVdERERERESyHZVdERERERERyXZUdkVERERERCTbUdkVERERERGRbEdlV0RERERERLIdlV0RERERERHJdlR2RUREREREJNtR2RUREREREZFsR2VXREREREREsh2VXREREREREcl2VHZFREREREQk21HZFRERERERkWxHZVdERERERESyHZVdERERERERyXZUdkVERERERCTbUdkVERERERGRbEdlV0RERERERLIdlV0RERERERHJdlR2RUREREREJNtR2RUREREREZFsR2VXREREREREsh2VXREREREREcl2VHZFREREREQk21HZFRERERERkWxHZVdERERERESyHZVdERERERERyXZUdkVERERERCTbUdkVERERERGRbEdlV0RERERERLIdlV0RERERERHJdlR2RUREREREJNtR2RUREREREZFsR2VXREREREREsh2VXREREREREcl2VHZFREREREQk21HZFRERERERkWxHZVdERERERESyHZVdERERERERyXZUdkVERERERCTbUdkVERERERGRbEdlV0RERERERLIdlV0RERERERHJdlR2RUREREREJNtR2RUREREREZFsR2VXREREREREsh2VXREREREREcl2VHZFREREREQk21HZFRERERERkWzHwegAIiIiknESExO5fPkyVqvV6CgPzWQykS9fPtzc3IyOIiIiWYDK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 truncated
"output_type": "error", "text/plain": [
"traceback": [ "<Figure size 1200x1200 with 1 Axes>"
"\u001b[1;31mRunning cells with '.venv (Python 3.13.7)' requires the ipykernel package.\n", ]
"\u001b[1;31mInstall 'ipykernel' into the Python environment. \n", },
"\u001b[1;31mCommand: '/home/jaknyst/Documents/MLPproject/.venv/bin/python -m pip install ipykernel -U --force-reinstall'" "metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Poor 0.87 0.87 0.87 4524\n",
" Rich 0.62 0.62 0.62 1509\n",
"\n",
" accuracy 0.81 6033\n",
" macro avg 0.74 0.75 0.74 6033\n",
"weighted avg 0.81 0.81 0.81 6033\n",
"\n",
"Index(['age', 'workclass', 'education.num', 'marital.status', 'occupation',\n",
" 'relationship', 'race', 'sex', 'capital.gain', 'capital.loss',\n",
" 'hours.per.week', 'native.country'],\n",
" dtype='object')\n"
] ]
} }
], ],
@@ -46,16 +76,15 @@
"df_encoded.drop(['fnlwgt', 'education'], axis=1, inplace=True)\n", "df_encoded.drop(['fnlwgt', 'education'], axis=1, inplace=True)\n",
"\n", "\n",
"# drop all rows that contain '?'\n", "# drop all rows that contain '?'\n",
"for column in df_encoded.columns:\n", "df_encoded = df_encoded[(df_encoded != '?').all(axis=1)]\n",
" df_encoded = df_encoded[df_encoded[column] != '?']\n",
"\n", "\n",
"# Apply label encoding to categorical columns\n", "# Apply label encoding to categorical columns\n",
"label_encoder = LabelEncoder()\n",
"categorical_columns = ['workclass', 'marital.status', 'occupation', \n", "categorical_columns = ['workclass', 'marital.status', 'occupation', \n",
" 'relationship', 'race', 'sex', 'native.country', 'income']\n", " 'relationship', 'race', 'sex', 'native.country', 'income']\n",
"\n", "\n",
"for column in categorical_columns:\n", "for column in categorical_columns:\n",
" df_encoded[column] = label_encoder.fit_transform(df_encoded[column])\n", " le = LabelEncoder()\n",
" df_encoded[column] = le.fit_transform(df_encoded[column])\n",
"\n", "\n",
"# Now properly separate features and target\n", "# Now properly separate features and target\n",
"X = df_encoded.drop(columns=['income'])\n", "X = df_encoded.drop(columns=['income'])\n",
@@ -176,13 +205,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 11,
"id": "e68b1ea9", "id": "e68b1ea9",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"from sklearn.model_selection import GridSearchCV, StratifiedKFold\n", "from sklearn.model_selection import GridSearchCV, StratifiedKFold\n",
"import time\n", "import time\n",
"\n",
"from sklearn.preprocessing import StandardScaler\n", "from sklearn.preprocessing import StandardScaler\n",
"from sklearn.metrics import (accuracy_score, precision_score, \n", "from sklearn.metrics import (accuracy_score, precision_score, \n",
" recall_score, f1_score, \n", " recall_score, f1_score, \n",
@@ -248,7 +278,7 @@
" for name, (model, param_grid) in models_with_params.items():\n", " for name, (model, param_grid) in models_with_params.items():\n",
" print(f\"Tuning {name} ...\")\n", " print(f\"Tuning {name} ...\")\n",
" \n", " \n",
" grid_search = GridSearchCV(model, param_grid, scoring='accuracy', cv=cv, n_jobs=-2)\n", " grid_search = GridSearchCV(model, param_grid, scoring='accuracy', cv=cv, n_jobs=-1)\n",
" \n", " \n",
" start_train = time.time()\n", " start_train = time.time()\n",
" grid_search.fit(self.X_train, self.y_train)\n", " grid_search.fit(self.X_train, self.y_train)\n",
@@ -327,7 +357,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 8,
"id": "d6fd1fee", "id": "d6fd1fee",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -335,27 +365,21 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Tuning Decision Tree ...\n" "Tuning Decision Tree ...\n",
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tuning Random Forest ...\n", "Tuning Random Forest ...\n",
"Tuning XGBoost ...\n", "Tuning XGBoost ...\n",
"\n", "\n",
"------ Results Sorted by Accuracy ------\n", "------ Results Sorted by Accuracy ------\n",
" Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n", " Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n",
" XGBoost 0.868059 0.863590 0.868059 0.863957 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 100} 25.874328 0.005939 25.880267\n", " XGBoost 0.868059 0.863590 0.868059 0.863957 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 100} 30.477441 0.007370 30.484811\n",
"Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 125.898729 0.065410 125.964139\n", "Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 109.089292 0.072799 109.162091\n",
"Decision Tree 0.848334 0.844900 0.848334 0.846228 {'max_depth': 10, 'min_samples_split': 5} 9.028944 0.001837 9.030781\n", "Decision Tree 0.848334 0.844900 0.848334 0.846228 {'max_depth': 10, 'min_samples_split': 5} 10.185913 0.002266 10.188179\n",
"\n", "\n",
"------ Results Sorted by Total Time ------\n", "------ Results Sorted by Total Time ------\n",
" Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n", " Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n",
"Decision Tree 0.848334 0.844900 0.848334 0.846228 {'max_depth': 10, 'min_samples_split': 5} 9.028944 0.001837 9.030781\n", "Decision Tree 0.848334 0.844900 0.848334 0.846228 {'max_depth': 10, 'min_samples_split': 5} 10.185913 0.002266 10.188179\n",
" XGBoost 0.868059 0.863590 0.868059 0.863957 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 100} 25.874328 0.005939 25.880267\n", " XGBoost 0.868059 0.863590 0.868059 0.863957 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 100} 30.477441 0.007370 30.484811\n",
"Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 125.898729 0.065410 125.964139\n" "Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 109.089292 0.072799 109.162091\n"
] ]
} }
], ],
@@ -377,7 +401,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 9,
"id": "4185a428", "id": "4185a428",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -391,20 +415,20 @@
"\n", "\n",
"------ Results Sorted by Accuracy ------\n", "------ Results Sorted by Accuracy ------\n",
" Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n", " Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n",
" XGBoost 0.868556 0.864049 0.868556 0.864181 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 75} 11.834481 0.006366 11.840847\n", " XGBoost 0.867064 0.862867 0.867064 0.863685 {'learning_rate': 0.25, 'max_depth': 6, 'n_estimators': 75} 26.702878 0.014437 26.717316\n",
"Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 129.781899 0.075195 129.857094\n", "Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 158.303091 0.076534 158.379625\n",
"Decision Tree 0.849163 0.843062 0.849163 0.839388 {'max_depth': 8, 'min_samples_split': 6} 1.778030 0.002314 1.780344\n", "Decision Tree 0.844356 0.838363 0.844356 0.839763 {'max_depth': 12, 'min_samples_split': 6} 2.376242 0.002706 2.378948\n",
"\n", "\n",
"------ Results Sorted by Total Time ------\n", "------ Results Sorted by Total Time ------\n",
" Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n", " Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n",
"Decision Tree 0.849163 0.843062 0.849163 0.839388 {'max_depth': 8, 'min_samples_split': 6} 1.778030 0.002314 1.780344\n", "Decision Tree 0.844356 0.838363 0.844356 0.839763 {'max_depth': 12, 'min_samples_split': 6} 2.376242 0.002706 2.378948\n",
" XGBoost 0.868556 0.864049 0.868556 0.864181 {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 75} 11.834481 0.006366 11.840847\n", " XGBoost 0.867064 0.862867 0.867064 0.863685 {'learning_rate': 0.25, 'max_depth': 6, 'n_estimators': 75} 26.702878 0.014437 26.717316\n",
"Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 129.781899 0.075195 129.857094\n" "Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 158.303091 0.076534 158.379625\n"
] ]
}, },
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "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 truncated
"text/plain": [ "text/plain": [
"<Figure size 640x480 with 1 Axes>" "<Figure size 640x480 with 1 Axes>"
] ]
@@ -424,7 +448,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAIhCAYAAACmMgXJAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA4e9JREFUeJzsnXlcVFX/xz93BllUQEAFRGTTQBHFPfdcci3X3KrH5Snt0dSUyl9quaRFWZaVlpUtZk/lk5ktGlmWWmKulQjKgyCCIriAsinI3O/vD565MjDIHJxhDvJ9v168lO+cufd97jnc+c6559yrEBGBYRiGYRimDqGztwDDMAzDMExNwwkQwzAMwzB1Dk6AGIZhGIapc3ACxDAMwzBMnYMTIIZhGIZh6hycADEMwzAMU+fgBIhhGIZhmDoHJ0AMwzAMw9Q5OAFiGIZhGKbOwQkQw9QxPv74YyiKgtTUVHurMP8jKSkJgwYNgru7OxRFwbZt2+ytxDB3PJwAMXc8xg98cz/PPPOMTfYZGxuLZcuW4cqVKzbZfl2msLAQy5Ytw+7du+2tYjWmTJmCuLg4vPDCC9i0aRM6d+5ss31t2LABiqJg48aNFV7bv38/dDodnnrqqQqvfffdd7j//vvh7e0NR0dHeHp6ok+fPli9ejVyc3NNygYGBpr8nTk7O6NVq1Z4+umnkZ2dbbO6WcqOHTuwbNkye2swdkbhZ4Exdzoff/wxpk2bhueffx5BQUEmr7Vt2xaRkZFW3+err76Kp59+GqdPn0ZgYKDVt387GAwG3LhxA05OTlAUxd46wly6dAlNmjTB0qVL74gPsWvXrqF+/fpYvHgxVq5cafP9ERH69OmDkydP4uTJk/Dy8gIA3LhxAx07dkRubi4SEhLQoEEDAICqqnjkkUfw8ccfIyIiAmPHjoW/vz/y8vKwf/9+fPPNN+jRowd27dql7SMwMBAeHh548sknAQDXr1/HkSNHsGHDBnTo0AEHDx60eT1vxezZs7Fu3Trwx1/dxsHeAgxTUwwdOtSm36xrgoKCAu2Dqbro9Xro9XorGdUcqqqiuLjY3hpW5+LFiwCARo0aWW2bt+oniqLg3XffRWRkJJ566il89NFHAIDVq1fj+PHj+Pbbb03eu2rVKnz88ceYP38+Vq9ebZI0P/HEEzh//jw++eSTCvvx8/PDww8/rP3+6KOPomHDhnj11VeRlJSEVq1aWau6DFM9iGHucD766CMCQIcOHbpluR07dlCvXr2ofv361LBhQxo2bBgdP37cpMzff/9NU6ZMoaCgIHJyciJvb2+aNm0aXbp0SSuzdOlSAlDh5/Tp03T69GkCQB999FGF/QOgpUuXVthOfHw8TZo0iRo1akSRkZHa65s2baKOHTuSs7MzeXh40IQJEygtLc3i43H69GktFhAQQMOHD6dff/2VOnXqRM7OztS2bVv69ddfiYjoq6++orZt25KTkxN17NiRjh49arLNKVOmUIMGDSg5OZkGDRpE9evXJ19fX1q+fDmpqmpSNj8/n6Kioqh58+bk6OhId911F73yyisVygGgxx9/nD799FNq06YNOTg40Ouvv2722BqPmyXtU/bYJiUl0ZQpU8jd3Z3c3Nxo6tSpVFBQUOGYbdq0ibp06UIuLi7UqFEj6t27N/34448mZSzpP+Ux11cCAgK0148ePUpDhgwhV1dXatCgAfXv35/2799vsg1je+7evZtmzpxJTZo0oUaNGt1yv0REixYt0t6XkpJCLi4uNGbMGJMyBQUF1KhRIwoPD6eSkpIqt2nE2J/K8+qrrxIASklJMYnv2rVLO3bu7u40YsQISkhIqPB+S45HcXExLVu2jFq2bElOTk7k6elJPXv2pJ07dxJRaV8114eYugePADF1hqtXr+LSpUsmscaNGwMANm3ahClTpmDw4MF4+eWXUVhYiHfeeQe9evXCn3/+qV3G+umnn5CSkoJp06bBx8cH8fHxeO+99xAfH48//vgDiqJgzJgx+O9//4vPP/8cr7/+uraPJk2aaN/2RRg3bhxatWqFF198URuyf+GFF/Dcc89h/PjxePTRR3Hx4kW89dZb6NOnD/78889qjSacOnUKDz74IB577DE8/PDDePXVV3H//fdj/fr1WLRoEWbNmgUAiI6Oxvjx45GYmAid7uY0QoPBgCFDhuDuu+/GqlWrEBMTg6VLl6KkpATPP/88gNLLLyNGjMCvv/6KRx55BJGRkfjxxx/x9NNP49y5c3j99ddNnH755Rf85z//wezZs9G4cWO0b98e77zzDmbOnInRo0djzJgxAIB27doBsKx9yjJ+/HgEBQUhOjoaR48exYYNG9C0aVO8/PLLWpnly5dj2bJl6NGjB55//nk4OjriwIED+OWXXzBo0CAAlvef8owZMwaNGjXC/PnzMWnSJAwbNgwNGzYEAMTHx6N3795wc3PDggULUK9ePbz77ru45557sGfPHnTr1s1kW7NmzUKTJk2wZMkSFBQUVNnezz77LL744gs89thjCAgIgIODA958802TMr///juuXLmCp556SnjU8MaNG9rf2/Xr1/Hnn3/itddeQ58+fUwuRf/8888YOnQogoODsWzZMly7dg1vvfUWevbsiaNHj2rHztLjsWzZMkRHR+PRRx9F165dkZubi8OHD+Po0aO499578dhjjyEjIwM//fQTNm3aJFQn5g7D3hkYw9ga4zdkcz9ERHl5edSoUSOaPn26yfsyMzPJ3d3dJF5YWFhh+59//jkBoL1792qxV155pcIoCxFVawRo0qRJJuVSU1NJr9fTCy+8YBKPi4sjBweHCvHKjkf5ESAAFBsbq8V+/PFHAkAuLi505swZLf7uu+8SAG10iOjmt+o5c+ZoMVVVafjw4eTo6EgXL14kIqJt27YRAFq5cqWJ0wMPPECKotCpU6dMjodOp6P4+HiTshcvXqxwrIxY2j7GY/vPf/7TpOzo0aPJy8tL+z0pKYl0Oh2NHj2aDAaDSVnjiJVI/zGHsU+88sorJvFRo0aRo6MjJScna7GMjAxydXWlPn36aDFje/bq1UtolIboZhsDoDVr1lR4/Y033iAAtG3bNpN4SUkJXbx40eSn7AiesT+V/+nZs2eF0bjIyEhq2rQpXb58WYv9/fffpNPpaPLkycLHo3379mZHn8ry+OOP86gPQ7wKjKkzrFu3Dj/99JPJD1A6anDlyhVMmjQJly5d0n70ej26deuGX3/9VduGi4uL9v/r16/j0qVLuPvuuwEAR48etYn3v/71L5Pft27dClVVMX78eBNfHx8ftGrVysRXhDZt2qB79+7a78Zv1P3790eLFi0qxFNSUipsY/bs2dr/FUXB7NmzUVxcjJ9//hlA6eobvV6PuXPnmrzvySefBBHhhx9+MIn37dsXbdq0sbgOou1T/tj27t0bly9f1lY1bdu2DaqqYsmSJSajXcb6AWL9x1IMBgN27tyJUaNGITg4WIv7+vriwQcfxO+//15h5dX06dOFR2k8PT21ehlHs8pi3IdxVMpIXFwcmjRpYvJz+fJlkzLdunXT/s6+//57vPDCC4iPj8eIESNw7do1AMD58+fx119/YerUqfD09NTe265dO9x7773YsWOH8PFo1KgR4uPjkZSUJHQsmLoHXwJj6gxdu3Y1OwnaeKLs37+/2fe5ublp/8/Ozsby5cvxxRdf4MKFCyblrl69akXbm5RfuZaUlAQiqnQSab169aq1n7JJDgC4u7sDAPz9/c3Gc3JyTOI6nc7kwwkA7rrrLgDQ7jl05swZNGvWDK6uriblWrdurb1elvJ1rwrR9ilfZw8PDwCldXNzc0NycjJ0Ot0tkzCR/mMpFy9eRGFhIUJDQyu81rp1a6iqivT0dISHh2tx0WNlMBgwY8YMNGvWDPn5+Zg7d672pcCIsZ3y8/NN4i1bttTKfvLJJ2YvJTVu3BgDBw7Ufh8+fDhCQ0PxwAMPYMOGDZgzZ47W3pXV88cff0RBQQHy8vIsPh7PP/88Ro4cibvuugtt27bFkCFD8I9//EO7TMowRjgBYuo8qqoCKJ3H4ePjU+F1B4ebfybjx49HbGwsnn76aURGRqJhw4ZQVRVDhgzRtnMrKlt2bjAYKn1P2VENo6+iKPjhhx/MfuMv/23dUiobPagsTjWwhLh83atCtH2sUTeR/mNLRI/VG2+8gT///BPbtm3DuXPn8Pjjj+Ozzz7Dgw8+qJUJCwsDABw/fhwjR47U4g0bNtSSm99//93ifQ4YMAAAsHfvXsyZM0fI11L69OmD5ORkfPPNN9i5cyc2bNiA119/HevXr8ejjz5qk30ytRNOgJg6T0hICACgadOmJt9Yy5OTk4Ndu3Zh+fLlWLJkiRY3N9ReWaJjHGEof4PE8iMfVfkSEYKCgrQRFhlQVRUpKSkmTv/9738BQJvIGhAQgJ9//hl5eXkmo0AnT57UXq+Kyo6tSPtYSkhICFRVRUJCQqX3i7K0/4jQpEkT1K9fH4mJiRVeO3nyJHQ6XYWRORHS09OxdOlSjBw5EiNHjoSqqti4cSOioqIwfPhwbZSvd+/ecHd3xxdffIGFCxdWuAwoSklJCYCbI0rG9q6sno0bN0aDBg3g7OwsdDw8PT0xbdo0TJs2Dfn5+ejTpw+WLVumJUC18f5XjPXhOUBMnWfw4MFwc3PDiy++iBs3blR43bhyyzhaUH50YM2aNRXeY7yPSvlEx83NDY0bN8bevXtN4m+//bbFvmPGjIFer8fy5csruBBRhbkYNcnatWtNXNauXYt69epp3/yHDRsGg8FgUg4AXn/9dSiKgqFDh1a5j/r16wOoeGxF2sdSRo0aBZ1Oh+eff77CCJJxP5b2HxH0ej0GDRqEb775xuSRJVlZWfjss8/Qq1eval1aMzJnzhwQEd566y0ApZcv169fj0uXLmHRokVaufr162PBggU4fvw4nnnmGbMjYyKjZd999x0AoH379gBLine truncated
"text/plain": [ "text/plain": [
"<Figure size 640x480 with 1 Axes>" "<Figure size 640x480 with 1 Axes>"
] ]
@@ -441,12 +465,12 @@
" 'max_depth': [8, 10, 12],\n", " 'max_depth': [8, 10, 12],\n",
" 'min_samples_split': [4, 5, 6],\n", " 'min_samples_split': [4, 5, 6],\n",
" }),\n", " }),\n",
" 'Random Forest': (RandomForestClassifier(bootstrap=use_bootstrap, random_state=42), {\n", " 'Random Forest': (RandomForestClassifier(bootstrap=use_bootstrap, random_state=42, n_jobs=-1), {\n",
" 'n_estimators': [75, 100, 150], \n", " 'n_estimators': [75, 100, 150], \n",
" 'max_depth': [15, 20, 25],\n", " 'max_depth': [15, 20, 25],\n",
" 'min_samples_split': [8, 10, 12],\n", " 'min_samples_split': [8, 10, 12],\n",
" }),\n", " }),\n",
" 'XGBoost': (XGBClassifier(eval_metric='mlogloss', random_state=42), {\n", " 'XGBoost': (XGBClassifier(eval_metric='mlogloss', random_state=42, n_jobs=-1), {\n",
" 'n_estimators': [75, 100, 150],\n", " 'n_estimators': [75, 100, 150],\n",
" 'learning_rate': [0.15, 0.2, 0.25],\n", " 'learning_rate': [0.15, 0.2, 0.25],\n",
" 'max_depth': [4, 5, 6]\n", " 'max_depth': [4, 5, 6]\n",
@@ -468,13 +492,13 @@
"id": "01f5866d", "id": "01f5866d",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### Remove redundant features\n", "### Remove redundant features (optional)\n",
"This section is pretty bad :(. If we want to remove redunant features we need to select different features for different models, which I have not implemented." "If we want to remove redundant features, we will have to select different features for different models as the importance scores varied slightly between models. However, we have kept this section optional since we may want to use the same feature sets for all models in order to produce a fair comparison. Nevertheless, for optimal performance of each model, this step is advantageous."
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": 10,
"id": "776cdb17", "id": "776cdb17",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -488,9 +512,9 @@
"\n", "\n",
"------ Results Sorted by Accuracy ------\n", "------ Results Sorted by Accuracy ------\n",
" Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n", " Model Accuracy Precision Recall F1 Score Best Params Training Time (s) Prediction Time (s) Total Time (s)\n",
" XGBoost 0.867893 0.863335 0.867893 0.863496 {'learning_rate': 0.15, 'max_depth': 5, 'n_estimators': 100} 20.872965 0.009083 20.882048\n", " XGBoost 0.866899 0.862456 0.866899 0.863047 {'learning_rate': 0.2, 'max_depth': 6, 'n_estimators': 75} 25.690541 0.011451 25.701992\n",
"Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 140.562873 0.179120 140.741993\n", "Random Forest 0.858942 0.853479 0.858942 0.853443 {'max_depth': 20, 'min_samples_split': 10, 'n_estimators': 100} 140.522713 0.048441 140.571154\n",
"Decision Tree 0.848666 0.843533 0.848666 0.837078 {'max_depth': 8, 'min_samples_split': 4} 1.247936 0.001514 1.249449\n" "Decision Tree 0.847008 0.840347 0.847008 0.840760 {'max_depth': 10, 'min_samples_split': 4} 11.239021 0.005791 11.244812\n"
] ]
} }
], ],
@@ -501,6 +525,7 @@
"# Remove redundant features for XGBoost\n", "# Remove redundant features for XGBoost\n",
"X_xgb = X_train_val.drop(columns=['native.country', 'race'])\n", "X_xgb = X_train_val.drop(columns=['native.country', 'race'])\n",
"\n", "\n",
"\n",
"# Train decision tree without redundant features\n", "# Train decision tree without redundant features\n",
"cmp_dt = ClassifierComparisonOpt(X_dt, y_train_val)\n", "cmp_dt = ClassifierComparisonOpt(X_dt, y_train_val)\n",
"cmp_dt.fit_models({'Decision Tree': fine_grid['Decision Tree']})\n", "cmp_dt.fit_models({'Decision Tree': fine_grid['Decision Tree']})\n",
@@ -513,6 +538,7 @@
"cmp_rf = ClassifierComparisonOpt(X_train_val, y_train_val)\n", "cmp_rf = ClassifierComparisonOpt(X_train_val, y_train_val)\n",
"cmp_rf.fit_models({'Random Forest': fine_grid['Random Forest']})\n", "cmp_rf.fit_models({'Random Forest': fine_grid['Random Forest']})\n",
"\n", "\n",
"\n",
"# Print results\n", "# Print results\n",
"res = pd.concat([cmp_dt.results_df, cmp_rf.results_df, cmp_xgb.results_df])\n", "res = pd.concat([cmp_dt.results_df, cmp_rf.results_df, cmp_xgb.results_df])\n",
"print(\"\\n------ Results Sorted by Accuracy ------\")\n", "print(\"\\n------ Results Sorted by Accuracy ------\")\n",
@@ -542,11 +568,11 @@
"\n", "\n",
"# Train the model\n", "# Train the model\n",
"dt.fit(X_train_val, y_train_val)\n", "dt.fit(X_train_val, y_train_val)\n",
"y_pred = dt.predict(X_test)\n", "y_pred_dt = dt.predict(X_test)\n",
"\n", "\n",
"# Classification Report\n", "# Classification Report\n",
"print(\"Classification Report:\")\n", "print(\"Classification Report:\")\n",
"print(classification_report(y_val, y_pred, target_names=[\"Poor\", \"Rich\"]))\n", "print(classification_report(y_test, y_pred_dt, target_names=[\"Poor\", \"Rich\"]))\n",
"\n", "\n",
"\n", "\n",
"# ---------------------------- Random Forest ----------------------------\n", "# ---------------------------- Random Forest ----------------------------\n",
@@ -560,21 +586,21 @@
"\n", "\n",
"# Classification Report\n", "# Classification Report\n",
"print(\"Classification Report:\")\n", "print(\"Classification Report:\")\n",
"print(classification_report(y_val, y_pred, target_names=[\"Poor\", \"Rich\"]))\n", "print(classification_report(y_test, y_pred_dt, target_names=[\"Poor\", \"Rich\"]))\n",
"\n", "\n",
"\n", "\n",
"# ---------------------------- Random Forest ----------------------------\n", "# ---------------------------- XGBoost ----------------------------\n",
"xgb = Pipeline([\n", "xgb = Pipeline([\n",
" ('xgb', XGBClassifier(learning_rate=0.15, max_depth=5, n_estimators=100, random_state=42))\n", " ('xgb', XGBClassifier(learning_rate=0.15, max_depth=5, n_estimators=100, random_state=42))\n",
"])\n", "])\n",
"\n", "\n",
"# Train the model\n", "# Train the model\n",
"xgb.fit(X_train_val, y_train_val)\n", "xgb.fit(X_train_val, y_train_val)\n",
"y_pred = cmp_xgb.predict(X_test)\n", "y_pred = xgb.predict(X_test)\n",
"\n", "\n",
"# Classification Report\n", "# Classification Report\n",
"print(\"Classification Report:\")\n", "print(\"Classification Report:\")\n",
"print(classification_report(y_val, y_pred, target_names=[\"Poor\", \"Rich\"]))" "print(classification_report(y_test, y_pred_dt, target_names=[\"Poor\", \"Rich\"]))"
] ]
} }
], ],
@@ -594,7 +620,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.13.7" "version": "3.12.12"
} }
}, },
"nbformat": 4, "nbformat": 4,