From 780fad37c126c08cf4a96a8be23bd1adbda98922 Mon Sep 17 00:00:00 2001 From: "Shekwoyeyilo2.gado@live.uwe.ac.uk" <sarah.y.gado@gmail.com> Date: Mon, 24 Mar 2025 14:30:38 +0000 Subject: [PATCH] [add] models --- models.ipynb | 346 ++++++++++++- models2.ipynb | 1379 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1711 insertions(+), 14 deletions(-) create mode 100644 models2.ipynb diff --git a/models.ipynb b/models.ipynb index 1387698..773419b 100644 --- a/models.ipynb +++ b/models.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -19,12 +19,13 @@ "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import cross_val_score, KFold\n", "from sklearn.svm import SVC\n", - "from scipy.stats import randint" + "from scipy.stats import randint\n", + "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -155,7 +156,7 @@ "9 ['BehavioralProblems', 'DifficultyCompletingTa... " ] }, - "execution_count": 11, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -167,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -181,7 +182,7 @@ " 'MMSE']" ] }, - "execution_count": 12, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -195,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -581,7 +582,7 @@ "[2149 rows x 35 columns]" ] }, - "execution_count": 13, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -593,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -772,7 +773,7 @@ "[2149 rows x 7 columns]" ] }, - "execution_count": 14, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -785,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -840,7 +841,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -867,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -904,7 +905,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -930,6 +931,323 @@ "Running RandomizedSearchCV for svc...\n", "Best parameters for svc: {'kernel': 'rbf', 'gamma': 'auto', 'C': 10}" ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.93 0.96 0.94 277\n", + " 1 0.92 0.87 0.90 153\n", + "\n", + " accuracy 0.93 430\n", + " macro avg 0.93 0.91 0.92 430\n", + "weighted avg 0.93 0.93 0.93 430\n", + "\n", + "\n", + " =================================================\n", + "\n", + "Confusion Matrix:\n", + " [[266 11]\n", + " [ 20 133]]\n", + "\n", + " =================================================\n", + "\n", + "Accuracy Score:\n", + " 0.9279069767441861\n", + "[0.9279069767441861]\n", + "\n", + " =================================================\n", + "\n", + "[0.9273908901898491]\n", + "[0.927771792161327]\n" + ] + } + ], + "source": [ + "accuracy_scores = [] \n", + "metrics = {\n", + " \"Model\": [],\n", + " \"Accuracy\": [],\n", + " \"Precision\": [],\n", + " \"Recall\": [],\n", + " \"F1-Score\": []\n", + "}\n", + "\n", + "modelsvc = SVC(kernel='rbf', gamma='auto', C=10)\n", + "modelsvc.fit(X_train_scaled, y_train)\n", + "\n", + "y_predsvc = modelsvc.predict(X_test_scaled)\n", + "accuracysvc = accuracy_score(y_test, y_predsvc)\n", + "report_svc = classification_report(y_test, y_predsvc, output_dict=True)\n", + "\n", + "precision_svc = report_svc[\"weighted avg\"][\"precision\"]\n", + "recall_svc = report_svc[\"weighted avg\"][\"recall\"]\n", + "f1_svc = report_svc[\"weighted avg\"][\"f1-score\"]\n", + "\n", + "metrics[\"Model\"].append(\"SVC\")\n", + "metrics[\"Accuracy\"].append(accuracysvc)\n", + "metrics[\"Precision\"].append(precision_svc)\n", + "metrics[\"Recall\"].append(recall_svc)\n", + "metrics[\"F1-Score\"].append(f1_svc)\n", + "\n", + "\n", + "print(\"Classification Report:\\n\", classification_report(y_test, y_predsvc))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_predsvc))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Accuracy Score:\\n\", accuracysvc)\n", + "\n", + "accuracy_scores.append(accuracysvc)\n", + "print(accuracy_scores)\n", + "print(\"\\n =================================================\\n\")\n", + "print(metrics[\"F1-Score\"])\n", + "print(metrics[\"Precision\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.94 0.97 0.96 277\n", + " 1 0.95 0.90 0.92 153\n", + "\n", + " accuracy 0.95 430\n", + " macro avg 0.95 0.94 0.94 430\n", + "weighted avg 0.95 0.95 0.95 430\n", + "\n", + "\n", + " =================================================\n", + "\n", + "Confusion Matrix:\n", + " [[270 7]\n", + " [ 16 137]]\n", + "\n", + " =================================================\n", + "\n", + "Accuracy Score:\n", + " 0.9465116279069767\n", + "[0.9279069767441861, 0.9465116279069767]\n", + "\n", + " =================================================\n", + "\n", + "[0.9273908901898491, 0.9461287249795657]\n", + "[0.927771792161327, 0.9466651081476662]\n" + ] + } + ], + "source": [ + "modeld = DecisionTreeClassifier(criterion= 'entropy', max_depth= 10, min_samples_leaf= 4, min_samples_split= 2)\n", + "modeld.fit(X_train_scaled, y_train)\n", + "\n", + "y_predd= modeld.predict(X_test_scaled)\n", + "accuracyd = accuracy_score(y_test, y_predd)\n", + "report_d = classification_report(y_test, y_predd, output_dict=True)\n", + "\n", + "precision_d = report_d[\"weighted avg\"][\"precision\"]\n", + "recall_d = report_d[\"weighted avg\"][\"recall\"]\n", + "f1_d = report_d[\"weighted avg\"][\"f1-score\"]\n", + "\n", + "metrics[\"Model\"].append(\"Decision Tree\")\n", + "metrics[\"Accuracy\"].append(accuracyd)\n", + "metrics[\"Precision\"].append(precision_d)\n", + "metrics[\"Recall\"].append(recall_d)\n", + "metrics[\"F1-Score\"].append(f1_d)\n", + "\n", + "\n", + "print(\"Classification Report:\\n\", classification_report(y_test, y_predd))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_predd))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Accuracy Score:\\n\", accuracyd)\n", + "\n", + "accuracy_scores.append(accuracyd)\n", + "print(accuracy_scores)\n", + "print(\"\\n =================================================\\n\")\n", + "print(metrics[\"F1-Score\"])\n", + "print(metrics[\"Precision\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.98 0.96 277\n", + " 1 0.97 0.90 0.93 153\n", + "\n", + " accuracy 0.95 430\n", + " macro avg 0.96 0.94 0.95 430\n", + "weighted avg 0.95 0.95 0.95 430\n", + "\n", + "\n", + " =================================================\n", + "\n", + "Confusion Matrix:\n", + " [[272 5]\n", + " [ 15 138]]\n", + "\n", + " =================================================\n", + "\n", + "Accuracy Score:\n", + " 0.9534883720930233\n", + "[0.9279069767441861, 0.9465116279069767, 0.9465116279069767, 0.9534883720930233]\n", + "\n", + " =================================================\n", + "\n", + "[0.9273908901898491, 0.9461287249795657, 0.9461287249795657, 0.9531150398295376]\n", + "[0.927771792161327, 0.9466651081476662, 0.9466651081476662, 0.9538906924045891]\n" + ] + } + ], + "source": [ + "modelr = RandomForestClassifier( criterion= 'gini', max_depth= 50, min_samples_leaf= 2, min_samples_split= 8, n_estimators= 102, random_state= 42)\n", + "modelr.fit(X_train_scaled, y_train)\n", + "y_predr= modelr.predict(X_test_scaled)\n", + "accuracyr = accuracy_score(y_test, y_predr)\n", + "report_r = classification_report(y_test, y_predr, output_dict=True)\n", + "\n", + "precision_r = report_r[\"weighted avg\"][\"precision\"]\n", + "recall_r = report_r[\"weighted avg\"][\"recall\"]\n", + "f1_r = report_r[\"weighted avg\"][\"f1-score\"]\n", + "\n", + "metrics[\"Model\"].append(\"Random Forest\")\n", + "metrics[\"Accuracy\"].append(accuracyr)\n", + "metrics[\"Precision\"].append(precision_r)\n", + "metrics[\"Recall\"].append(recall_r)\n", + "metrics[\"F1-Score\"].append(f1_r)\n", + "\n", + "\n", + "print(\"Classification Report:\\n\", classification_report(y_test, y_predr))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_predr))\n", + "print(\"\\n =================================================\\n\")\n", + "print(\"Accuracy Score:\\n\", accuracyr)\n", + "\n", + "accuracy_scores.append(accuracyr)\n", + "print(accuracy_scores)\n", + "print(\"\\n =================================================\\n\")\n", + "print(metrics[\"F1-Score\"])\n", + "print(metrics[\"Precision\"])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\sarah\\AppData\\Local\\Temp\\ipykernel_3388\\1676727495.py:51: UserWarning: Glyph 128309 (\\N{LARGE BLUE CIRCLE}) missing from current font.\n", + " plt.tight_layout()\n", + "C:\\Users\\sarah\\AppData\\Local\\Temp\\ipykernel_3388\\1676727495.py:51: UserWarning: Glyph 128992 (\\N{LARGE ORANGE CIRCLE}) missing from current font.\n", + " plt.tight_layout()\n", + "C:\\Users\\sarah\\AppData\\Local\\Temp\\ipykernel_3388\\1676727495.py:51: UserWarning: Glyph 128994 (\\N{LARGE GREEN CIRCLE}) missing from current font.\n", + " plt.tight_layout()\n", + "C:\\Users\\sarah\\AppData\\Local\\Temp\\ipykernel_3388\\1676727495.py:51: UserWarning: Glyph 128308 (\\N{LARGE RED CIRCLE}) missing from current font.\n", + " plt.tight_layout()\n", + "c:\\Users\\sarah\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 128309 (\\N{LARGE BLUE CIRCLE}) missing from current font.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "c:\\Users\\sarah\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 128992 (\\N{LARGE ORANGE CIRCLE}) missing from current font.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "c:\\Users\\sarah\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 128994 (\\N{LARGE GREEN CIRCLE}) missing from current font.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "c:\\Users\\sarah\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 128308 (\\N{LARGE RED CIRCLE}) missing from current font.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n" + ] + }, + { + "data": { + "image/png": "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nNDq1as1bNgwPf744/e9H7Nnz7Z8vpeXV7r1Xbt21eTJk7V3715VqVJFI0eO1Pvvv6+bN2/qhRdekL+/vw4cOKCLFy9q7Nix8vX11T/+8Q/17t1bTZo00SuvvKLg4GAdPnxYe/fu1WeffSZJevnll/X555/rpZde0iuvvKJLly5p4sSJ8vPzu+/a27Rpo6VLl6p///565plndPLkSb3//vsKCQnRoUOHLOMaNGigl19+WePHj9e5c+fUpk0beXp6avfu3fLx8dFrr71mGRsQEKCuXbtqxowZCg8P19NPP33f9QAAgHt79913tXjx4ixvj7/7xN7dV3Knndh75513JFmf2OvUqZNlXNqJvbtP1rVp00YffvihAgMDFRkZmcN79eDKlSunRx55RHv37tWHH36Y5diWLVvqq6++0sGDB7N9BXfJkiU1cOBArVu3Tlu2bMl03FNPPaWJEyfq66+/tmRVSVqyZIkSExMtJ1UBPDyaUgBy3YwZM1S6dGnNnj1b//rXv+Tv768WLVpowoQJVpc7jxs3TgUKFND06dP11VdfKSoqSjNnztQnn3xi9X4FChTQpk2b9NFHH2nWrFmKjY2Vt7e3SpYsqSZNmjzQlVL79u3Tzp07NXjw4AwbUpLUp08fTZ48WbNnz9bUqVM1btw4PfLII5o2bZq6dOkiNzc3PfLIIxo0aJBlm169eik0NFQff/yxevfuLcMwFBERoW7dulnG1KtXT19++aU++ugjtWvXTqVKldLo0aO1YsWK+57ToUePHjp//rxmzpypOXPmqFSpUnr77bd16tQpjR071mpsdHS0qlevrtmzZys6Olre3t6qUKGCRo4cme59O3furBkzZujVV1+ViwsX1QIAkJPyyom9nPD555+rZcuWat68ubp3767ixYvr8uXLiomJ0a5du/Tdd99JupMTf/rpJzVs2FAjR45UpUqVdPXqVa1cuVJDhw5VVFRUuve+du2aGjVqpBdffFFRUVEqWLCgtm/frpUrV6pjx46Z1tS0aVM1b95cb731luLj41WvXj3t27dPo0ePVrVq1fTyyy/n2vcB5Dv2nWcdgK087JNjkL8MHTrU8Pb2Ni5evGjvUgAAsKucfoJxZv7+9D3DMIzU1FTj448/NsqWLWu4u7sbQUFBxksvvWScPHnSapzZbDYmTJhghIWFGR4eHkblypWNH374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5WVZ3qRJEy1cuDDHigMAAMgryE8AAADW3LKz0fLly7Vw4ULVrl1bJpPJsrxChQo6cuRIjhUHAACQV5CfAAAArGXrSqkLFy6oaNGi6ZYnJiZahSwAAADcQX4CAACwlq2m1GOPPab//ve/lt/TgtS///1v1alTJ2cqAwAAyEPITwAAANaydfvehAkT1KJFCx04cEApKSn65z//qT///FPbtm3Txo0bc7pGAAAAp0d+AgAAsJatK6Xq1q2rrVu36saNGypdurRWr16t4OBgbdu2TTVq1MjpGgEAAJwe+QkAAMDaA18plZycrD59+ui9997Tl19+mRs1AQAA5CnkJwAAgPQe+Eopd3d3LVu2LDdqAQAAyJPITwAAAOll6/a9Dh06aPny5TlcCgAAQN5FfgIAALCWrYnOy5Qpo/fff19bt25VjRo1VKBAAav1gwYNypHiAAAA8gryEwAAgLVsNaW++OILBQQEaOfOndq5c6fVOpPJRKgCAAD4G/ITAACAtWw1pWJjY3O6DgAAgDyN/AQAAGAtW3NK3c0wDBmGkRO1AAAA5AvkJwAAgIdoSs2bN0+VKlWSt7e3vL29VblyZX311Vc5WRsAAECeQn4CAAD4P9m6fW/y5Ml67733NHDgQNWrV0+GYWjLli3q16+fLl68qCFDhuR0nQAAAE6N/AQAAGAtW02padOmacaMGeratatlWbt27fToo49qzJgxhCoAAIC/IT8BAABYy9bte2fPnlXdunXTLa9bt67Onj370EUBAADkNeQnAAAAa9lqSpUpU0aLFi1Kt3zhwoV65JFHHrooAACAvIb8BAAAYC1bt++NHTtWnTt31i+//KJ69erJZDJp8+bNWrduXYZhCwAAIL8jPwEAAFjL1pVSnTp10m+//aagoCAtX75cS5cuVVBQkH7//Xd16NAhp2sEAABweuQnAAAAa9m6UkqSatSooa+//jonawEAAMjTyE8AAAD/J1tXSq1YsUKrVq1Kt3zVqlX66aefHrooAACAvIb8BAAAYC1bTam3335bqamp6ZYbhqG33377oYsCAADIa8hPAAAA1rLVlDp06JAqVKiQbnlUVJQOHz780EUBAADkNeQnAAAAa9lqSvn7++vo0aPplh8+fFgFChR46KIAAADyGvITAACAtWw1pdq2bavBgwfryJEjlmWHDx/WsGHD1LZt2xwrDgAA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6aWX9NJLL2U5ply5curTp4+mTZsmFxcXtWzZ0vKkmbCwMA0ZMkSSVKhQIQ0fPlzjx49X79699eyzz+rkyZMaM2ZMukvVBw8erCVLlqhhw4YaMmSIKleuLLPZrBMnTmj16tUaNmyYHn/88RzZx+HDh2vmzJkaO3asnnvuOT3//PP65ptv1KpVK73++uuqVauW3N3dderUKf38889q166dOnTooIiICI0cOVLvv/++bt68qRdeeEH+/v46cOCALl68qLFjxyoqKkqlS5fW22+/LcMwVLhwYf3www9as2ZNjtQOAABsIz9kor/76aeflJiYqISEBEnSgQMHtHjxYklSq1at5OPjk+m2165dU0REhJ599lk1adJEYWFhun79ujZs2KB//vOfKl++vDp27ChJeuGFFzR37lz169dPBw8eVKNGjWQ2m/Xbb7+pfPnyev7559W0aVM1b95cb731luLj41WvXj3L0/eqVauml19++Z77M27cOK1Zs0Z169bVoEGDVK5cOd26dUvHjh3TihUrNHPmzCynZQBAUwqAg5oxY4ZKly6t2bNn61//+pf8/f3VokULTZgwwXKJunQnDBQoUEDTp0/XV199paioKM2cOVOffPKJ1fsVKFBAmzZt0kcffaRZs2YpNjZW3t7eKlmypJo0aZKjZwV9fX01atQoDRgwQN988426du2q77//Xv/85z/11VdfacKECXJzc1OJEiX0xBNPWM4Apu3PI488omnTpqlLly5yc3PTI488okGDBkm6M4/CDz/8oNdff119+/aVm5ubmjRporVr16pkyZI5tg8AAMAxOHMm+rtXX33V6sqt7777Tt99950kKTY2NsvP9vPz09ixY7Vu3TqNHDlS586dk8lkUmRkpAYPHqy33nrL0tRyc3PTihUrNGHCBH377beaMmWKChYsqCpVqqhFixaS7lx9vnz5co0ZM0Zz587VBx98oKCgIL388sv68MMP73nboHRnnqkdO3bo/fff16RJk3Tq1CkVLFhQkZGRatGihQoVKvQQ3xaQP5iMtEcUAMDf/PHHH+rXr582b96c4fr69evriy++UFRUlI0rAwAAsB0yEQDkDuaUAgAAAAAAgM1x+x6ATLm6umrv3r0KCAjIcH1qamqWj9oFAADIC8hEAJA77Pon5y+//KKnn35aoaGhlnt672Xjxo2qUaOGvLy8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qVOndPz4cccN6h555JH8f0MoVJ5//nkVL15ckydPVnx8vHx8fPTEE0/orbfeUnBwcLb7Pfroozp06JAOHz4sDw8PPfLIIxo+fLi6dOni2OaRRx7RgAEDtH79eiUkJMjDw0ORkZF67rnnFB0dbcC7gzv787FbrVo1+fr6qkqVKk6BJ3r9ZEPn2vPSwrvep0+fPpo/f76kW6e5BwcHq2PHjpowYYLTKe+AOyE/werIUHBFy+/xRuJ/vjA0SVJcDts/smOHU1YpUaKEypUrp5SUFKWlpclms8nX11flypVTQECAU+b5o8OHD+vUqVOaNGmS4uLilJSUpKVLlzr9vcjOrl279Nprr2n79u1KTk5WhQoV9NBDD+nDDz9UQEBArt63lVBKIROjnr6xc+dOp2UjR47UyJEj8+U9oHDr2bOnevbsme36rG6IOGLECI0YMSLH7xsWFqYZM2bc83xAdv547F67dk0JCQlO9zRo0KCBtN6k4e5Su3btNHfuXN28eVMHDhxQv379dPHiRX355ZdmjwYUCPIT3AEZCoXdnz888/HxuePlpbczzx+VK1dOhw8fVkREhPr27ev4sOJOzpw5o9atW6tTp05atWqVSpUqpYSEBH333XdOTxrMbzdu3HB6MIGRuHwPmRjx9A1J+vXXX3XlyhX9+9//VokSJTR58mTNnj07/94IAMA03t7eqlChgu677z5FRUWpe/fuWr16tWP93LlzVatWLfn4+KhmzZqaPn260/6//vqrnn76aZUpU0bFixdXgwYN9OOPP0qSjh49qscff1yBgYEqUaKEGjZs6LgMBDAL+QkACqfbmeePXx4eHmrfvr3Gjx/vuLdabmzdulXJycmaNWuW6tWrp9DQULVs2VJTp051eiDB/v371bFjR/n5+alkyZJq1qyZjh49KunWGbjjxo3TfffdJ29vbz344INauXKlY9/jx4/LZrPpq6++0mOPPSYfHx999tlnku6czwoCZ0ohk/x4+sZtp06dcnwq/senb9zm6+urjh07qk2bNlq6dKlef/119e/f/17fAlxIxOSn77wR8iQvl1Uh98w+div4ltHIyKd186yHinh6mDbH/tNH73qfi1dTlHLtimPfE78k6tt/fyebRxHtP31Uiz9bqI+nfKgPPvhA9erV065du/Tcc8+pePHi6t27ty5fvqxHH31UFStW1Hff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", + "text/plain": [ + "<Figure size 1200x1000 with 4 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Convert the metrics dictionary into a DataFrame\n", + "metrics_df = pd.DataFrame(metrics)\n", + "\n", + "# Set the model names as the index\n", + "metrics_df.set_index(\"Model\", inplace=True)\n", + "\n", + "# 🎨 Create a 2x2 grid of subplots for better visualization\n", + "fig, axes = plt.subplots(2, 2, figsize=(12, 10))\n", + "\n", + "# Define a function to add annotations on bars\n", + "def add_value_labels(ax):\n", + " for bar in ax.patches:\n", + " ax.annotate(\n", + " f\"{bar.get_height():.2f}\", # Format to 2 decimal places\n", + " (bar.get_x() + bar.get_width() / 2, bar.get_height()), # Position\n", + " ha='center', va='bottom', fontsize=10, fontweight='bold', color='black'\n", + " )\n", + "\n", + "# 🔹 Plot Accuracy\n", + "metrics_df[\"Accuracy\"].plot(kind=\"bar\", ax=axes[0, 0], color=\"royalblue\", legend=True)\n", + "axes[0, 0].set_title(\"🔵 Model Accuracy\")\n", + "axes[0, 0].set_ylim(0, 1)\n", + "axes[0, 0].set_ylabel(\"Score\")\n", + "add_value_labels(axes[0, 0]) # Add annotations\n", + "\n", + "# 🟠Plot Precision\n", + "metrics_df[\"Precision\"].plot(kind=\"bar\", ax=axes[0, 1], color=\"darkorange\", legend=True)\n", + "axes[0, 1].set_title(\"🟠Model Precision\")\n", + "axes[0, 1].set_ylim(0, 1)\n", + "axes[0, 1].set_ylabel(\"Score\")\n", + "add_value_labels(axes[0, 1]) # Add annotations\n", + "\n", + "# 🟢 Plot Recall\n", + "metrics_df[\"Recall\"].plot(kind=\"bar\", ax=axes[1, 0], color=\"seagreen\", legend=True)\n", + "axes[1, 0].set_title(\"🟢 Model Recall\")\n", + "axes[1, 0].set_ylim(0, 1)\n", + "axes[1, 0].set_ylabel(\"Score\")\n", + "add_value_labels(axes[1, 0]) # Add annotations\n", + "\n", + "# 🔴 Plot F1-Score\n", + "metrics_df[\"F1-Score\"].plot(kind=\"bar\", ax=axes[1, 1], color=\"firebrick\", legend=True)\n", + "axes[1, 1].set_title(\"🔴 Model F1-Score\")\n", + "axes[1, 1].set_ylim(0, 1)\n", + "axes[1, 1].set_ylabel(\"Score\")\n", + "add_value_labels(axes[1, 1]) # Add annotations\n", + "\n", + "# 📌 Adjust layout for a better fit\n", + "plt.tight_layout()\n", + "\n", + "# 🎉 Show the plot!\n", + "plt.show()\n" + ] } ], "metadata": { diff --git a/models2.ipynb b/models2.ipynb new file mode 100644 index 0000000..e410c3a --- /dev/null +++ b/models2.ipynb @@ -0,0 +1,1379 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import ast\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.model_selection import RandomizedSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import cross_val_score, KFold\n", + "from sklearn.svm import SVC\n", + "from scipy.stats import randint" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "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>PatientID</th>\n", + " <th>Age</th>\n", + " <th>Gender</th>\n", + " <th>Ethnicity</th>\n", + " <th>EducationLevel</th>\n", + " <th>BMI</th>\n", + " <th>Smoking</th>\n", + " <th>AlcoholConsumption</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>DietQuality</th>\n", + " <th>...</th>\n", + " <th>MemoryComplaints</th>\n", + " <th>BehavioralProblems</th>\n", + " <th>ADL</th>\n", + " <th>Confusion</th>\n", + " <th>Disorientation</th>\n", + " <th>PersonalityChanges</th>\n", + " <th>DifficultyCompletingTasks</th>\n", + " <th>Forgetfulness</th>\n", + " <th>Diagnosis</th>\n", + " <th>DoctorInCharge</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>4751</td>\n", + " <td>73</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>22.927749</td>\n", + " <td>0</td>\n", + " <td>13.297218</td>\n", + " <td>6.327112</td>\n", + " <td>1.347214</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.725883</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>4752</td>\n", + " <td>89</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>26.827681</td>\n", + " <td>0</td>\n", + " <td>4.542524</td>\n", + " <td>7.619885</td>\n", + " <td>0.518767</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.592424</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>4753</td>\n", + " <td>73</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>17.795882</td>\n", + " <td>0</td>\n", + " <td>19.555085</td>\n", + " <td>7.844988</td>\n", + " <td>1.826335</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>7.119548</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>4754</td>\n", + " <td>74</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>33.800817</td>\n", + " <td>1</td>\n", + " <td>12.209266</td>\n", + " <td>8.428001</td>\n", + " <td>7.435604</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>6.481226</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>4755</td>\n", + " <td>89</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>20.716974</td>\n", + " <td>0</td>\n", + " <td>18.454356</td>\n", + " <td>6.310461</td>\n", + " <td>0.795498</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.014691</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2144</th>\n", + " <td>6895</td>\n", + " <td>61</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>39.121757</td>\n", + " <td>0</td>\n", + " <td>1.561126</td>\n", + " <td>4.049964</td>\n", + " <td>6.555306</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4.492838</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2145</th>\n", + " <td>6896</td>\n", + " <td>75</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>17.857903</td>\n", + " <td>0</td>\n", + " <td>18.767261</td>\n", + " <td>1.360667</td>\n", + " <td>2.904662</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>9.204952</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2146</th>\n", + " <td>6897</td>\n", + " <td>77</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>15.476479</td>\n", + " <td>0</td>\n", + " <td>4.594670</td>\n", + " <td>9.886002</td>\n", + " <td>8.120025</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>5.036334</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2147</th>\n", + " <td>6898</td>\n", + " <td>78</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>15.299911</td>\n", + " <td>0</td>\n", + " <td>8.674505</td>\n", + " <td>6.354282</td>\n", + " <td>1.263427</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3.785399</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2148</th>\n", + " <td>6899</td>\n", + " <td>72</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>33.289738</td>\n", + " <td>0</td>\n", + " <td>7.890703</td>\n", + " <td>6.570993</td>\n", + " <td>7.941404</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>8.327563</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>XXXConfid</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>2149 rows × 35 columns</p>\n", + "</div>" + ], + "text/plain": [ + " PatientID Age Gender Ethnicity EducationLevel BMI Smoking \\\n", + "0 4751 73 0 0 2 22.927749 0 \n", + "1 4752 89 0 0 0 26.827681 0 \n", + "2 4753 73 0 3 1 17.795882 0 \n", + "3 4754 74 1 0 1 33.800817 1 \n", + "4 4755 89 0 0 0 20.716974 0 \n", + "... ... ... ... ... ... ... ... \n", + "2144 6895 61 0 0 1 39.121757 0 \n", + "2145 6896 75 0 0 2 17.857903 0 \n", + "2146 6897 77 0 0 1 15.476479 0 \n", + "2147 6898 78 1 3 1 15.299911 0 \n", + "2148 6899 72 0 0 2 33.289738 0 \n", + "\n", + " AlcoholConsumption PhysicalActivity DietQuality ... \\\n", + "0 13.297218 6.327112 1.347214 ... \n", + "1 4.542524 7.619885 0.518767 ... \n", + "2 19.555085 7.844988 1.826335 ... \n", + "3 12.209266 8.428001 7.435604 ... \n", + "4 18.454356 6.310461 0.795498 ... \n", + "... ... ... ... ... \n", + "2144 1.561126 4.049964 6.555306 ... \n", + "2145 18.767261 1.360667 2.904662 ... \n", + "2146 4.594670 9.886002 8.120025 ... \n", + "2147 8.674505 6.354282 1.263427 ... \n", + "2148 7.890703 6.570993 7.941404 ... \n", + "\n", + " MemoryComplaints BehavioralProblems ADL Confusion \\\n", + "0 0 0 1.725883 0 \n", + "1 0 0 2.592424 0 \n", + "2 0 0 7.119548 0 \n", + "3 0 1 6.481226 0 \n", + "4 0 0 0.014691 0 \n", + "... ... ... ... ... \n", + "2144 0 0 4.492838 1 \n", + "2145 0 1 9.204952 0 \n", + "2146 0 0 5.036334 0 \n", + "2147 0 0 3.785399 0 \n", + "2148 0 1 8.327563 0 \n", + "\n", + " Disorientation PersonalityChanges DifficultyCompletingTasks \\\n", + "0 0 0 1 \n", + "1 0 0 0 \n", + "2 1 0 1 \n", + "3 0 0 0 \n", + "4 0 1 1 \n", + "... ... ... ... \n", + "2144 0 0 0 \n", + "2145 0 0 0 \n", + "2146 0 0 0 \n", + "2147 0 0 0 \n", + "2148 1 0 0 \n", + "\n", + " Forgetfulness Diagnosis DoctorInCharge \n", + "0 0 0 XXXConfid \n", + "1 1 0 XXXConfid \n", + "2 0 0 XXXConfid \n", + "3 0 0 XXXConfid \n", + "4 0 0 XXXConfid \n", + "... ... ... ... \n", + "2144 0 1 XXXConfid \n", + "2145 0 1 XXXConfid \n", + "2146 0 1 XXXConfid \n", + "2147 1 1 XXXConfid \n", + "2148 1 0 XXXConfid \n", + "\n", + "[2149 rows x 35 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('alzheimers_disease_data.csv')\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Age</th>\n", + " <th>Gender</th>\n", + " <th>Ethnicity</th>\n", + " <th>EducationLevel</th>\n", + " <th>BMI</th>\n", + " <th>Smoking</th>\n", + " <th>AlcoholConsumption</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>DietQuality</th>\n", + " <th>SleepQuality</th>\n", + " <th>...</th>\n", + " <th>FunctionalAssessment</th>\n", + " <th>MemoryComplaints</th>\n", + " <th>BehavioralProblems</th>\n", + " <th>ADL</th>\n", + " <th>Confusion</th>\n", + " <th>Disorientation</th>\n", + " <th>PersonalityChanges</th>\n", + " <th>DifficultyCompletingTasks</th>\n", + " <th>Forgetfulness</th>\n", + " <th>Diagnosis</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>73</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>22.927749</td>\n", + " <td>0</td>\n", + " <td>13.297218</td>\n", + " <td>6.327112</td>\n", + " <td>1.347214</td>\n", + " <td>9.025679</td>\n", + " <td>...</td>\n", + " <td>6.518877</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.725883</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>89</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>26.827681</td>\n", + " <td>0</td>\n", + " <td>4.542524</td>\n", + " <td>7.619885</td>\n", + " <td>0.518767</td>\n", + " <td>7.151293</td>\n", + " <td>...</td>\n", + " <td>7.118696</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.592424</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>73</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>17.795882</td>\n", + " <td>0</td>\n", + " <td>19.555085</td>\n", + " <td>7.844988</td>\n", + " <td>1.826335</td>\n", + " <td>9.673574</td>\n", + " <td>...</td>\n", + " <td>5.895077</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>7.119548</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>74</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>33.800817</td>\n", + " <td>1</td>\n", + " <td>12.209266</td>\n", + " <td>8.428001</td>\n", + " <td>7.435604</td>\n", + " <td>8.392554</td>\n", + " <td>...</td>\n", + " <td>8.965106</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>6.481226</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>89</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>20.716974</td>\n", + " <td>0</td>\n", + " <td>18.454356</td>\n", + " <td>6.310461</td>\n", + " <td>0.795498</td>\n", + " <td>5.597238</td>\n", + " <td>...</td>\n", + " <td>6.045039</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.014691</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2144</th>\n", + " <td>61</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>39.121757</td>\n", + " <td>0</td>\n", + " <td>1.561126</td>\n", + " <td>4.049964</td>\n", + " <td>6.555306</td>\n", + " <td>7.535540</td>\n", + " <td>...</td>\n", + " <td>0.238667</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4.492838</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2145</th>\n", + " <td>75</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>17.857903</td>\n", + " <td>0</td>\n", + " <td>18.767261</td>\n", + " <td>1.360667</td>\n", + " <td>2.904662</td>\n", + " <td>8.555256</td>\n", + " <td>...</td>\n", + " <td>8.687480</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>9.204952</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2146</th>\n", + " <td>77</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>15.476479</td>\n", + " <td>0</td>\n", + " <td>4.594670</td>\n", + " <td>9.886002</td>\n", + " <td>8.120025</td>\n", + " <td>5.769464</td>\n", + " <td>...</td>\n", + " <td>1.972137</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>5.036334</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2147</th>\n", + " <td>78</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>15.299911</td>\n", + " <td>0</td>\n", + " <td>8.674505</td>\n", + " <td>6.354282</td>\n", + " <td>1.263427</td>\n", + " <td>8.322874</td>\n", + " <td>...</td>\n", + " <td>5.173891</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3.785399</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2148</th>\n", + " <td>72</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>33.289738</td>\n", + " <td>0</td>\n", + " <td>7.890703</td>\n", + " <td>6.570993</td>\n", + " <td>7.941404</td>\n", + " <td>9.878711</td>\n", + " <td>...</td>\n", + " <td>6.307543</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>8.327563</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>2149 rows × 33 columns</p>\n", + "</div>" + ], + "text/plain": [ + " Age Gender Ethnicity EducationLevel BMI Smoking \\\n", + "0 73 0 0 2 22.927749 0 \n", + "1 89 0 0 0 26.827681 0 \n", + "2 73 0 3 1 17.795882 0 \n", + "3 74 1 0 1 33.800817 1 \n", + "4 89 0 0 0 20.716974 0 \n", + "... ... ... ... ... ... ... \n", + "2144 61 0 0 1 39.121757 0 \n", + "2145 75 0 0 2 17.857903 0 \n", + "2146 77 0 0 1 15.476479 0 \n", + "2147 78 1 3 1 15.299911 0 \n", + "2148 72 0 0 2 33.289738 0 \n", + "\n", + " AlcoholConsumption PhysicalActivity DietQuality SleepQuality ... \\\n", + "0 13.297218 6.327112 1.347214 9.025679 ... \n", + "1 4.542524 7.619885 0.518767 7.151293 ... \n", + "2 19.555085 7.844988 1.826335 9.673574 ... \n", + "3 12.209266 8.428001 7.435604 8.392554 ... \n", + "4 18.454356 6.310461 0.795498 5.597238 ... \n", + "... ... ... ... ... ... \n", + "2144 1.561126 4.049964 6.555306 7.535540 ... \n", + "2145 18.767261 1.360667 2.904662 8.555256 ... \n", + "2146 4.594670 9.886002 8.120025 5.769464 ... \n", + "2147 8.674505 6.354282 1.263427 8.322874 ... \n", + "2148 7.890703 6.570993 7.941404 9.878711 ... \n", + "\n", + " FunctionalAssessment MemoryComplaints BehavioralProblems ADL \\\n", + "0 6.518877 0 0 1.725883 \n", + "1 7.118696 0 0 2.592424 \n", + "2 5.895077 0 0 7.119548 \n", + "3 8.965106 0 1 6.481226 \n", + "4 6.045039 0 0 0.014691 \n", + "... ... ... ... ... \n", + "2144 0.238667 0 0 4.492838 \n", + "2145 8.687480 0 1 9.204952 \n", + "2146 1.972137 0 0 5.036334 \n", + "2147 5.173891 0 0 3.785399 \n", + "2148 6.307543 0 1 8.327563 \n", + "\n", + " Confusion Disorientation PersonalityChanges \\\n", + "0 0 0 0 \n", + "1 0 0 0 \n", + "2 0 1 0 \n", + "3 0 0 0 \n", + "4 0 0 1 \n", + "... ... ... ... \n", + "2144 1 0 0 \n", + "2145 0 0 0 \n", + "2146 0 0 0 \n", + "2147 0 0 0 \n", + "2148 0 1 0 \n", + "\n", + " DifficultyCompletingTasks Forgetfulness Diagnosis \n", + "0 1 0 0 \n", + "1 0 1 0 \n", + "2 1 0 0 \n", + "3 0 0 0 \n", + "4 1 0 0 \n", + "... ... ... ... \n", + "2144 0 0 1 \n", + "2145 0 0 1 \n", + "2146 0 0 1 \n", + "2147 0 1 1 \n", + "2148 0 1 0 \n", + "\n", + "[2149 rows x 33 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_df =df.drop(['DoctorInCharge', 'PatientID'], axis=1, inplace=True)\n", + "\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Pre-processing" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Age</th>\n", + " <th>Gender</th>\n", + " <th>Ethnicity</th>\n", + " <th>EducationLevel</th>\n", + " <th>BMI</th>\n", + " <th>Smoking</th>\n", + " <th>AlcoholConsumption</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>DietQuality</th>\n", + " <th>SleepQuality</th>\n", + " <th>...</th>\n", + " <th>MMSE</th>\n", + " <th>FunctionalAssessment</th>\n", + " <th>MemoryComplaints</th>\n", + " <th>BehavioralProblems</th>\n", + " <th>ADL</th>\n", + " <th>Confusion</th>\n", + " <th>Disorientation</th>\n", + " <th>PersonalityChanges</th>\n", + " <th>DifficultyCompletingTasks</th>\n", + " <th>Forgetfulness</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>1433</th>\n", + " <td>87</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>27.764232</td>\n", + " <td>1</td>\n", + " <td>16.543170</td>\n", + " <td>0.281379</td>\n", + " <td>5.923418</td>\n", + " <td>7.836104</td>\n", + " <td>...</td>\n", + " <td>25.399206</td>\n", + " <td>3.085543</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>6.643693</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>630</th>\n", + " <td>70</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>37.098744</td>\n", + " <td>0</td>\n", + " <td>1.360202</td>\n", + " <td>9.242990</td>\n", + " <td>1.819284</td>\n", + " <td>5.218052</td>\n", + " <td>...</td>\n", + " <td>8.292136</td>\n", + " <td>5.616830</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3.884562</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>78</th>\n", + " <td>82</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>15.908275</td>\n", + " <td>0</td>\n", + " <td>16.329031</td>\n", + " <td>1.915913</td>\n", + " <td>6.607292</td>\n", + " <td>6.146166</td>\n", + " <td>...</td>\n", + " <td>21.042238</td>\n", + " <td>3.662461</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4.013722</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>366</th>\n", + " <td>76</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>30.302432</td>\n", + " <td>1</td>\n", + " <td>11.814030</td>\n", + " <td>6.281170</td>\n", + " <td>6.204349</td>\n", + " <td>6.825155</td>\n", + " <td>...</td>\n", + " <td>28.609438</td>\n", + " <td>4.648135</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>9.355700</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1996</th>\n", + " <td>61</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>24.565357</td>\n", + " <td>1</td>\n", + " <td>2.273373</td>\n", + " <td>9.976581</td>\n", + " <td>2.057188</td>\n", + " <td>4.715534</td>\n", + " <td>...</td>\n", + " <td>2.629135</td>\n", + " <td>9.601238</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>8.818932</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1638</th>\n", + " <td>82</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>22.874070</td>\n", + " <td>0</td>\n", + " <td>16.006145</td>\n", + " <td>7.411056</td>\n", + " <td>2.341965</td>\n", + " <td>6.688947</td>\n", + " <td>...</td>\n", + " <td>7.325867</td>\n", + " <td>5.432951</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.214825</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1095</th>\n", + " <td>82</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>25.522233</td>\n", + " <td>0</td>\n", + " <td>15.432489</td>\n", + " <td>4.149322</td>\n", + " <td>9.605963</td>\n", + " <td>5.235691</td>\n", + " <td>...</td>\n", + " <td>11.671289</td>\n", + " <td>0.298203</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>5.590417</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1130</th>\n", + " <td>85</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>29.216597</td>\n", + " <td>0</td>\n", + " <td>9.424858</td>\n", + " <td>8.004951</td>\n", + " <td>4.276642</td>\n", + " <td>7.641721</td>\n", + " <td>...</td>\n", + " <td>28.463207</td>\n", + " <td>1.957638</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4.030134</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1294</th>\n", + " <td>89</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>25.741021</td>\n", + " <td>0</td>\n", + " <td>0.036260</td>\n", + " <td>6.292084</td>\n", + " <td>9.072249</td>\n", + " <td>8.497493</td>\n", + " <td>...</td>\n", + " <td>6.230189</td>\n", + " <td>5.535547</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3.464861</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>860</th>\n", + " <td>71</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>16.080044</td>\n", + " <td>1</td>\n", + " <td>19.897113</td>\n", + " <td>9.974595</td>\n", + " <td>6.019738</td>\n", + " <td>8.182690</td>\n", + " <td>...</td>\n", + " <td>7.068529</td>\n", + " <td>9.130647</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.566993</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>1719 rows × 32 columns</p>\n", + "</div>" + ], + "text/plain": [ + " Age Gender Ethnicity EducationLevel BMI Smoking \\\n", + "1433 87 1 2 1 27.764232 1 \n", + "630 70 0 0 3 37.098744 0 \n", + "78 82 1 3 2 15.908275 0 \n", + "366 76 1 0 2 30.302432 1 \n", + "1996 61 0 0 2 24.565357 1 \n", + "... ... ... ... ... ... ... \n", + "1638 82 1 0 2 22.874070 0 \n", + "1095 82 0 1 3 25.522233 0 \n", + "1130 85 0 1 2 29.216597 0 \n", + "1294 89 1 0 1 25.741021 0 \n", + "860 71 0 2 2 16.080044 1 \n", + "\n", + " AlcoholConsumption PhysicalActivity DietQuality SleepQuality ... \\\n", + "1433 16.543170 0.281379 5.923418 7.836104 ... \n", + "630 1.360202 9.242990 1.819284 5.218052 ... \n", + "78 16.329031 1.915913 6.607292 6.146166 ... \n", + "366 11.814030 6.281170 6.204349 6.825155 ... \n", + "1996 2.273373 9.976581 2.057188 4.715534 ... \n", + "... ... ... ... ... ... \n", + "1638 16.006145 7.411056 2.341965 6.688947 ... \n", + "1095 15.432489 4.149322 9.605963 5.235691 ... \n", + "1130 9.424858 8.004951 4.276642 7.641721 ... \n", + "1294 0.036260 6.292084 9.072249 8.497493 ... \n", + "860 19.897113 9.974595 6.019738 8.182690 ... \n", + "\n", + " MMSE FunctionalAssessment MemoryComplaints BehavioralProblems \\\n", + "1433 25.399206 3.085543 0 0 \n", + "630 8.292136 5.616830 0 1 \n", + "78 21.042238 3.662461 0 0 \n", + "366 28.609438 4.648135 0 0 \n", + "1996 2.629135 9.601238 1 0 \n", + "... ... ... ... ... \n", + "1638 7.325867 5.432951 0 0 \n", + "1095 11.671289 0.298203 1 0 \n", + "1130 28.463207 1.957638 0 0 \n", + "1294 6.230189 5.535547 0 0 \n", + "860 7.068529 9.130647 0 0 \n", + "\n", + " ADL Confusion Disorientation PersonalityChanges \\\n", + "1433 6.643693 0 0 0 \n", + "630 3.884562 0 0 0 \n", + "78 4.013722 0 0 1 \n", + "366 9.355700 1 0 1 \n", + "1996 8.818932 0 1 0 \n", + "... ... ... ... ... \n", + "1638 0.214825 0 0 1 \n", + "1095 5.590417 0 0 0 \n", + "1130 4.030134 0 0 0 \n", + "1294 3.464861 0 0 0 \n", + "860 0.566993 0 0 0 \n", + "\n", + " DifficultyCompletingTasks Forgetfulness \n", + "1433 0 0 \n", + "630 0 1 \n", + "78 1 0 \n", + "366 0 1 \n", + "1996 0 0 \n", + "... ... ... \n", + "1638 0 0 \n", + "1095 0 1 \n", + "1130 0 0 \n", + "1294 0 0 \n", + "860 0 0 \n", + "\n", + "[1719 rows x 32 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = df.drop('Diagnosis', axis= 1)\n", + "y = df['Diagnosis']\n", + "\n", + "#split the data into test and train\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "#apply scaler\n", + "scaler = StandardScaler()\n", + "X_train_scaled = scaler.fit_transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "X_train" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1433 0\n", + "630 1\n", + "78 1\n", + "366 0\n", + "1996 1\n", + " ..\n", + "1638 0\n", + "1095 1\n", + "1130 0\n", + "1294 0\n", + "860 0\n", + "Name: Diagnosis, Length: 1719, dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building the models" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "kf = KFold(n_splits= 5, shuffle= True, random_state= 42)\n", + "\n", + "models = {\n", + " 'DecisionTree': DecisionTreeClassifier(), 'RandomForest': RandomForestClassifier(), 'svc': SVC()\n", + "}\n", + "\n", + "# Define parameters to test using the randomized grid search\n", + "param_grids = {\n", + " 'DecisionTree': {\n", + " 'criterion': ['gini', 'entropy'],\n", + " 'max_depth': [None, 10, 20, 30, 50],\n", + " 'min_samples_split': randint(2, 10),\n", + " 'min_samples_leaf': randint(1, 5)\n", + " },\n", + " \n", + " 'RandomForest': {\n", + " 'n_estimators': randint(50, 200),\n", + " 'criterion': ['gini', 'entropy'],\n", + " 'max_depth': [None, 10, 20, 30, 50],\n", + " 'min_samples_split': randint(2, 10),\n", + " 'min_samples_leaf': randint(1, 5)\n", + " },\n", + " \n", + " 'svc': {\n", + " 'C': [0.1, 1, 10, 100, 1000],\n", + " 'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],\n", + " 'gamma': ['scale', 'auto', 0.001, 0.01, 0.1, 1, 10]\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running RandomizedSearchCV for DecisionTree...\n", + "Best parameters for DecisionTree: {'criterion': 'gini', 'max_depth': 50, 'min_samples_leaf': 4, 'min_samples_split': 9}\n", + "\n", + "Running RandomizedSearchCV for RandomForest...\n", + "Best parameters for RandomForest: {'criterion': 'entropy', 'max_depth': 50, 'min_samples_leaf': 1, 'min_samples_split': 7, 'n_estimators': 144}\n", + "\n", + "Running RandomizedSearchCV for svc...\n", + "Best parameters for svc: {'kernel': 'rbf', 'gamma': 0.001, 'C': 100}\n", + "\n" + ] + } + ], + "source": [ + "for name, model in models.items():\n", + " #print(name)\n", + " print(f\"Running RandomizedSearchCV for {name}...\")\n", + " random_search = RandomizedSearchCV(model, param_distributions=param_grids[name], cv =kf, n_iter =100, random_state=42, n_jobs=-1)\n", + " random_search.fit(X_train_scaled, y_train)\n", + " print(f\"Best parameters for {name}: {random_search.best_params_}\\n\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Running RandomizedSearchCV for DecisionTree...\n", + "Best parameters for DecisionTree: {'criterion': 'gini', 'max_depth': 50, 'min_samples_leaf': 4, 'min_samples_split': 9}\n", + "\n", + "Running RandomizedSearchCV for RandomForest...\n", + "Best parameters for RandomForest: {'criterion': 'entropy', 'max_depth': 50, 'min_samples_leaf': 1, 'min_samples_split': 7, 'n_estimators': 144}\n", + "\n", + "Running RandomizedSearchCV for svc...\n", + "Best parameters for svc: {'kernel': 'rbf', 'gamma': 0.001, 'C': 100}\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab