{ "cells": [ { "cell_type": "markdown", "id": "8a63dba2", "metadata": {}, "source": [ "# A3 report: Weakest link classification\n", "\n", "Team members: Reem, Rasa, Amol, Kalle\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "39d28570", "metadata": {}, "source": [ "## 1. Problem statement\n", "\n", "The goal is to classify the weakest link in a squat movement. Given 41 movement features, the model predicts which body region is limiting the person's squat. The input is 41 movement features (AimoScore + 13 Angle deviations + 25 NASM deviations + 2 Time deviations) and the output is a body region classification which is upper and lower body. Due to massive class imbalance in the original 14 class problem with some classes with only 1-2 datapoints, we changed to a 2-class approach that gives predictions that actually helps." ] }, { "cell_type": "markdown", "id": "0118b9a4", "metadata": {}, "source": [ "### Original 14 weak link classes \n", "\n", "| Body region | Original classes |\n", "|-------------|------------------|\n", "| Upper Body | ForwardHead, LeftArmFallForward, RightArmFallForward, LeftShoulderElevation, RightShoulderElevation |\n", "| Lower Body | ExcessiveForwardLean, LeftAsymmetricalWeightShift, RightAsymmetricalWeightShift, LeftKneeMovesInward, RightKneeMovesInward, LeftKneeMovesOutward, RightKneeMovesOutward, LeftHeelRises, RightHeelRises |" ] }, { "cell_type": "markdown", "id": "83cd9224", "metadata": {}, "source": [ "## 2. Data preparation\n", "\n", "The classification dataset is created by merging two files from Datasets_all/. The scores_and_weaklink.csv contains 14 weak link scores per movement and aimoscores.csv contains 38 features. The weakest link is found by finding the column with the maximum score using idxmax()." ] }, { "cell_type": "code", "execution_count": 143, "id": "edbe3fbd", "metadata": {}, "outputs": [], "source": [ "# Import all libraries\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import os\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "from sklearn.model_selection import train_test_split, GridSearchCV\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.metrics import (\n", " accuracy_score, precision_score, recall_score, f1_score,\n", " classification_report, confusion_matrix\n", ")\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.naive_bayes import GaussianNB\n", "\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis\n", "import pickle\n", "from sklearn.neighbors import KNeighborsClassifier" ] }, { "cell_type": "code", "execution_count": 144, "id": "23f1b38b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset 1 - Weak Link Scores:\n", "Shape: (2096, 17)\n", "Columns: ['ID', 'Date', 'SCORE', 'ForwardHead', 'LeftArmFallForward', 'RightArmFallForward', 'LeftShoulderElevation', 'RightShoulderElevation', 'ExcessiveForwardLean', 'LeftAsymmetricalWeightShift', 'RightAsymmetricalWeightShift', 'LeftKneeMovesInward', 'RightKneeMovesInward', 'LeftKneeMovesOutward', 'RightKneeMovesOutward', 'LeftHeelRises', 'RightHeelRises']\n", "\n", "\n", "Dataset 2 - Movement Features:\n", "Shape: (2094, 43)\n", "Columns: ['AimoScore', 'No_1_Angle_Deviation', 'No_2_Angle_Deviation', 'No_3_Angle_Deviation', 'No_4_Angle_Deviation', 'No_5_Angle_Deviation', 'No_6_Angle_Deviation', 'No_7_Angle_Deviation', 'No_8_Angle_Deviation', 'No_9_Angle_Deviation']...\n" ] } ], "source": [ "# Configuration\n", "REPO_ROOT = os.path.abspath(os.path.join(os.getcwd(), \"..\"))\n", "DATA_DIR = os.path.join(REPO_ROOT, \"Datasets_all\")\n", "\n", "# Dataset 1: Weak link scores with 14 categories\n", "weaklink_scores_df = pd.read_csv(os.path.join(DATA_DIR, \"scores_and_weaklink.csv\"))\n", "\n", "# Dataset 2: Movement features (38 features)\n", "movement_features_df = pd.read_csv(os.path.join(DATA_DIR, \"aimoscores.csv\"))\n", "\n", "print(\"Dataset 1 - Weak Link Scores:\")\n", "print(f\"Shape: {weaklink_scores_df.shape}\")\n", "print(f\"Columns: {list(weaklink_scores_df.columns)}\")\n", "\n", "print(\"\\n\\nDataset 2 - Movement Features:\")\n", "print(f\"Shape: {movement_features_df.shape}\")\n", "print(f\"Columns: {list(movement_features_df.columns)[:10]}...\")" ] }, { "cell_type": "markdown", "id": "51314a9c", "metadata": {}, "source": [ "## 3. Challenges\n", "\n", "The main challenge is the class imbalance where some classes have only 1-2 and some have 400+ samples. We used F1 score as the evaluation metric. Due to this class imbalance, we also tested grouping into 2 body regions of upper and lower body." ] }, { "cell_type": "code", "execution_count": 145, "id": "080ab472", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Weakest Link Distribution:\n", "WeakestLink\n", "LeftArmFallForward 629\n", "RightArmFallForward 472\n", "RightKneeMovesOutward 278\n", "RightShoulderElevation 250\n", "ForwardHead 117\n", "ExcessiveForwardLean 100\n", "LeftAsymmetricalWeightShift 73\n", "LeftShoulderElevation 58\n", "LeftKneeMovesOutward 49\n", "RightKneeMovesInward 45\n", "RightAsymmetricalWeightShift 19\n", "LeftKneeMovesInward 3\n", "LeftHeelRises 2\n", "RightHeelRises 1\n", "Name: count, dtype: int64\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ8AAAJOCAYAAAAZP6bBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8vZJREFUeJzs3QeYnUX5sPFJobdQpFcVhVAFpDcBCeWPlIiAlKBIkx660kFAihSlqCCggAhKkSJVBKUXUYoiKApIByGAUnO+6558z8nsydkkwB6yu3P/rmtJsudkszu87zszzzzzzIBGo9FIkiRJkiRJUgcM7MQXlSRJkiRJkgw+SZIkSZIkqaPMfJIkSZIkSVLHGHySJEmSJElSxxh8kiRJkiRJUscYfJIkSZIkSVLHGHySJEmSJElSxxh8kiRJkiRJUscYfJIkSZIkSVLHGHySJGkS+N3vfpcGDBjQ/PjnP/85yf8/8D2U3xPfYzjssMOan59//vlTb3Duued2+X77m2uvvTatttpqaYYZZmj+jEOGDEn92bbbbtv8WVdfffVUK+6xaAfuvY+qv98rkqTez+CTJEk9EDziY/LJJ8+Bgk9+8pNprbXWSocffnh66qmnOt6+TNLje2Dy3h/UPll+8MEH04YbbphuvfXWNGrUqIn+e0svvXSzzdZbb71xXt966627tOs//vGPLq/fd999XV7/zW9+0yM/T19XtgnX5kcJ6vZEMEmSpL5m8KT+BiRJ6i/efffd/EGw4Iknnkg33XRTOvLII9PBBx+cPwYOHLvm86lPfSodf/zxzT/PNNNMaVLjeyi/J77H3uzzn/98l++3P7n00kvTO++8k38/xRRTpD333DPNMsssacoppxzv31t11VXT/fffn39/2223pdGjR3e57n7/+993eT9/Jlgabrnllubv+XsrrbRSj/1Mmnjf/va302uvvZZ/v+KKK9p0kqQ+z+CTJEk9YLPNNkvLLLNMnjAy+b/uuuvS+++/nz/IdHjuuefSGWec0Xz/PPPMk/bZZ59e0fYEORqNRpp++ul7zfc0MRZZZJH80R/961//6hJkO/bYYyfq7xF8Ovnkk/PvCYI+8MADaamllsp/Jguv/Logs2rEiBFd/hyWWGKJfE3o47f99tvb7JKkfsVtd5Ik9YB11lknB27IdLr66qvztqkFFlig+fqZZ56Za/hMTM2nN998Mx1xxBE5aDDddNOlySabLM0666xpySWXzJPS+DpRh6nMVjnvvPPaft3WrXkPPfRQ2mijjdLMM8+cM2v+8pe/jLfmU6vXX3897b333jmIRjbO0KFD0w9+8IMcxJrYLYHtttbF9/C1r32ty3vbbVua0Na8//3vf+mkk07K2Tszzjhj3hY522yz5e1oF1988Tjvb/1/wpa0008/PS2++OL5Z+T/wTe+8Y30n//8J30QBCB/8pOfpDXXXDNnL/H/k3b/whe+kH784x+n9957b5w2Oeecc5qf+8Mf/jDR2ypXWWWVLm1RZjqVgaU55phjnNf5f8e/VQaySrTH7rvvnhZeeOE0zTTTpKmmmir/fz/ggAPSSy+91LY9t9tuu3wd8+9xnU099dTp05/+dP7/yz0ysd5444208sorN9uBdowML/zpT39KX//613O2Ht/XtNNOmz73uc+lo48+Ot9PrQjC7bjjjmnBBRfM7+f/71xzzZWvlZEjR+b7obx+S3zvna5/1l3Np05co2TVxdcbNGhQvlbBdUkgc4UVVsi1xgYPHpyvWwK+22yzTbrooos68rNLkvqphiRJ+sBuvvlmoizNj3POOWec99x9991d3rP22mt3+/efeOKJ5murr756l9daPzbbbLP8vkMPPXS87yu/7mqrrdb83Oc+97nGNNNM0+V9f/zjH/N7y8/xPYby35ptttkayyyzTNt/b7fdduvSBuW/O2LEiC6v0Wbl30Xr99Dug++lu78fnn322cYiiywy3q8zfPjwxrvvvtvt/5OVV1657d9bddVVJ/o6eeONN/L7x/d98O+8/vrrbX+m1o/WNmxn6NChzfdvsskmzc/vuOOO+XPTTTddl/+fzz33XH79wQcf7PJv/fKXv2z+3csvv7wx9dRTd/t9zTXXXI1HHnmky/ex9957j/dnmXzyyRs33HBDl7/Dzxevc+3gv//9b5fraNZZZ238+c9/bv6d008/vTF48OBu/x3ag+shPP/8841PfOIT4/3ezjjjjPze8t9t9zHffPNN8P9H6zUd1+/48HXbvf/DXqPd3Sv77rtv83ODBg1qXHDBBW3/X7T7WG655Sb4c0iSFNx2J0lSh7Bdiq1LZGVE5glZMGQXdIeMi8g4ouYOGQaf+cxncmYJdaTKbKS11147Z3iwnS8KR7P1jy2A46sl9cc//jFn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uunII49Mp512Wg5ISZIkSZIkqY8En+aZZ5609tprp5/97GfpzTff7LGvy7Y6spfWWmutLp+/77770rvvvtvl8wsttFCad9550x133JH/zK+LLbZYmm222ZrvGTZsWBo1alR6+OGHe+x7lCRJkiRJUoeDT0cccUTe9jZixIgc7Nlqq63Stddem0aPHv2hv+ZFF12U7r///nTMMceM89pzzz2XJp988jRkyJAun+ff5rV4Txl4itfjtXbefvvtHJwqPyRJkiRJkjSJg0/f+ta30kMPPZQzknbaaaf0u9/9Lq233nppzjnnzLWZ7r333g/09Z566qm0xx57pAsuuCBNOeWU6eNCoGuGGWZofpDRJUmSJEmSpF5ScPxzn/tcOuGEE3Lw6IYbbshb5qjFtNxyy6WhQ4emo48+Op9ANyEEsV544YW01FJLpcGDB+cPioqfeuqp+fdkMFG36dVXX+3y9zjtbvbZZ8+/59fW0+/iz/GeVgceeGCuJxUf/BySJEmSJEnqZafdDRgwIK2yyio5+2n55ZdPjUYjPfbYY+mwww5Ln/zkJ9Omm2463iLla665ZnrwwQfTAw880PxYZpllcvHx+P1kk02WbrrppubfefTRR3Nga4UVVsh/5le+BkGsQEBs+umnz4GwdqaYYor8evkhSZIkSZKkD2Zw6qCbb745b5f71a9+lWsmUfSbbCgCR2QtkQlFBtTWW2+dbrzxxrZfY7rppkuLLrpol89NM800aeaZZ25+frvttksjR45MM800Uw4S7bbbbjngRLALFEAnyMS/c9xxx+U6TwcddFAuYk6QSZIkSZIkSX0k+PSnP/0pB5x+/vOf58LjbGv7xje+kbbZZpscfCrts88+uY4Tv34UJ510Uho4cGAaPnx4LhTOSXann3568/VBgwalq666Ku288845KEXwioLoFEeXJEmSJElSHwo+UetpqqmmShtttFEOOH3xi1/MgaHuLLLIIs3tcROLIuYlAlinnXZa/ujOfPPNl6655poP9O9IkiRJkiSplwWffvKTn6Qvf/nLadppp52o93/hC1/IH5IkSZIkSep/ejz4tO222/b0l5QkSZIkSVIf1eOn3Z166qm55lJ31l133XTGGWf09D8rSZIkSZKkGoJPZ599dj5Zrju89qMf/ain/1lJkiRJkiTVEHz6+9//nhZeeOFuX19ooYXyeyRJkiRJktT/9XjwafLJJ0/PPfdct68/++yz4z39TpIkSZIkSf1Hj0eBll9++XTuueem119/fZzXXnvttXTOOefk90iSJEmSJKn/6/HT7g499NC02mqrpSWXXDLtueeeaZFFFsmff+ihh9LJJ5+cM58uvPDCnv5nJUmSJEmSVEPwabnllktXXnll2nHHHdMee+yRBgwYkD/faDTSAgsskH7961+nFVZYoaf/WUmSJEmSJNUQfMIXv/jF9Pjjj6c//vGPzeLin/rUp9JSSy3VDEZJkiRJkiSp/+tI8AkUFV966aXzhyRJkiRJkurUseDTI488kv7xj3+k//znP3nLXattttmmU/+0JEmSJEmS+mvwiW12W221Vbr77rvbBp3A1juDT5IkSZIkSf1fjwefKDT+4IMP5pPtVllllTTjjDP29D8hSZIkSZKkWoNPt912W/rWt76Vdtttt57+0pIkSZIkSepjBvb0F5xlllnSDDPM0NNfVpIkSZIkSX1Qjwefdtppp3T++een999/v6e/tCRJkiRJkmrfdveZz3wmB56WWGKJ9PWvfz3NM888adCgQeO8b5NNNunpf1qSJEmSJEn9Pfi02WabNX+/zz77dHvanZlRkiRJkiRJ/V+PB59uvvnmnv6SkiRJkiRJ6qN6PPi02mqr9fSXlCRJkiRJUh/V48Gn8Pbbb6f7778/vfDCC2mllVbKp+BJkiRJkiSpLj1+2h1OPfXUNMccc6SVV145Fxb/85//nD//0ksv5SDUT37yk078s5IkSZIkServwadzzjkn7bnnnmmdddZJZ599dmo0Gs3XCDytscYa6aKLLurpf1aSJEmSJEk1BJ9OPPHEtOGGG6YLL7wwbbDBBuO8vvTSS6eHH364p/9ZSZIkSZIk1RB8evzxx9O6667b7eszzTRTevnll3v6n5UkSZIkSVINwachQ4bk2k7deeSRR9Lss8/e0/+sJEmSJEmSagg+rbfeeulHP/pRevXVV8d5je12P/7xj9OXvvSlnv5nJUmSJEmSVEPw6aijjkrvv/9+WnTRRdNBBx2UBgwYkM4777y01VZbpWWWWSbNOuus6ZBDDunpf1aSJEmSJEk1BJ/mnHPOdN999+XT7n7xi1/k0+5+9rOfpSuvvDJtscUW6c4778yn3kmSJEmSJKn/G9yJL0p201lnnZU/XnzxxTR69Oj0iU98Ig0c2OOxLkmSJEmSJNUWfCoRdJIkSZIkSVKdejz4dMQRR0zwPdSBOvjgg3v6n5YkSZIkSVJ/Dz4ddthh4w06UQPK4JMkSZIkSVIderwIE/WdWj/ee++99Pe//z3ttdde+cS7F154oaf/WUmSJEmSJPVCH0sFcAqNL7DAAumEE05ICy64YNptt90+jn9WkiRJkiRJk9jHfvzcqquumq655pqP+5+VJEmSJElSDcGne++9N2dCSZIkSZIkqf/r8YLjP/3pT9t+/tVXX0233npruvTSS9M3vvGNnv5nJUmSJEmSVEPwadttt+32tVlmmSUdcMAB6ZBDDunpf1aSJEmSJEk1BJ+eeOKJcT43YMCANOOMM6bpppuup/85SZIkSZIk1RR8mm+++Xr6S0qSJEmSJKmPsvK3JEmSJEmS+k7wiZPsBg0a9IE+Bg8efwLWGWeckRZffPE0/fTT548VVlgh/eY3v2m+/tZbb6VddtklzTzzzGnaaadNw4cPT88//3yXr/Hkk0+m9ddfP0099dRp1llnTfvuu2967733evrHlyRJkiRJUie33VFM/PLLL08PP/xwGjZsWPrsZz+bP//Xv/41XX/99WnRRRdNG2200Qf6mnPPPXc69thj04ILLpgajUY677zz0oYbbpj++Mc/pkUWWSTttdde6eqrr06XXHJJmmGGGdKuu+6aNtlkk3Tbbbflv//+++/nwNPss8+ebr/99vTss8+mbbbZJk022WTp6KOP7ukmkCRJkiRJUqeCT3POOWd64YUX0kMPPdQMPIW//OUvaY011sjv2X777Sf6a26wwQZd/vyd73wnZ0PdeeedOTB19tlnpwsvvDB/bZxzzjlp4YUXzq8vv/zyOej1yCOPpBtvvDHNNttsackll0xHHnlk2n///dNhhx2WJp988h766SVJkiRJktTRbXfHH398zjxqDTyBgBCvHXfccR/665PFdNFFF6U333wzb7+777770rvvvpvWWmut5nsWWmihNO+886Y77rgj/5lfF1tssRx4CmRljRo1KmdotfP222/n18sPSZIkSZIkTeLg09NPP523s3WH13jPB/Xggw/mek5TTDFF2mmnndJll12Whg4dmp577rmcuTRkyJAu7yfQxGvg1zLwFK/Ha+0cc8wxeQtffMwzzzwf+HuWJEmSJEmqXY8Hn6jpdPrpp6d///vf47xG0InXyEL6oMikeuCBB9Jdd92Vdt555zRixIi8la5TDjzwwPTaa681P5566qmO/VuSJEmSJEn9VY/XfDrppJPylrbPfOYzaeONN06f/vSn8+cfe+yxXIicguHnn3/+B/66ZDfF11p66aXTPffck0455ZS02WabpXfeeSe9+uqrXbKfOO2OAuPg17vvvrvL14vT8OI9rciw4kOSJEmSJEm9KPi08sor5+ykgw8+OG+N+9///pc/P9VUU+Wg1OGHH/6hMp9ajR49OtdlIhDFVr6bbropDR8+PL/26KOPpieffDLXhAK/UqScQuizzjpr/twNN9yQpp9++rx1T5IkSZIkSX0k+BRb7wg8ESB68cUX8+c+8YlPpIEDB37oLXDrrrtuLiL++uuv55Ptfve736Xrrrsu12Pabrvt0siRI9NMM82UA0q77bZbDjhx0h3WXnvtHGTaeuutc7Fz6jwddNBBaZdddjG7SZIkSZIkqa8FnwLBpimnnDIXCv+wgSeQsbTNNtukZ599NgebFl988Rx4+uIXv9jc6sfXJ/OJbCgyrKgtFQYNGpSuuuqqXCuKoNQ000yTa0YdccQRPfJzSpIkSZIk6WMMPt177705s+jWW2/N9Ziuv/76tMYaa6SXXnopZynttddeafXVV5/or3f22WeP93UCXKeddlr+6M58882Xrrnmmg/0c0iSJEmSJKmXnXZ3++2357pPFBjfaqut8ta7MMsss+ST4374wx/29D8rSZIkSZKkGoJP3/rWt9LCCy+cHnnkkXT00UeP8/oXvvCFXJBckiRJkiRJ/V+PB5/uueee9LWvfS0X8h4wYMA4r88111y54LckSZIkSZL6vx4PPk022WRdttq1+ve//50LkEuSJEmSJKn/6/Hg0/LLL59++ctftn3tzTffTOecc05abbXVevqflSRJkiRJUg2n3R1++OE5uLT++uunLbbYIn/uT3/6U/rHP/6RTjjhhPTiiy+mgw8+uKf/WUkTYdiRV/fadrru4PUn9bcgSZIkSeoLwaflllsuXXPNNWnnnXdO22yzTf7c3nvvnX/91Kc+lV9bfPHFe/qflSRJkiRJUn8PPjUajfT666+nFVdcMT366KPpgQceSI899liuAUXgaemll25bhFySJEmSJEn9U48Gn955550000wzpaOPPjrtt99+ackll8wfkiRJkiRJqlOPFhyfYoop0uyzz55/lSRJkiRJknr8tLttt902/fSnP81ZUJIkSZIkSapbjxccX2yxxdLll1+eFllkkRyImn/++dNUU001zvs22WSTnv6nJUmSJEmS1N+DT1tssUXz9wcffHDb91B0/P333+/pf1qSJEmSJEn9Mfj0rW99K22++eZp8cUXTzfffHNPfElJkiRJkiT1Az0SfDr22GPToosumoNPq622Wnr55ZfTrLPOmm644Ya0xhpr9MQ/IUmSJEmSpD6oxwuOh0aj0akvLUmSJEmSpNqDT5IkSZIkSZLBJ0mSJEmSJPX+0+7++c9/pvvvvz///rXXXsu/PvbYY2nIkCFt37/UUkv11D8tSZIkSZKk/h58Ovjgg/NH6Zvf/GbbWlADBgxI77//fk/905IkSZIkSerPwadzzjmnJ76MJPVKw468OvVm1x28/qT+FiRJkiSps8GnESNG9MSXkSRJkiRJUj9jwXFJkiRJkiR1jMEnSZIkSZIkdYzBJ0mSJEmSJHWMwSdJkiRJkiR1jMEnSZIkSZIkdYzBJ0mSJEmSJHWMwSdJkiRJkiR1jMEnSZIkSZIkdYzBJ0mSJEmSJHWMwSdJkiRJkiR1jMEnSZIkSZIkdYzBJ0mSJEmSJHWMwSdJkiRJkiR1jMEnSZIkSZIkdYzBJ0mSJEmSJBl8kiRJkiRJUt9j5pMkSZIkSZI6xuCTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZLqDT4dc8wx6fOf/3yabrrp0qyzzpo22mij9Oijj3Z5z1tvvZV22WWXNPPMM6dpp502DR8+PD3//PNd3vPkk0+m9ddfP0099dT56+y7777pvffe+5h/GkmSJEmSpLr0+uDTLbfckgNLd955Z7rhhhvSu+++m9Zee+305ptvNt+z1157pSuvvDJdcskl+f3PPPNM2mSTTZqvv//++znw9M4776Tbb789nXfeeencc89NhxxyyCT6qSRJkiRJkuowOPVy1157bZc/EzQic+m+++5Lq666anrttdfS2WefnS688MK0xhpr5Pecc845aeGFF84Bq+WXXz5df/316ZFHHkk33nhjmm222dKSSy6ZjjzyyLT//vunww47LE0++eST6KeTJEmSJEnq33p95lMrgk2YaaaZ8q8EociGWmuttZrvWWihhdK8886b7rjjjvxnfl1sscVy4CkMGzYsjRo1Kj388MMf+88gSZIkSZJUi16f+VQaPXp02nPPPdNKK62UFl100fy55557LmcuDRkypMt7CTTxWrynDDzF6/FaO2+//Xb+CASqJEmSJEmS1I8zn6j99NBDD6WLLrroYyl0PsMMMzQ/5plnno7/m5IkSZIkSf1Nnwk+7brrrumqq65KN998c5p77rmbn5999tlzIfFXX321y/s57Y7X4j2tp9/Fn+M9rQ488MC8xS8+nnrqqQ78VJIkSZIkSf1brw8+NRqNHHi67LLL0m9/+9u0wAILdHl96aWXTpNNNlm66aabmp979NFH05NPPplWWGGF/Gd+ffDBB9MLL7zQfA8n500//fRp6NChbf/dKaaYIr9efkiSJEmSJKmf1Xxiqx0n2V1xxRVpuumma9ZoYivcVFNNlX/dbrvt0siRI3MRcoJEu+22Ww44cdId1l577Rxk2nrrrdNxxx2Xv8ZBBx2UvzZBJkmSJEmSJFUafDrjjDPyr6uvvnqXz59zzjlp2223zb8/6aST0sCBA9Pw4cNzkXBOsjv99NOb7x00aFDesrfzzjvnoNQ000yTRowYkY444oiP+aeRJEmSJEmqy+C+sO1uQqaccsp02mmn5Y/uzDfffOmaa67p4e9OkiRJkiRJfbrmkyRJkiRJkvoug0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hiDT5IkSZIkSeoYg0+SJEmSJEnqmMGd+9KSpNoNO/Lq1Ftdd/D6k/pbkCRJkqpg5pMkSZIkSZI6xuCTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZLqDj7deuutaYMNNkhzzjlnGjBgQLr88su7vN5oNNIhhxyS5phjjjTVVFOltdZaKz322GNd3vPKK6+kLbfcMk0//fRpyJAhabvttktvvPHGx/yTSJIkSZIk1aVPBJ/efPPNtMQSS6TTTjut7evHHXdcOvXUU9OZZ56Z7rrrrjTNNNOkYcOGpbfeeqv5HgJPDz/8cLrhhhvSVVddlQNaO+yww8f4U0iSJEmSJNVncOoD1l133fzRDllPJ598cjrooIPShhtumD/305/+NM0222w5Q2rzzTdPf/nLX9K1116b7rnnnrTMMsvk93z/+99P6623XjrhhBNyRpUkSZIkSZIqzXwanyeeeCI999xzeatdmGGGGdJyyy2X7rjjjvxnfmWrXQSewPsHDhyYM6Xaefvtt9OoUaO6fEiSJEmSJKkfZj6ND4EnkOlU4s/xGr/OOuusXV4fPHhwmmmmmZrvaXXMMcekww8/vGPftyRJ3Rl25NW9unGuO3j9Sf0tSJIkqQ/p85lPnXLggQem1157rfnx1FNPTepvSZIkSZIkqc/p88Gn2WefPf/6/PPPd/k8f47X+PWFF17o8vp7772XT8CL97SaYoop8sl45YckSZIkSZIqCz4tsMACOYB00003NT9HfSZqOa2wwgr5z/z66quvpvvuu6/5nt/+9rdp9OjRuTaUJEmSJEmSKq759MYbb6THH3+8S5HxBx54INdsmnfeedOee+6ZjjrqqLTgggvmYNTBBx+cT7DbaKON8vsXXnjhtM4666Ttt98+nXnmmendd99Nu+66az4Jz5PuJEmSJEmSKg8+3XvvvekLX/hC888jR47Mv44YMSKde+65ab/99ktvvvlm2mGHHXKG08orr5yuvfbaNOWUUzb/zgUXXJADTmuuuWY+5W748OHp1FNPnSQ/jyRJkiRJUi36RPBp9dVXT41Go9vXBwwYkI444oj80R2ypC688MIOfYeSJEmSJEnqlzWfJEmSJEmS1HsZfJIkSZIkSVLHGHySJEmSJElSxxh8kiRJkiRJUscYfJIkSZIkSVLHGHySJEmSJElSxxh8kiRJkiRJUscYfJIkSZIkSVLHDO7cl5YkSfp4DTvy6l7b5NcdvP6k/hYkSZImCTOfJEmSJEmS1DEGnyRJkiRJktQxBp8kSZIkSZLUMQafJEmSJEmS1DEGnyRJkiRJktQxBp8kSZIkSZLUMQafJEmSJEmS1DGDO/elJUmS1BcMO/Lq1Jtdd/D6k/pbkCRJH4GZT5IkSZIkSeoYg0+SJEmSJEnqGINPkiRJkiRJ6hhrPkmSJEn9sF6WtbIkSb2FmU+SJEmSJEnqGINPkiRJkiRJ6hi33UmSJEn6WLldUZLqYuaTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZI6xuCTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZI6xuCTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZI6xuCTJEmSJEmSOsbgkyRJkiRJkjrG4JMkSZIkSZI6ZnDnvrQkSZIkqScNO/LqXtug1x28/qT+FiT1UmY+SZIkSZIkqWMMPkmSJEmSJKljDD5JkiRJkiSpYww+SZIkSZIkqWMMPkmSJEmSJKljqgs+nXbaaWn++edPU045ZVpuueXS3XffPam/JUmSJEmSpH6rquDTL37xizRy5Mh06KGHpvvvvz8tscQSadiwYemFF16Y1N+aJEmSJElSv1RV8Ol73/te2n777dPXvva1NHTo0HTmmWemqaeeOv3kJz+Z1N+aJEmSJElSvzQ4VeKdd95J9913XzrwwAObnxs4cGBaa6210h133DFJvzdJkiRJUucMO/LqXtu81x28/qT+FqSOqyb49NJLL6X3338/zTbbbF0+z5//+te/jvP+t99+O3+E1157Lf86atSoHvue3nvrv6m36smfsxNsO9vN661v3K/eq/2v3eA1Z7t5zfWN+9V7tf+1G7zmbLeP28bfvS71VpftPyz1VrW026j//8xsNBrjfd+AxoTe0U8888wzaa655kq33357WmGFFZqf32+//dItt9yS7rrrri7vP+yww9Lhhx8+Cb5TSZIkSZKkvuOpp55Kc889d7evV5P5NMsss6RBgwal559/vsvn+fPss88+zvvZnkdx8jB69Oj0yiuvpJlnnjkNGDAg9TZEG+eZZ578P3z66aef1N9On2G72XZec32H96vt5vXWN3iv2m5ec32D96pt5zXXd4zqxfN98plef/31NOecc473fdUEnyaffPK09NJLp5tuuilttNFGzYASf951113Hef8UU0yRP0pDhgxJvR0XYm+7GPsC282285rrO7xfbTevt77Be9V285rrG7xXbTuvub5j+l46359hhhkm+J5qgk8gk2nEiBFpmWWWScsuu2w6+eST05tvvplPv5MkSZIkSVLPqyr4tNlmm6UXX3wxHXLIIem5555LSy65ZLr22mvHKUIuSZIkSZKknlFV8AlssWu3za6vY4vgoYceOs5WQdluXnO9i/eqbec11zd4r9p2XnN9h/er7eY11zd4r9bddtWcdidJkiRJkqSP38BJ8G9KkiRJkiSpEgafJEmSJEmS1DEGnyRJkiRJktQxBp/UL1nKzLaTJEl9n2M6SeofDD71AXa6H8xLL72UBgwYYLt9SLTd6NGjP+xflyRJ+shuueWW/Ktjug/H+YOk3sbgUy917rnnpoMOOij/3k534nH85JxzzpmefPJJ2+0D+uY3v5lWWmml/PuBAwcagFLHXXfddemtt96ypfWxTsbef/99W1wfm4svvjhdfvnltvgHdOyxx6Zddtkl/exnP8t/diz8wZ91tJkm3jHHHJMOOeQQg3ZSBxl86oX++9//pt///vfp2muvTd/97nfz5+x0J85WW22VVllllbTqqqumf/3rX7bbRHrvvfdyu73wwgtpo402yp8zAKVO+vvf/57WXXfdtOeee6a3337bxtbH4tlnn02DBg3Kv//JT36S/vSnP9ny6uj1dvTRR6cf/vCHeUynibfZZpulBRdcMN+n5513Xv6cY+GJc9ddd6X7778//36HHXZIJ554opfeRJhqqqnSUUcdlY4//ngDUB8yy+6JJ55Izz//vNfbRBpd4U4Tg0+90NRTT52+853v5GDAlVdemY488sj8eTvdCWOgQtbY0KFD0+qrr56efvpp220iDB48OH35y19OJ5xwQnr88cfThhtumD9vAOrDdxymu4/fpz71qfTrX/86XXDBBWmvvfZK//vf/ybmUlVxbT366KM5ePLII4/YLhNwzz335EHx3HPPnSdl++67b/r2t7+dhgwZYtt9gGvuP//5T3r55Zdts4k0xxxz5MATAfbTTz89XXXVVbbdRHjnnXfSAgsskNtuxhlnTBdeeGE6//zz82uOhbt3+OGHpzvvvDNtsskmeTy3zTbb5LZba621vO4m4hnHYtiZZ56ZDjzwwHTccceld99913b7AFl2ZHhuvvnm6Re/+EV6/fXXbbuJmD8MHDgmFPPjH/84XX311VW0mcGnXngDk4Uy++yzp2233TYtvPDC6aKLLkonnXRSft1Od8IBgD/84Q9pjTXWyJlPw4YNcwveRLbdZJNNlj/IfCLoueWWW+bPG4Aa//0aHQedLoEUtpLFvVrjisbEthtt83//93/pkksuySvbRxxxRHrzzTcn9bfWJ3Bt/epXv0orrrhi2njjjdMKK6yQJ2lqb/nll0977LFHmm666dKOO+6YF3Z+9KMf5UnafPPNZ6B4Iq+5yy67LK2//vppmWWWSfvvv3964IEHvOTGg2ccWzyXW265XEZh1KhR+T698cYbbbcJtNvkk0+ef//HP/4x36MEj9mGx3g4rkcXeLpaZ5118hiE5x3jkJtuuin/+ayzzkpLLLFEfo9t1h7tEm3zla98JW+9IwDF/eo4buL6BxYTt9hiizx3YDGb/rZsX3U/f9h///3TYYcdlhcTWeDp7ww+9dIsFCZk++23X16p/fe//51TZul4Yac7rriBaTNuYmy//fbN7WTWgJpw2+299945G4ABMpNaAlBmQE1cPQXajtR2BisjR45M2223XbNtHbh0f92xysPkgmwUthiTiWINqPFfc3Gowre+9a28sk09FH6/884753oV6oogE1sAbr/99jTLLLOkmWeeOWfZcZ2xJUoT5957783PODIoeL4RBGB7ShSE1rjoH9jiSdDu0ksvTa+++mreekd2SixSqH3fAPrTrbfeOvcPBxxwQM6GOuWUU8yAauPBBx/Mmf5XXHFF/jMBTnYAUAOVfvbuu+9uXpOOSdrfq1x3LOoQLKYsAP3F7rvv7ha8iUAfy/ZixnG02UwzzZRefPHFnAFF4Nh5a/trDt/73vfyAiz3KWM5Mj37vYZ6nfvuu68xzTTTNH784x83/v3vfzeeeuqpxle/+tXG5z//+caxxx7bfN/o0aMn6ffZ2/zlL39pzD333I1f//rXzc/96U9/aqy88sqN+eefv/Hkk0/mz9lu47rlllsas8wyS/4Vb731VuO8887L7bbRRhs13/f+++9/DP8n+5a///3vjbXWWqvx5z//OV9jP/zhDxuLLLJI4ytf+UrzPbbbuK655prGlFNO2Tj55JMbP/nJTxqHHXZYY/LJJ29885vfbPzvf//7WP8f9iXXXntt47jjjmvssccejXfffbf5+TPOOKMxcODAxjHHHDNJv7/e5le/+lXjs5/9bO5XjzrqqMbOO+/cuP322xu77LJLY4oppmjceOON+X1lW2rcZ9zxxx/fOPLII5ufu+uuuxpLLbVUY+ONN2787ne/s8m6QZ862WST5X6B6+7qq6/O/cO6667buO6662y3Qjk2e/zxx/P44/LLL29+7oknnmisvfbajSWXXLJx0UUXtf17tfrPf/6Tx7/bbrtt41vf+lZj6qmnbrzwwguN+++/v/GpT30qj0fuvvvuSf1t9moPPvhgY7rppsv36htvvJHnXsy56Fe/+93vOo4bj9dffz33B6eeemrjv//9b74GV1pppcbss8/eGDRoUOOKK674+P5H9iFvv/12Y+utt87XVzz3Lr744saqq67a2Gmnnfpt32rwqRdo7Ti58OgsXn311ebneAjSecw555x5sqauE3oedv/4xz9yh0vAqXwPA74ZZpih8bnPfS4PXjRuMOQ3v/lN4xOf+ETj5Zdf7tKZnHLKKY0BAwY0ttlmG5utDYImq6++emPzzTfPnQjefPPNxk9/+tPG0KFDG5tttlm393ntvv71r3dpH1x66aU5ALXnnnvmwZ/GvW8Z1HFPLrHEEuMETAhAEdA7+OCDbbr/j6Dwl770pcZCCy2U242+FM8//3xj++23zwGocoD3ne98p/Hwww/bfv//mcUEdq655soLYgQ8S3fccUfuVzfddNPGDTfcYJu1cfjhhzdWXHHFLp+77bbbckCUhbEIftauHJO89tprjeeee67xyU9+shlkeu+99/KvTz/9dF4oW2655fLzrnaMNwJjXQKdjIP/+c9/dvk8cwoWsfk9Vltttcbpp5/eqF05LqMf+PSnP50X/UtHH3107jtoLxcp2mO+wJiOcQnX34Ybbtj4wQ9+kPuPDTbYIAdY1H4e8MUvfjEH1H/5y1821lhjjcaaa67Z+NrXvtZYcMEF8xi5P84dDD71AnFhsULGaiKBADoKovBlp/zYY481hgwZ0phnnnnyynfNyptx3333bXzjG9/IAShu4JEjR3Z5fdSoUY3ll18+r17wQNRYRxxxRO5Q//rXv+aB3i9+8YtxVryZeNDx0q4ai+ycQw89NN+rTMBKEYBabLHFclaUumIiwcp/mR0Wk4v9998/X29mQLV/3hEgZjWWNjrnnHPGubROOumkxswzz9x46aWXqr3sCF6Wq/wMfgkyMeEiYBJefPHFHIBiZZagE69zz8a1WLPy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yRqvtRvQ1TyZ1YfHJJ/aOmQABALqZPOQCUXGydChQ/OJdqye1a58vjORpe1Iaee5VtYtIgA1zzzz5K3Z7bYV1462IqMpFiGiNhHYhsI4pfbJa3fbd6JeIvcngZQYs5E1wfXIQkXtR4x3h+AJbUR2Hdko1KEsX6PeU3myca3K8QQZ1ywYkmkd/URcjwSgKDfB9tiyZozGIsDONkVKJLAoUZ5qR/Yn9cfK55/UyQAU81i2/zsuqcfA1GEDBw5Mf/vb39IhhxyS/3zJJZekxRdfPD3++OP5z3PNNVcaMmRIWm211dIf/vCHdOONN6ZFF100v0ZwbN11102f+cxnUo3uv//+tOWWW6aTTjopjRw5Mu24445psskmSwMGDMivL7XUUun3v/99WmihhdJvf/vbNMssszTbjTblffw+3l+rG264If3yl79M11xzTTriiCPSiBEj0r/+9a+0yiqr5Paccsop05577pkOOuigdN111+U20xjRFrTRCy+8kN56661m06ywwgpp7bXXTr/4xS/SqFGjxmmyQYMG2Yz6wF555ZX8zOK5x/2I5ZdfPn3ve99LF110UVpjjTXSyy+/nJ544onqn22jR4/u0gbPPvts/njkkUfS22+/nSaffPL07rvv5tc23XTT3IY//OEP8zNRXZ9ztNVMM82Urrrqqvy5KaaYIrchlllmmfTOO+80xzRK+bq75ZZb0rbbbpv233//dN9996WLL744j+HuuOOO3ERbb711+vrXv54effTRdNxxxzWvxVrv1XbmmWee9L///S/tsssu6YADDkg77bRT/jyfO/PMM9M000yTZp999o/5u+1daIsYT/B8W3HFFdO3v/3t9Prrr6fHHnssf/7/L6an2WabLW2//fZpvfXWy32J47mxoi2mm266dN5556Vll102bbjhhrlP4H7m/mSs/PDDD0+S/8+qz4ILLpiOP/74tOqqqzbn/qpAJyNbpHFy4hpbnFilILo5aNCg5kkesZWO7CdqPLFaobGoccJq/+yzz96YfvrpmxlhZRYZWxPLo8fNchoX9WKoP4GLLroory6efvrp+c9sIYvT7Lgea84Wa90SW2IbAMUBf/Ob33RpG1bJyBbwtCd9lOsuVsBidZvtO2Q4kcFDweJWZHbWfEoW2AIb2xMPPPDAnL0Jnm1kdm6xxRbNOlnltnW2ateelRg/P9vU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Sk899VT+80EHHZSWWGKJ9PWvfz0deuih6emnn05XXXVVGjRoUDrppJPS888/n6+7AQMG5K/BrzV66KGH0sorr5w23HDD5uduueWW9Ic//CFfb//3f/+XNt5447TDDjvkdt15553ztbfbbrtN0u9bfd97772X78t55pknvfvuu+moo45KN910U/rzn/+cpphiinTxxRenRRZZJG266abpxBNPTAsssMCk/pZ7FZ5lM888c/r1r3+dttlmm3T88cen7bffPj/PrrzyyvSvf/0r7brrrmnaaadt/p3Bg3usi+8TeK7zM//zn/9Mc8wxR/NztNkVV1yRrzFepx2vvfba9OUvfzmPSc4777w066yzptpF3/j3v/89/562mn/++dMhhxySfve73+VxHuMT7uX3338/HX744en6669Pv/3tb/M9XCPaa9lll839JmNg2uGJJ55oXn9vvvlmbkfGfXzw+xlmmCE9/vjjac4555zU336vw1yB/oGxMeNinnM77rhjfu1Pf/pT/jx9w0ILLdTl2Vgb2uKCCy7Iz6/zzz8/vfPOO83XYowcFl100dxXTDnllGnppZeeBN+tJI01gAhU6gGXXXZZDo5ceuml6bHHHsvBk3XWWSf98Ic/zK+//fbbuVN+7rnn0mSTTZYHf7UHnhjI/fjHP04/+tGP8mRrr732yp+/55570sEHH5z+9re/5clZ6ySs/Bo1KX9ugk2nnnpqWmmlldKdd96ZPv3pT6ef//zn+Vc+f8011+QB8XLLLZevtUsuuSRfdwyYaxyohJEjR+ZJGJMLMJGg/V566aUcZHrggQfSV77ylRyw+89//pNuvfXWtMEGG1TdZuo52223Xe4ruI8Jgq6xxhpp9913TyussEIOPBFQrl13z/fTTjst9wv0pfQXTHTB4gX3LJMKJms14/nOJIwgHGONr371q+mvf/1r+ulPf5rWXHPNfL2xyLP55punGWecMd1www35773++utpuummm9Tffq/wy1/+MvcTBJg++clP5jb85je/mf7yl7+k4cOHp1GjRuWgCe3HBPg3v/lN+tznPpdqRTtFkJegMEFNAnb33ntvXjykvYYMGZLva36PddddN5177rn597WOScrnXNkGLFxzvV199dV50YtgE9566638nCOActFFF1U5Bi7xzOJao//8whe+kNuP6RyBJnDN8SzkffzK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9esnLVu2lKNHj2oWZ4cOHeTQoUMycOBAnc1z48aNEhISIrGxsZoBheMbsqOIiIh8ATOfiIjors6AQq8UBJ5wwhYdHa0BKSIiX4YJEdDPDkFylA3Xr19fs50aNmwoWbJkkeXLl0uBAgVk6dKlsmTJEs3qLFmypJYao/wYAfbKlStrYOrpp59O6T+HiIiIwSciIro7A1DIGkAD3nfeeUebi2/btk0DTyy1IyJf9v7772vQCKV0v/76qwbTkdnZvHlzPZY1aNBA/Pz8dMY7BKDgwIEDmumEjCgc+1CKh6DUunXr5L777kvpP4mIiIhld0REdPeW4KG/EwNPRJSaAk/du3eXadOmSUREhMyePVvOnDkjy5Yt0ywoBJJwP8rwzPENMPMdmpBj1s/OnTvr7y1atIiBJyIi8hns+URERHdlAGr8+PHSo0cP2b59OzOeiMjnrV27Vl588UUJCwuTVq1a6X1169bVLCc0Ej937pxcuHBBA0rffPONTqiA0mLMiGc/9qEhOUrvKlWqlIJ/DRERkTv2fCIiorseS+2IKDWUDGMGu1y5cmnPuipVqkiLFi1k5cqVEhwcrI3Ec+bMKQ8//LArOIUg+4wZMyRt2rSu2fGQIYWeT0RERL6EwSciIiIiIh/qWYdgUlxcnJw/f14+/PBDCQwM1Gwm9IAaPXq0nD59Wp555hntaQdXr17V3yEiIvJVDD4REREREflQAKpbt26yadMmmTlzps7WaYeg1NatW3UWPAaciIgotWDwiYiIiIjIh+zfv18bj6N8DjPfIdCUUAkxM56IiCi1YPCJiIiIiMhHS/Bg0KBB2lyciIgotWI3QiIiIiIiH4OZ6yZPnqyldT179tSZO4mIiFIrBp+IiIiIiHw0ADV27FipXbu2BAUFpfTLISIiumUsuyMiIiIiSgX+/fdf7QNFRESU2jD4REREREREREREXsNLJ0RERERERERE5DUMPhERERERERERkdcw+ERERERERERERF7D4BMREREREREREXkNg09EREREREREROQ1DD4REREREREREZHXMPhEREREjvbCCy9I1qxZvfb8a9eulTRp0ujXW/3dRYsWeeW1ERERESUHBp+IiIgo2SxYsECDKUuXLo33WIUKFfSxyMjIeI/df//9UqNGDfE1Q4cO1dccExMjvurMmTPyxhtv6PpFkC1z5swSFBQk/fv3l2PHjiX5+b744gv9u4mIiIgSi8EnIiIiSja1atXSr1FRUfECJDt37pR06dLJhg0b3B47fPiw3szvpja1a9eWCxcu6NfkduDAAalYsaIMHz5cypYtK6NHj5bJkydL3bp15YMPPpBHH330loJPCGYRERERJVa6RC9JREREdJsKFiwoxYoVixd82rhxo1iWJU8//XS8x8zPqTX4dM8990imTJmS/f+9cuWKtGjRQk6cOKHle57rb8SIERqMultdvHhRMmTIoOufiIiIUhY/jYmIiChZIQiyZcsWzQYykO1Urlw5adSokXz//ffy77//uj2G0raaNWu67vv444+lcuXKWkJ27733Stu2bTU7ym79+vUazELJXsaMGaVw4cLSq1cvt//3erZu3Sp58+bVzKBz587d8Z5PeF6Uvu3evVuzkLJkySKFChWSMWPG3PT5Ll26JI0bN5YcOXLId999d93lFi9eLNu2bZOwsLAEA3fZs2fXAFRS1hf6Y02dOlW/x99kbgbet4kTJ+p7iYBb/vz55aWXXpLY2Fi3/xvLoXQPwUj87VgHWBdFixbV/8MzewuvC+8zlq1evbp8/vnnCa7j+fPny6BBg3RdYlm8j7h/woQJ8f5+rDs8Fh4efpM1TkRERLeLmU9ERESUrBAI+eijj+SHH35wlX0hwISeTrjFxcVpCd4DDzzgeiwwMFBy586tPyNgMnjwYGndurV07txZTp06Je+8846WtSGolTNnTl1u4cKFcv78eenatav+7o8//qjLHTlyRB+7nk2bNsnjjz8uVapUkWXLlmmAyxsQkGnYsKFmJ+FvQVNx9GEqX768BuESgkBQs2bN5KeffpKvv/5aqlatet3nX758uX597rnnEvV6ErO+EEhCn6iIiAh9Dz3h8dmzZ0uHDh0kNDRUDh48KFOmTNH3Be9j+vTpdbnXXntNA21NmjTRdY0gGb4iW8kOWVvYJvC68Hx4XXPmzJGmTZvq+nrqqafclkd5IbKd+vTpo0E6bDcIWs6bN08DaXa4L1u2bLo+iYiIyMssIiIiomS0a9cuC0OQ4cOH68///POP5efnZ82ZM0d/zp8/vzV16lT9/syZM1batGmtLl266M+//fab/jxixAi359yxY4eVLl06t/vPnz8f7/8eOXKklSZNGuvQoUOu+55//nn9/yEqKsrKnj279eSTT1oXL1686d8yZMgQ/VtOnTp13WUiIyN1GXw16tSpo/fNnTvXdd+lS5csf39/q2XLlvF+d+HChdbZs2f19/LkyWNt2bLlpq+tUqVKVo4cOazESuz66t69u74mT+vXr9f7582b53b/qlWr3O7/448/9L1q3ry523JDhw7V5fB+GD179tT78NwG1kOxYsWsokWLWlevXnVbT8WLF4/3d7z77rv6WHR0tOu+y5cv63q0/19ERETkPSy7IyIiomRVpkwZzWAxvZyQ9fL333+7ZrPDV9N0HL2grl696iobW7JkiZZsIVMIM8yZm7+/v5QqVcptpjx7xhKeH8vhudFbCpk4nvC7yL557LHH9P9B6Zk3Yea5Z5991vUzMnaqVaumZWaekA0WHBwsv/zyi5aYoYn4zaCJOzJ7Eiup68sTsqNQCtigQQO39wblkfhbzXuzZs0a7UfVrVs3t98PCQlJsLk51om9bBDP9eKLL8pvv/2mpXp2zz//fLxMNWwrKAFEppOxevVqfW329U9ERETew+ATERERJSv02UFQw/R2QqApX758UrJkyXjBJ/PVBB/27t2rwRAEmtCTyX6Ljo6WkydPuv6f33//XfsHoVcQAhZYpk6dOq5gjh3KvZ588kmpVKmSLFiwQANB3nbfffe59UuCXLlyxeuPBD179tRyQJTaoZ9SYqCn09mzZxP9epKyvhKC9wbL4b30fG/QN8u8N4cOHdKv5v028P/i77fDsgEBAQkGMO3PZaCZvSeUYaK875NPPnHdh0AU+kLVq1fvpn8XERER3T72fCIiIqJkh2DSihUrZMeOHa5+Twa+79u3rxw9elSzo9CUunjx4voYglUI2Hz55ZeSNm3aeM+LoAkgWwoZOH/99Zf2UULvHz8/P31OBFjsDc0BWU5PPPGE9nhatWqVNvT2toRePyC45gl9idBMe9SoUTJ37txEzeCGvxkZS2jEjubhN5LU9ZUQLIPAkz3DyA5BKG+7Xn+u9u3ba2YWmoyjpxb6YSHzijPhERERJQ8Gn4iIiCjZmUwmBJcQfEJmj4EyLQSDUF6GpuQIChklSpTQ4AwyXEqXLn3d50dQ69dff9Xm1Ag8GGiUnRAEtBA0QZAHM6shuGWaofuC5s2ba9kdAkEopZs+ffpNfwfZPpjJDTMDosH3jSRlfXlma9nfG2RmocH3jZq0FylSRL/u27fPLVPpzz//jJf1hWX37NkT7zlQfmh/rptBY3cEv/AeP/TQQ9rAPLGN2ImIiOj2seyOiIiIkh1mkjN9eJBdY898QuDpwQcflKlTp2rvIXu/H8wMh4yhN954I16GEH5GAMOeVWRfBt9PmjTpuq8JpXbo9YQZ5BC4wWxvvgRBocmTJ8uMGTM0O+lmWrVqpVk+mB0QvbM8oSQvLCwsyesLGVFw+vTpeL2VkEGFGec8oceTWR49tdKlSxcvgIZZ8Twh8Ij3wf76sU3MnDlTihYtKmXLlpXEwP/Xrl07LanEbHxYL2Y2RSIiIvI+Zj4RERFRskOgB0Ge9evXa7AJ2U52CEaNHz9ev7cHn5Bd8+abb2omDxpOIyMImUAHDx6UpUuXaiPqPn36aNkYlsX3CG6h/9HixYsT7Kdkh4ydlStXai+gRo0aybp16yQoKOimf8/bb78tWbJkcbsPJV0DBw6UO6lHjx7aSBxBIzT3vtHzp0+fXoNp9evXl9q1a2twCFlJuH/Xrl3aAwk9lhCcSsr6Mu9VaGioNmhH4Kpt27baH+qll16SkSNHytatWzVTC/8XekGh5A2BLATE8ufPL6+88oq+v02bNtWsJDSdR7ZZnjx53DKrBgwYoNlbeC/w/6EvFLKz8H7j9SWlbM4E79D4fPTo0Ule90RERHQbvDiTHhEREdF1vfbaa0izsWrUqBHvsSVLluhj2bJls65cuRLv8cWLF1u1atWy/Pz89BYYGGh1797d2rNnj2uZ3bt3W/Xr17eyZs1q5cmTx+rSpYu1bds2fd4PP/zQtdzzzz+vz2EXExNjlS1b1vL397f27t173b9hyJAh+nwJ3dKmTavLREZG6s/4atSpU8cqV65cvOfDaylSpIjrZ/O7CxcudFuuX79+ev+UKVOsm4mNjbVef/11q3z58laWLFmsTJkyWUFBQbr+jx8/nuT1hfcjJCTEyps3r5UmTRp93G7mzJlW5cqVrcyZM+v7h/8Xr/fYsWNuzzF48GBdv1iuXr16VnR0tJU7d27r5Zdfdnu+/fv3W61atbJy5sypr71atWrWypUr3Za53nryhHV+zz33WEeOHLnpeiMiIqI7Jw3+uZ3gFRERERHR7UJZHjKxkNlmygHvNMxmiOypNWvWeOX5iYiIKGHs+UREREREyerChQvx7ps4caJ+9Vaj959++knLAe0N1YmIiCh5MPOJiIiIiJIVmn7jhobiWbNm1VkP0dsJfaJWr159R/+vnTt3yubNm7XHVExMjBw4cECb3RMREVHyYcNxIiIiIkpWmGkOM9CNGTNGG6ibJuQoubvTFi1aJMOGDZOAgAANcDHwRERElPyY+URERERERERERF7Dnk9EREREREREROQ1DD4REREREREREZHXMPhERERERERERERew+ATERERERERERF5DYNPRERERERERETkNQw+ERERERERERGR1zD4REREREREREREXsPgExEREREREREReQ2DT0REREREREREJN7yf9PmkXM1MbNYAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 14 weak link categories\n", "weaklink_categories = [\n", " \"ForwardHead\",\n", " \"LeftArmFallForward\", \"RightArmFallForward\",\n", " \"LeftShoulderElevation\", \"RightShoulderElevation\",\n", " \"ExcessiveForwardLean\",\n", " \"LeftAsymmetricalWeightShift\", \"RightAsymmetricalWeightShift\",\n", " \"LeftKneeMovesInward\", \"RightKneeMovesInward\",\n", " \"LeftKneeMovesOutward\", \"RightKneeMovesOutward\",\n", " \"LeftHeelRises\", \"RightHeelRises\",\n", "]\n", "\n", "# For each row find the column name with the max score\n", "# the target var\n", "weaklink_scores_df['WeakestLink'] = weaklink_scores_df[weaklink_categories].idxmax(axis=1)\n", "\n", "print(f\"\\nWeakest Link Distribution:\")\n", "print(weaklink_scores_df['WeakestLink'].value_counts())\n", "\n", "# Visualize the distribution\n", "plt.figure(figsize=(12, 6))\n", "weaklink_scores_df['WeakestLink'].value_counts().plot(kind='bar', color='steelblue')\n", "plt.title('Distribution of Weakest Links', fontsize=14, fontweight='bold')\n", "plt.xlabel('Weak Link Category', fontsize=12)\n", "plt.ylabel('Frequency', fontsize=12)\n", "plt.xticks(rotation=45, ha='right')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 146, "id": "438e27ae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Datasets merged successfully!\n", "Merged dataset shape: (2094, 44)\n", "\n", "Columns in merged dataset:\n", "['AimoScore', 'No_1_Angle_Deviation', 'No_2_Angle_Deviation', 'No_3_Angle_Deviation', 'No_4_Angle_Deviation', 'No_5_Angle_Deviation', 'No_6_Angle_Deviation', 'No_7_Angle_Deviation', 'No_8_Angle_Deviation', 'No_9_Angle_Deviation', 'No_10_Angle_Deviation', 'No_11_Angle_Deviation', 'No_12_Angle_Deviation', 'No_13_Angle_Deviation', 'No_1_NASM_Deviation', 'No_2_NASM_Deviation', 'No_3_NASM_Deviation', 'No_4_NASM_Deviation', 'No_5_NASM_Deviation', 'No_6_NASM_Deviation', 'No_7_NASM_Deviation', 'No_8_NASM_Deviation', 'No_9_NASM_Deviation', 'No_10_NASM_Deviation', 'No_11_NASM_Deviation', 'No_12_NASM_Deviation', 'No_13_NASM_Deviation', 'No_14_NASM_Deviation', 'No_15_NASM_Deviation', 'No_16_NASM_Deviation', 'No_17_NASM_Deviation', 'No_18_NASM_Deviation', 'No_19_NASM_Deviation', 'No_20_NASM_Deviation', 'No_21_NASM_Deviation', 'No_22_NASM_Deviation', 'No_23_NASM_Deviation', 'No_24_NASM_Deviation', 'No_25_NASM_Deviation', 'No_1_Time_Deviation', 'No_2_Time_Deviation', 'EstimatedScore', 'ID', 'WeakestLink']\n", "\n", "First few rows:\n", " AimoScore No_1_Angle_Deviation No_2_Angle_Deviation \\\n", "0 0.323667 0.538020 0.815878 \n", "1 0.323699 0.443807 0.306552 \n", "2 0.848327 0.603539 0.373984 \n", "3 0.351332 0.484935 0.623625 \n", "4 0.627181 0.860832 0.657580 \n", "\n", " No_3_Angle_Deviation No_4_Angle_Deviation No_5_Angle_Deviation \\\n", "0 0.346724 0.382114 0.302248 \n", "1 0.823529 0.188905 0.497370 \n", "2 0.346724 0.590626 0.341942 \n", "3 0.380201 0.975132 0.509326 \n", "4 0.745576 0.552846 0.375897 \n", "\n", " No_6_Angle_Deviation No_7_Angle_Deviation No_8_Angle_Deviation \\\n", "0 0.947872 0.275945 0.521760 \n", "1 0.140124 0.664275 0.521760 \n", "2 0.298900 0.276901 0.623625 \n", "3 0.888570 0.363462 0.847441 \n", "4 0.483022 0.388331 0.521760 \n", "\n", " No_9_Angle_Deviation ... No_21_NASM_Deviation No_22_NASM_Deviation \\\n", "0 0.457198 ... 0.642276 0.552846 \n", "1 0.729316 ... 0.826399 0.805356 \n", "2 0.658058 ... 0.642276 0.690579 \n", "3 0.237207 ... 0.642276 0.552846 \n", "4 0.387853 ... 0.642276 0.552846 \n", "\n", " No_23_NASM_Deviation No_24_NASM_Deviation No_25_NASM_Deviation \\\n", "0 0.648972 0.578192 0.560019 \n", "1 0.848876 0.889048 0.816834 \n", "2 0.648972 0.578192 0.555715 \n", "3 0.648972 0.578192 0.744620 \n", "4 0.648972 0.578192 0.308943 \n", "\n", " No_1_Time_Deviation No_2_Time_Deviation EstimatedScore \\\n", "0 0.821616 0.818747 0.209947 \n", "1 0.307987 0.248207 0.457198 \n", "2 0.218556 0.235294 0.107126 \n", "3 0.458154 0.432807 0.612626 \n", "4 0.805356 0.774271 0.153515 \n", "\n", " ID WeakestLink \n", "0 0003cdcc-86ed-494a-a3b5-90d09e96e06b.Kinect RightShoulderElevation \n", "1 003115c4-bdb8-491c-b571-8fcebdecf8ed.Kinect RightArmFallForward \n", "2 00316bfb-ed43-489f-a55b-11c7f01c852d.Kinect LeftArmFallForward \n", "3 00607608-6f2f-459b-a69d-e14067489459.Kinect RightShoulderElevation \n", "4 007396ec-3463-4a05-915c-02244ff8d3de.Kinect ForwardHead \n", "\n", "[5 rows x 44 columns]\n", "\n", "Missing values: 0\n" ] } ], "source": [ "# Keep only ID and weakest link from the first dataset\n", "target_df = weaklink_scores_df[['ID', 'WeakestLink']].copy()\n", "\n", "# Join with movement features dataset\n", "merged_df = movement_features_df.merge(target_df, on='ID', how='inner')\n", "\n", "print(f\"Datasets merged successfully!\")\n", "print(f\"Merged dataset shape: {merged_df.shape}\")\n", "print(f\"\\nColumns in merged dataset:\")\n", "print(list(merged_df.columns))\n", "print(f\"\\nFirst few rows:\")\n", "print(merged_df.head())\n", "\n", "# Check for missing values\n", "print(f\"\\nMissing values: {merged_df.isnull().sum().sum()}\")" ] }, { "cell_type": "markdown", "id": "42e9c269", "metadata": {}, "source": [ "## 4. Feature prep and train/test split" ] }, { "cell_type": "code", "execution_count": 147, "id": "7560ae66", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Features (X) shape: (2094, 41)\n", "Target (y) shape: (2094,)\n", "\n", "Number of features: 41\n", "Feature names: ['AimoScore', 'No_1_Angle_Deviation', 'No_2_Angle_Deviation', 'No_3_Angle_Deviation', 'No_4_Angle_Deviation', 'No_5_Angle_Deviation', 'No_6_Angle_Deviation', 'No_7_Angle_Deviation', 'No_8_Angle_Deviation', 'No_9_Angle_Deviation']...\n", "\n", "Number of classes: 14\n", "Classes: ['ExcessiveForwardLean', 'ForwardHead', 'LeftArmFallForward', 'LeftAsymmetricalWeightShift', 'LeftHeelRises', 'LeftKneeMovesInward', 'LeftKneeMovesOutward', 'LeftShoulderElevation', 'RightArmFallForward', 'RightAsymmetricalWeightShift', 'RightHeelRises', 'RightKneeMovesInward', 'RightKneeMovesOutward', 'RightShoulderElevation']\n" ] } ], "source": [ "# Drop columns not needed\n", "exclude_from_X = ['ID', 'WeakestLink', 'EstimatedScore']\n", "feature_columns = [col for col in merged_df.columns if col not in exclude_from_X]\n", "\n", "X = merged_df[feature_columns].copy()\n", "y = merged_df['WeakestLink'].copy()\n", "\n", "print(f\"Features (X) shape: {X.shape}\")\n", "print(f\"Target (y) shape: {y.shape}\")\n", "print(f\"\\nNumber of features: {len(feature_columns)}\")\n", "print(f\"Feature names: {feature_columns[:10]}...\") # Show first 10\n", "print(f\"\\nNumber of classes: {y.nunique()}\")\n", "print(f\"Classes: {sorted(y.unique())}\")" ] }, { "cell_type": "code", "execution_count": 148, "id": "9f17a88e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training set size: 1675 samples\n", "Testing set size: 419 samples\n", "\n", "Training set class distribution:\n", "WeakestLink\n", "LeftArmFallForward 500\n", "RightArmFallForward 373\n", "RightKneeMovesOutward 228\n", "RightShoulderElevation 203\n", "ForwardHead 91\n", "ExcessiveForwardLean 79\n", "LeftAsymmetricalWeightShift 57\n", "LeftShoulderElevation 47\n", "LeftKneeMovesOutward 40\n", "RightKneeMovesInward 34\n", "RightAsymmetricalWeightShift 17\n", "LeftKneeMovesInward 3\n", "LeftHeelRises 2\n", "RightHeelRises 1\n", "Name: count, dtype: int64\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(\n", " X, y, \n", " test_size=0.2, \n", " random_state=42\n", ")\n", "\n", "print(f\"Training set size: {X_train.shape[0]} samples\")\n", "print(f\"Testing set size: {X_test.shape[0]} samples\")\n", "print(f\"\\nTraining set class distribution:\")\n", "print(y_train.value_counts())" ] }, { "cell_type": "code", "execution_count": 149, "id": "d4c02996", "metadata": {}, "outputs": [], "source": [ "# Standardize features (mean=0, std=1)\n", "scaler = StandardScaler()\n", "X_train_scaled = scaler.fit_transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)" ] }, { "cell_type": "markdown", "id": "e11a3882", "metadata": {}, "source": [ "## 5. Model training step 1: 14 class classification: baseline\n", "\n", "We tested multiple classifications types. Parametric models like logistic regression, naive bayes, LDA, QDA. Non-parametric models like KNN k=5, 7, and 10." ] }, { "cell_type": "code", "execution_count": 150, "id": "c8292b2b", "metadata": {}, "outputs": [], "source": [ "# Training and evaluation helper function\n", "def train_and_evaluate_variants(X_train, X_test, y_train, y_test, models_dict):\n", " results = []\n", " trained_models = {} \n", " for name, model in models_dict.items():\n", " try:\n", " model.fit(X_train, y_train)\n", " y_pred = model.predict(X_test)\n", " \n", " accuracy = accuracy_score(y_test, y_pred)\n", " error_rate = 1 - accuracy \n", " precision = precision_score(y_test, y_pred, average='weighted', zero_division=0)\n", " recall = recall_score(y_test, y_pred, average='weighted', zero_division=0)\n", " f1 = f1_score(y_test, y_pred, average='weighted', zero_division=0)\n", " \n", " results.append({\n", " 'Model': name,\n", " 'Accuracy': accuracy,\n", " 'Error Rate': error_rate,\n", " 'Precision': precision,\n", " 'Recall': recall,\n", " 'F1-Score': f1\n", " })\n", " trained_models[name] = model\n", " except Exception as e:\n", " print(f\"Failed to train {name}: {e}\")\n", "\n", " results_df = pd.DataFrame(results).sort_values('F1-Score', ascending=False)\n", " return results_df, trained_models" ] }, { "cell_type": "code", "execution_count": 151, "id": "b598aef7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Models defined:\n", "Parametric: ['Logistic Regression', 'Naive Bayes', 'LDA', 'QDA']\n", "Non-Parametric: ['KNN (k=5)', 'KNN (k=7)', 'KNN (k=10)']\n" ] } ], "source": [ "# Define model variants for 14 class classification\n", "models_14class = {\n", " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n", " 'Naive Bayes': GaussianNB(),\n", " 'LDA': LinearDiscriminantAnalysis(),\n", " 'QDA': QuadraticDiscriminantAnalysis(),\n", " 'KNN (k=5)': KNeighborsClassifier(n_neighbors=5),\n", " 'KNN (k=7)': KNeighborsClassifier(n_neighbors=7),\n", " 'KNN (k=10)': KNeighborsClassifier(n_neighbors=10)\n", "}\n", "\n", "print(\"Models defined:\")\n", "print(\"Parametric:\", ['Logistic Regression', 'Naive Bayes', 'LDA', 'QDA'])\n", "print(\"Non-Parametric:\", ['KNN (k=5)', 'KNN (k=7)', 'KNN (k=10)'])" ] }, { "cell_type": "code", "execution_count": 152, "id": "962743cc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Failed to train QDA: y has only 1 sample in class RightHeelRises, covariance is ill defined.\n", "\n", "=== Classification Performance (Baseline - 14 classes) ===\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelAccuracyError RatePrecisionRecallF1-Score
2LDA0.5656320.4343680.5782200.5656320.566721
0Logistic Regression0.5465390.4534610.6148490.5465390.562310
4KNN (k=7)0.5536990.4463010.5482310.5536990.545808
5KNN (k=10)0.5560860.4439140.5517040.5560860.540911
3KNN (k=5)0.5393790.4606210.5327380.5393790.530905
1Naive Bayes0.4343680.5656320.5116230.4343680.449053
\n", "
" ], "text/plain": [ " Model Accuracy Error Rate Precision Recall F1-Score\n", "2 LDA 0.565632 0.434368 0.578220 0.565632 0.566721\n", "0 Logistic Regression 0.546539 0.453461 0.614849 0.546539 0.562310\n", "4 KNN (k=7) 0.553699 0.446301 0.548231 0.553699 0.545808\n", "5 KNN (k=10) 0.556086 0.443914 0.551704 0.556086 0.540911\n", "3 KNN (k=5) 0.539379 0.460621 0.532738 0.539379 0.530905\n", "1 Naive Bayes 0.434368 0.565632 0.511623 0.434368 0.449053" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Train and evaluate all 14 class models\n", "results_14class_baseline, trained_14class = train_and_evaluate_variants(\n", " X_train_scaled, X_test_scaled, y_train, y_test, models_14class\n", ")\n", "\n", "print(\"\\n=== Classification Performance (Baseline - 14 classes) ===\\n\")\n", "display(results_14class_baseline)" ] }, { "cell_type": "code", "execution_count": 153, "id": "5c9efd5b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "BASELINE CHAMPION (14-class): LDA\n", "F1-Score: 0.5667\n" ] } ], "source": [ "# Identify baseline champion for 14 class\n", "champion_14class_baseline = results_14class_baseline.iloc[0]['Model']\n", "champion_14class_f1_baseline = results_14class_baseline.iloc[0]['F1-Score']\n", "\n", "print(f\"\\nBASELINE CHAMPION (14-class): {champion_14class_baseline}\")\n", "print(f\"F1-Score: {champion_14class_f1_baseline:.4f}\")" ] }, { "cell_type": "markdown", "id": "1c1c7477", "metadata": {}, "source": [ "## 6. Model training step 2: hyperparameter tuning" ] }, { "cell_type": "code", "execution_count": 154, "id": "ce01a75f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Tuning Logistic Regression...\n", " Best params: {'C': 100, 'class_weight': None, 'solver': 'saga'}\n", " CV F1-Score: 0.5976, Test F1-Score: 0.6101\n", "\n", "Tuning LDA...\n", " Best params: {'solver': 'svd'}\n", " CV F1-Score: 0.5785, Test F1-Score: 0.5667\n", "\n", "Tuning KNN (k=5)...\n", " Best params: {'metric': 'manhattan', 'n_neighbors': 5, 'weights': 'distance'}\n", " CV F1-Score: 0.5529, Test F1-Score: 0.5494\n", "\n", "=== Hyperparameter Tuning Results (14-class) ===\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelBest ParamsCV ScoreTest AccuracyTest F1-ScoreImprovement
0Logistic Regression (Tuned){'C': 100, 'class_weight': None, 'solver': 'sa...0.5975750.6133650.6100900.047780
1LDA (Tuned){'solver': 'svd'}0.5785490.5656320.5667210.000000
2KNN (k=5) (Tuned){'metric': 'manhattan', 'n_neighbors': 5, 'wei...0.5528860.5608590.5494440.018539
\n", "
" ], "text/plain": [ " Model \\\n", "0 Logistic Regression (Tuned) \n", "1 LDA (Tuned) \n", "2 KNN (k=5) (Tuned) \n", "\n", " Best Params CV Score Test Accuracy \\\n", "0 {'C': 100, 'class_weight': None, 'solver': 'sa... 0.597575 0.613365 \n", "1 {'solver': 'svd'} 0.578549 0.565632 \n", "2 {'metric': 'manhattan', 'n_neighbors': 5, 'wei... 0.552886 0.560859 \n", "\n", " Test F1-Score Improvement \n", "0 0.610090 0.047780 \n", "1 0.566721 0.000000 \n", "2 0.549444 0.018539 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Hyperparameter tuning configurations for top 3 models\n", "tuning_configs_14class = {\n", " 'Logistic Regression': {\n", " 'model': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n", " 'params': {\n", " 'C': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'solver': ['lbfgs', 'saga'],\n", " 'class_weight': [None, 'balanced'] \n", " }\n", " },\n", " 'LDA': {\n", " 'model': LinearDiscriminantAnalysis(),\n", " 'params': {\n", " 'solver': ['svd', 'lsqr', 'eigen']\n", " }\n", " },\n", " 'KNN (k=5)': {\n", " 'model': KNeighborsClassifier(),\n", " 'params': {\n", " 'n_neighbors': [3, 5, 7, 9, 11, 13],\n", " 'weights': ['uniform', 'distance'],\n", " 'metric': ['euclidean', 'manhattan']\n", " }\n", " }\n", "}\n", "\n", "tuning_results_14class = []\n", "best_models_14class = {}\n", "\n", "for name, config in tuning_configs_14class.items():\n", " print(f\"\\nTuning {name}...\")\n", " \n", " grid = GridSearchCV(\n", " config['model'],\n", " config['params'],\n", " cv=5,\n", " scoring='f1_weighted',\n", " n_jobs=-1,\n", " verbose=0\n", " )\n", " \n", " grid.fit(X_train_scaled, y_train)\n", " best_model = grid.best_estimator_\n", " best_models_14class[name] = best_model\n", " \n", " y_pred = best_model.predict(X_test_scaled)\n", " accuracy = accuracy_score(y_test, y_pred)\n", " f1 = f1_score(y_test, y_pred, average='weighted', zero_division=0)\n", " \n", " baseline_f1 = results_14class_baseline[results_14class_baseline['Model']==name]['F1-Score'].values[0]\n", " \n", " tuning_results_14class.append({\n", " 'Model': f\"{name} (Tuned)\",\n", " 'Best Params': str(grid.best_params_),\n", " 'CV Score': grid.best_score_,\n", " 'Test Accuracy': accuracy,\n", " 'Test F1-Score': f1,\n", " 'Improvement': f1 - baseline_f1\n", " })\n", " \n", " print(f\" Best params: {grid.best_params_}\")\n", " print(f\" CV F1-Score: {grid.best_score_:.4f}, Test F1-Score: {f1:.4f}\")\n", "\n", "tuning_df_14class = pd.DataFrame(tuning_results_14class).sort_values('Test F1-Score', ascending=False)\n", "print(\"\\n=== Hyperparameter Tuning Results (14-class) ===\\n\")\n", "display(tuning_df_14class)" ] }, { "cell_type": "markdown", "id": "ba67bf51", "metadata": {}, "source": [ "## Approach 2: Body Region Classification\n", "\n", "Due to the severe class imbalance in the 14-class problem, we explored grouping classes into 2 body regions (Upper Body / Lower Body) for more meaningful predictions." ] }, { "cell_type": "code", "execution_count": 155, "id": "3e5e5e9b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Body Region Class Distribution:\n", "WeakestRegion\n", "Upper Body 1525\n", "Lower Body 569\n", "Name: count, dtype: int64\n" ] } ], "source": [ "# Define body region mapping\n", "def get_region(label):\n", " upper = [\"ForwardHead\", \"LeftArmFallForward\", \"RightArmFallForward\", \n", " \"LeftShoulderElevation\", \"RightShoulderElevation\"]\n", " \n", " if label in upper: \n", " return \"Upper Body\"\n", " else: \n", " return \"Lower Body\"\n", "\n", "merged_df['WeakestRegion'] = merged_df['WeakestLink'].apply(get_region)\n", "\n", "print(\"Body Region Class Distribution:\")\n", "print(merged_df['WeakestRegion'].value_counts())" ] }, { "cell_type": "code", "execution_count": 156, "id": "4de69063", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training set: 1675 samples\n", "Test set: 419 samples\n" ] } ], "source": [ "# Prepare data for region-wise classification\n", "exclude_region = ['ID', 'WeakestLink', 'WeakestRegion', 'EstimatedScore']\n", "features_region = [c for c in merged_df.columns if c not in exclude_region]\n", "\n", "X_region = merged_df[features_region].copy()\n", "y_region = merged_df['WeakestRegion'].copy()\n", "\n", "X_train_region, X_test_region, y_train_region, y_test_region = train_test_split(\n", " X_region, y_region, test_size=0.2, random_state=42, stratify=y_region\n", ")\n", "\n", "# Scaling\n", "scaler_region = StandardScaler()\n", "X_train_region_scaled = scaler_region.fit_transform(X_train_region)\n", "X_test_region_scaled = scaler_region.transform(X_test_region)\n", "\n", "print(f\"Training set: {X_train_region.shape[0]} samples\")\n", "print(f\"Test set: {X_test_region.shape[0]} samples\")" ] }, { "cell_type": "code", "execution_count": 157, "id": "a994b1af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "=== Classification Performance (Body Regions) ===\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelAccuracyError RatePrecisionRecallF1-Score
5KNN (k=7)0.8377090.1622910.8326730.8377090.827772
2LDA0.8305490.1694510.8241480.8305490.824773
6KNN (k=10)0.8329360.1670640.8265750.8329360.824195
4KNN (k=5)0.8305490.1694510.8238080.8305490.823450
0Logistic Regression0.8114560.1885440.8347990.8114560.817984
1Naive Bayes0.7708830.2291170.7639690.7708830.766729
3QDA0.6634840.3365160.7502280.6634840.681889
\n", "
" ], "text/plain": [ " Model Accuracy Error Rate Precision Recall F1-Score\n", "5 KNN (k=7) 0.837709 0.162291 0.832673 0.837709 0.827772\n", "2 LDA 0.830549 0.169451 0.824148 0.830549 0.824773\n", "6 KNN (k=10) 0.832936 0.167064 0.826575 0.832936 0.824195\n", "4 KNN (k=5) 0.830549 0.169451 0.823808 0.830549 0.823450\n", "0 Logistic Regression 0.811456 0.188544 0.834799 0.811456 0.817984\n", "1 Naive Bayes 0.770883 0.229117 0.763969 0.770883 0.766729\n", "3 QDA 0.663484 0.336516 0.750228 0.663484 0.681889" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Define models for body region classification\n", "models_region = {\n", " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n", " 'Naive Bayes': GaussianNB(),\n", " 'LDA': LinearDiscriminantAnalysis(),\n", " 'QDA': QuadraticDiscriminantAnalysis(),\n", " 'KNN (k=5)': KNeighborsClassifier(n_neighbors=5),\n", " 'KNN (k=7)': KNeighborsClassifier(n_neighbors=7),\n", " 'KNN (k=10)': KNeighborsClassifier(n_neighbors=10)\n", "}\n", "\n", "# Train and evaluate\n", "results_region_baseline, trained_region = train_and_evaluate_variants(\n", " X_train_region_scaled, X_test_region_scaled, \n", " y_train_region, y_test_region, \n", " models_region\n", ")\n", "\n", "print(\"\\n=== Classification Performance (Body Regions) ===\\n\")\n", "display(results_region_baseline)" ] }, { "cell_type": "code", "execution_count": 158, "id": "00f3eda4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "BASELINE CHAMPION (Body Regions): KNN (k=7)\n", "F1-Score: 0.8278\n" ] } ], "source": [ "# Identify baseline champion for body regions\n", "champion_region_baseline = results_region_baseline.iloc[0]['Model']\n", "champion_region_f1_baseline = results_region_baseline.iloc[0]['F1-Score']\n", "print(f\"\\nBASELINE CHAMPION (Body Regions): {champion_region_baseline}\")\n", "print(f\"F1-Score: {champion_region_f1_baseline:.4f}\")" ] }, { "cell_type": "markdown", "id": "bfc7b8c0", "metadata": {}, "source": [ "## 7. Model training step 3: hyperparameter tuning of body regions" ] }, { "cell_type": "code", "execution_count": 159, "id": "6b03902f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Tuning Logistic Regression...\n", " Best params: {'C': 1, 'solver': 'lbfgs'}\n", " CV F1-Score: 0.8266, Test F1-Score: 0.8180\n", "\n", "Tuning LDA...\n", " Best params: {'solver': 'svd'}\n", " CV F1-Score: 0.8395, Test F1-Score: 0.8248\n", "\n", "Tuning KNN (k=10)...\n", " Best params: {'metric': 'manhattan', 'n_neighbors': 7, 'weights': 'distance'}\n", " CV F1-Score: 0.8672, Test F1-Score: 0.8263\n", "\n", "=== Hyperparameter Tuning Results (Body Regions) ===\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelBest ParamsCV ScoreTest AccuracyTest F1-ScoreImprovement
2KNN (k=10) (Tuned){'metric': 'manhattan', 'n_neighbors': 7, 'wei...0.8671940.8353220.8263470.002153
1LDA (Tuned){'solver': 'svd'}0.8394620.8305490.8247730.000000
0Logistic Regression (Tuned){'C': 1, 'solver': 'lbfgs'}0.8265770.8114560.8179840.000000
\n", "
" ], "text/plain": [ " Model \\\n", "2 KNN (k=10) (Tuned) \n", "1 LDA (Tuned) \n", "0 Logistic Regression (Tuned) \n", "\n", " Best Params CV Score Test Accuracy \\\n", "2 {'metric': 'manhattan', 'n_neighbors': 7, 'wei... 0.867194 0.835322 \n", "1 {'solver': 'svd'} 0.839462 0.830549 \n", "0 {'C': 1, 'solver': 'lbfgs'} 0.826577 0.811456 \n", "\n", " Test F1-Score Improvement \n", "2 0.826347 0.002153 \n", "1 0.824773 0.000000 \n", "0 0.817984 0.000000 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Hyperparameter tuning for body region models\n", "tuning_configs_region = {\n", " 'Logistic Regression': {\n", " 'model': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n", " 'params': {\n", " 'C': [0.01, 0.1, 1, 10, 100],\n", " 'solver': ['lbfgs', 'saga', 'newton-cg']\n", " }\n", " },\n", " 'LDA': {\n", " 'model': LinearDiscriminantAnalysis(),\n", " 'params': {\n", " 'solver': ['svd', 'lsqr', 'eigen']\n", " }\n", " },\n", " 'KNN (k=10)': {\n", " 'model': KNeighborsClassifier(),\n", " 'params': {\n", " 'n_neighbors': [7, 9, 10, 11, 13, 15],\n", " 'weights': ['uniform', 'distance'],\n", " 'metric': ['euclidean', 'manhattan', 'minkowski']\n", " }\n", " }\n", "}\n", "\n", "tuning_results_region = []\n", "best_models_region = {}\n", "\n", "for name, config in tuning_configs_region.items():\n", " print(f\"\\nTuning {name}...\")\n", " \n", " grid = GridSearchCV(\n", " config['model'],\n", " config['params'],\n", " cv=5,\n", " scoring='f1_weighted',\n", " n_jobs=-1,\n", " verbose=0\n", " )\n", " \n", " grid.fit(X_train_region_scaled, y_train_region)\n", " best_model = grid.best_estimator_\n", " best_models_region[name] = best_model\n", " \n", " y_pred = best_model.predict(X_test_region_scaled)\n", " accuracy = accuracy_score(y_test_region, y_pred)\n", " f1 = f1_score(y_test_region, y_pred, average='weighted', zero_division=0)\n", " \n", " baseline_f1 = results_region_baseline[results_region_baseline['Model']==name]['F1-Score'].values[0]\n", " \n", " tuning_results_region.append({\n", " 'Model': f\"{name} (Tuned)\",\n", " 'Best Params': str(grid.best_params_),\n", " 'CV Score': grid.best_score_,\n", " 'Test Accuracy': accuracy,\n", " 'Test F1-Score': f1,\n", " 'Improvement': f1 - baseline_f1\n", " })\n", " \n", " print(f\" Best params: {grid.best_params_}\")\n", " print(f\" CV F1-Score: {grid.best_score_:.4f}, Test F1-Score: {f1:.4f}\")\n", "\n", "tuning_df_region = pd.DataFrame(tuning_results_region).sort_values('Test F1-Score', ascending=False)\n", "print(\"\\n=== Hyperparameter Tuning Results (Body Regions) ===\\n\")\n", "display(tuning_df_region)" ] }, { "cell_type": "markdown", "id": "595e6b9d", "metadata": {}, "source": [ "## 8. Why we did not use polynomial features\n", "\n", "We tested polynomial interaction features which created 820 new features from the original 41. However, this approach was not used in the final model because the F1-score improvement was negligible, 820 features vs 41 original features makes it hard to interpret the model. Many more parameters to learn from the same amount of data, so the tuned body region model without polynomial features provides a good balance of accuracy and simplicity." ] }, { "cell_type": "markdown", "id": "2f3e5f57", "metadata": {}, "source": [ "## 9. Final champion comparison from all iterations" ] }, { "cell_type": "code", "execution_count": 160, "id": "0b3e066a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== ALL ITERATIONS RANKED BY PERFORMANCE ===\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ApproachIterationModelF1-Score
2Body RegionsBaselineKNN (k=7)0.827772
3Body RegionsTunedKNN (k=10) (Tuned)0.826347
114-ClassTunedLogistic Regression (Tuned)0.610090
014-ClassBaselineLDA0.566721
\n", "
" ], "text/plain": [ " Approach Iteration Model F1-Score\n", "2 Body Regions Baseline KNN (k=7) 0.827772\n", "3 Body Regions Tuned KNN (k=10) (Tuned) 0.826347\n", "1 14-Class Tuned Logistic Regression (Tuned) 0.610090\n", "0 14-Class Baseline LDA 0.566721" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "==================================================\n", "FINAL CHAMPION MODEL\n", "==================================================\n", "Approach: Body Regions\n", "Iteration: Baseline\n", "Model: KNN (k=7)\n", "F1-Score: 0.8278\n" ] } ], "source": [ "# Combine ALL iterations for final comparison\n", "all_iterations = pd.DataFrame([\n", " # 14-class approaches\n", " {'Approach': '14-Class', 'Iteration': 'Baseline', \n", " 'Model': champion_14class_baseline, \n", " 'F1-Score': champion_14class_f1_baseline},\n", " {'Approach': '14-Class', 'Iteration': 'Tuned', \n", " 'Model': tuning_df_14class.iloc[0]['Model'], \n", " 'F1-Score': tuning_df_14class.iloc[0]['Test F1-Score']},\n", " \n", " # Body region approaches\n", " {'Approach': 'Body Regions', 'Iteration': 'Baseline', \n", " 'Model': champion_region_baseline, \n", " 'F1-Score': champion_region_f1_baseline},\n", " {'Approach': 'Body Regions', 'Iteration': 'Tuned', \n", " 'Model': tuning_df_region.iloc[0]['Model'], \n", " 'F1-Score': tuning_df_region.iloc[0]['Test F1-Score']},\n", "])\n", "\n", "all_iterations = all_iterations.sort_values('F1-Score', ascending=False)\n", "\n", "print(\"=== ALL ITERATIONS RANKED BY PERFORMANCE ===\\n\")\n", "display(all_iterations)\n", "\n", "# Identify overall champion\n", "final_champion_row = all_iterations.iloc[0]\n", "print(\"\\n\" + \"=\"*50)\n", "print(\"FINAL CHAMPION MODEL\")\n", "print(\"=\"*50)\n", "print(f\"Approach: {final_champion_row['Approach']}\")\n", "print(f\"Iteration: {final_champion_row['Iteration']}\")\n", "print(f\"Model: {final_champion_row['Model']}\")\n", "print(f\"F1-Score: {final_champion_row['F1-Score']:.4f}\")" ] }, { "cell_type": "code", "execution_count": 161, "id": "d21c037d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== FINAL CHAMPION - Classification Report ===\n", "\n", " precision recall f1-score support\n", "\n", " Lower Body 0.79 0.55 0.65 114\n", " Upper Body 0.85 0.94 0.89 305\n", "\n", " accuracy 0.84 419\n", " macro avg 0.82 0.75 0.77 419\n", "weighted avg 0.83 0.84 0.83 419\n", "\n" ] }, { "data": { "image/png": "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KGXLlpX06dObciOt827Xrp2sXr36liUvut2ZM2fM/fUMjb6GwoULy6uvvhqtd/uFCxdk+PDhUrFiRcmQIYOkSJFCcuTIYQ4au3btKj/99JP4mz6v/twGDhwo8+fP97ot6ntVDwLat29vrjCr7099rbq/SpUqJT169Iix5l3PDOjjly5dWtKlS2fuoz+7qlWrmvtYJXCeNm7cKE888YR5T+vPWJ/jrrvuMvtU92F83c574vDhw/LUU09J7ty5ze9TyZIl5ZNPPon1TNV7770ntWvXNgeu+pr0fg8//LA5CxITfcxmzZq5fx8mT54c79cBAHFyAfDJHXfcodGaWebOnRvt9okTJ7pv12Xx4sVm/dWrV10//PCDKzw83H1bx44dve57+PBhV+nSpb3uH3Vp3bq169q1a173e+yxx2LctmnTpl7f69jUoUOHXClSpHCv13F5Gjx4sPu2UqVKxWu/3Hvvve77FChQwOu2d955x2scO3fu9Lr9r7/+chUsWDDW15wqVSrXN99843WfU6dOuUqUKBHj9s2bN/f6fs+ePe776T631uuYPS1dutSVOXPmWMehP7uxY8d63WfIkCHu27NmzeoqWbJkjPcdNGiQ1/3q1Klzy5/zo48+6rKb59g999OlS5dc48eP97pNt/Wk78NbjT9jxoyuTZs2ubfXxyxevPgt79O3b1+v5/jggw9cyZMnj3V7fW/q74wnfe/FNGb9PYzPe6Jw4cKu3Llzx/h8EyZM8HquY8eOuSpUqHDL98tbb70V475/9913Y30fAkBCUK4D+GDfvn1msWjmOC5169aNcb1mJZ977jmvdW3btvXKWj/00EMmM6pnAKys4HfffWeymIMHDzbfT58+XaZNm+a+T5EiReSRRx4xGekvvvgixufWTKOehbDu9+mnn5ozBRbNhls6d+4svrKy9prNt2jmWsfouU3Lli3dmVWd8KmTmTUr+vPPP5vyKM2WdujQQSpVqmQy40qzzZ7Z5Vq1apl9/euvv8qcOXNue6ynT5+WVq1auSeZ6s9HX7uelfjqq69k79695oyHZqJ1HNbkyahnFvT+OtY8efKY/arZa/X222+bMWum988//zSZZRUeHm62L1asmNl2z5497tv8rVChQjGuz5Ytm3Tp0sVrnZ6Ruv/++02W2zrjdPToUZPh198RPTOjE8y1HEVpmdqOHTvM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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Evaluation of final champion\n", "# Determine which champion to use based on best F1\n", "if final_champion_row['Approach'] == 'Body Regions':\n", " if final_champion_row['Iteration'] == 'Tuned':\n", " final_model = best_models_region[tuning_df_region.iloc[0]['Model'].replace(' (Tuned)', '')]\n", " X_test_final = X_test_region_scaled\n", " y_test_final = y_test_region\n", " else: # Baseline\n", " final_model = trained_region[champion_region_baseline]\n", " X_test_final = X_test_region_scaled\n", " y_test_final = y_test_region\n", " \n", " classes = sorted(y_region.unique())\n", "else: # 14-class\n", " if final_champion_row['Iteration'] == 'Tuned':\n", " final_model = best_models_14class[tuning_df_14class.iloc[0]['Model'].replace(' (Tuned)', '')]\n", " else:\n", " final_model = trained_14class[champion_14class_baseline]\n", " X_test_final = X_test_scaled\n", " y_test_final = y_test\n", " classes = sorted(y.unique())\n", "\n", "# Get predictions\n", "y_pred_final = final_model.predict(X_test_final)\n", "\n", "# Classification report\n", "print(\"=== FINAL CHAMPION - Classification Report ===\\n\")\n", "print(classification_report(y_test_final, y_pred_final, zero_division=0))\n", "\n", "# Confusion matrix\n", "cm = confusion_matrix(y_test_final, y_pred_final, labels=classes)\n", "cm_df = pd.DataFrame(cm, index=classes, columns=classes)\n", "\n", "plt.figure(figsize=(8, 6))\n", "sns.heatmap(cm_df, annot=True, fmt='d', cmap='Greens', cbar_kws={'label': 'Count'})\n", "plt.title(f'Final Champion: {final_champion_row[\"Model\"]}\\n({final_champion_row[\"Approach\"]} - {final_champion_row[\"Iteration\"]})', \n", " fontweight='bold', fontsize=14)\n", "plt.ylabel('Actual', fontsize=12)\n", "plt.xlabel('Predicted', fontsize=12)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 162, "id": "4f01e27a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Champion model saved: models/final_champion_model_A3.pkl\n", "Keys in artifact: ['model', 'feature_columns', 'classes', 'test_metrics']\n", "Number of features: 41\n", "Classes: ['Lower Body', 'Upper Body']\n", "Test F1: 0.8278, Accuracy: 0.8377\n" ] } ], "source": [ "# Save the final champion model with complete artifact for deployment\n", "import os\n", "os.makedirs('models', exist_ok=True)\n", "\n", "# Compute test metrics\n", "test_f1 = f1_score(y_test_final, y_pred_final, average='weighted', zero_division=0)\n", "test_acc = accuracy_score(y_test_final, y_pred_final)\n", "\n", "# Create complete model artifact with all required fields for app.py\n", "model_dictionary = {\n", " 'model': final_model,\n", " 'feature_columns': features_region,\n", " 'classes': sorted(y_region.unique()),\n", " 'test_metrics': {\n", " 'f1_weighted': test_f1,\n", " 'accuracy': test_acc\n", " }\n", "}\n", "\n", "model_filename = 'models/final_champion_model_A3.pkl'\n", "with open(model_filename, 'wb') as f:\n", " pickle.dump(model_dictionary, f)\n", "\n", "print(f'Champion model saved: {model_filename}')\n", "print(f'Keys in artifact: {list(model_dictionary.keys())}')\n", "print(f'Number of features: {len(features_region)}')\n", "print(f\"Classes: {model_dictionary['classes']}\")\n", "print(f'Test F1: {test_f1:.4f}, Accuracy: {test_acc:.4f}')" ] }, { "cell_type": "markdown", "id": "eba1be0e", "metadata": {}, "source": [ "## 10. Deployment\n", "\n", "The classification endpoint is added to the existing Gradio app as a second tab. Tab 1 has Movement Scoring from A2. Tab 2 has Body Region Classification which takes 41 features as input and outputs the predicted body region (Upper Body or Lower Body). The deployed model is KNN (k=7) with StandardScaler preprocessing, achieving 82.8% F1-weighted score and 84% accuracy on the test set.\n", "\n", "[Due to last minute issues, the app currently downloads the pickle model from google drive, but we are working to automate this. The overall functionality has not suffered, the issue exists with some policy restrictions on huggingface, and not in the functionality of the app]\n", "\n", "Deployment URL: https://huggingface.co/spaces/Bachstelze/github_sync" ] }, { "cell_type": "markdown", "id": "67013cc1", "metadata": {}, "source": [ "## 11. Environment & DevOps\n", "\n", "**Virtual environment setup:**\n", "```bash\n", "python -m venv venv\n", "source venv/bin/activate\n", "pip install -r requirements.txt\n", "\n", "```**CI/CD Pipeline:** GitHub Actions automatically syncs the repository to HuggingFace Spaces when pushed to main. The workflow file is located at `.github/workflows/push_to_hf_space.yml`.\n" ] }, { "cell_type": "markdown", "id": "7a142abd", "metadata": {}, "source": [ "## 12. Contributions \n", "\n", "| Member | GitHub Issue | Tasks |\n", "|--------|--------------|-------|\n", "| Reem | #8 Data Preparation | Merge datasets, create WeakestLink column |\n", "| Rasa | #9 Classification Models | Train/evaluate classifiers (A3_Test.ipynb) |\n", "| Amol | #10 Deployment | Add classification endpoint to Gradio, final report |\n", "| Kalle | #11 Dependency Management | requirements.txt, CI checks |" ] }, { "cell_type": "markdown", "id": "f62680e2", "metadata": {}, "source": [ "## 13. Iterations\n", "\n", "| # | Iteration | Approach | Key change |\n", "|---|-----------|----------|------------|\n", "| 1 | Baseline | 14-Class | Default hyperparameters |\n", "| 2 | Tuned | 14-Class | GridSearchCV (5-fold CV) |\n", "| 3 | Baseline | Body Regions | Grouped classes (Upper/Lower) |\n", "| 4 | Tuned | Body Regions | GridSearchCV (5-fold CV) |\n", "\n", "Note: Polynomial interaction features were tested but not included in final iterations due to minimal improvement and increased complexity (820 features vs 41)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.0" } }, "nbformat": 4, "nbformat_minor": 5 }