{ "cells": [ { "cell_type": "markdown", "id": "c219123e-f4a5-46a5-8a54-6a888f633dcb", "metadata": {}, "source": [ "## Classification model" ] }, { "cell_type": "markdown", "id": "a15db152-e016-4971-b3e4-004c2c2ef9f9", "metadata": {}, "source": [ "#### Import all necessary libraries " ] }, { "cell_type": "code", "execution_count": 24, "id": "44d2688c-f97c-4758-a201-4c7794019703", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from scipy import stats\n", "\n", "from sklearn.model_selection import (\n", " train_test_split, \n", " cross_val_score, \n", " cross_validate,\n", " KFold,\n", " StratifiedKFold\n", ")\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.linear_model import (\n", " LinearRegression, \n", " Ridge, \n", " Lasso,\n", " LogisticRegression\n", ")\n", "from sklearn.discriminant_analysis import (\n", " LinearDiscriminantAnalysis,\n", " QuadraticDiscriminantAnalysis\n", ")\n", "from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.metrics import (\n", " mean_squared_error,\n", " r2_score,\n", " accuracy_score,\n", " precision_score,\n", " recall_score,\n", " f1_score,\n", " classification_report,\n", " confusion_matrix\n", ")\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.ensemble import (\n", " RandomForestClassifier\n", ")\n", "from imblearn.over_sampling import SMOTE\n", "import pickle\n", "import warnings\n", "import os\n", "from pathlib import Path\n", "warnings.filterwarnings('ignore')\n", "np.random.seed(42)" ] }, { "cell_type": "markdown", "id": "617e80ac-43d6-41af-8208-1fbee6415af0", "metadata": {}, "source": [ "#### Load data" ] }, { "cell_type": "code", "execution_count": 25, "id": "2f41c8fc-830b-4dae-8b4d-024a65907517", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset 1 - Weak Link Scores:\n", "Shape: (2096, 17)\n", "\n", "First few rows:\n", " ID Date SCORE \\\n", "0 cf0e95ab-d6ec-475a-9cc0-c9444b8dd080.Kinect 7/19/2018 0.612532 \n", "1 6210cc6d-575d-4e9f-bab1-4fe1da2a30a3.Kinect 7/30/2018 0.388809 \n", "\n", " ForwardHead LeftArmFallForward RightArmFallForward \\\n", "0 0.31 1.34 1.15 \n", "1 1.49 1.42 1.39 \n", "\n", " LeftShoulderElevation RightShoulderElevation ExcessiveForwardLean \\\n", "0 0.33 0.49 0.00 \n", "1 0.00 0.00 1.08 \n", "\n", " LeftAsymmetricalWeightShift RightAsymmetricalWeightShift \\\n", "0 0.0 0.08 \n", "1 0.1 0.00 \n", "\n", " LeftKneeMovesInward RightKneeMovesInward LeftKneeMovesOutward \\\n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "\n", " RightKneeMovesOutward LeftHeelRises RightHeelRises \n", "0 0.77 0.0 0.0 \n", "1 0.40 0.0 0.0 \n", "\n", "\n", "\n", "Dataset 2 - Movement Features:\n", "Shape: (2094, 43)\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", "\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", "\n", " No_6_Angle_Deviation No_7_Angle_Deviation No_8_Angle_Deviation \\\n", "0 0.947872 0.275945 0.52176 \n", "1 0.140124 0.664275 0.52176 \n", "\n", " No_9_Angle_Deviation ... No_20_NASM_Deviation No_21_NASM_Deviation \\\n", "0 0.457198 ... 0.656624 0.642276 \n", "1 0.729316 ... 0.721186 0.826399 \n", "\n", " No_22_NASM_Deviation No_23_NASM_Deviation No_24_NASM_Deviation \\\n", "0 0.552846 0.648972 0.578192 \n", "1 0.805356 0.848876 0.889048 \n", "\n", " No_25_NASM_Deviation No_1_Time_Deviation No_2_Time_Deviation \\\n", "0 0.560019 0.821616 0.818747 \n", "1 0.816834 0.307987 0.248207 \n", "\n", " EstimatedScore ID \n", "0 0.209947 0003cdcc-86ed-494a-a3b5-90d09e96e06b.Kinect \n", "1 0.457198 003115c4-bdb8-491c-b571-8fcebdecf8ed.Kinect \n", "\n", "[2 rows x 43 columns]\n" ] } ], "source": [ "# Configuration \n", "\n", "REPO_ROOT = os.path.abspath(os.path.join(os.getcwd(), \"..\"))\n", "DATA_DIR = os.path.join(REPO_ROOT, \"Datasets_all\")\n", "OUT_DIR = Path(\"models\")\n", "\n", "RANDOM_STATE = 42\n", "N_SPLITS = 5 # 5-fold CV\n", "\n", "# Dataset 1: New dataset with 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(\"\\nFirst few rows:\")\n", "print(weaklink_scores_df.head(2))\n", "\n", "print(\"\\n\\n\")\n", "\n", "print(\"Dataset 2 - Movement Features:\")\n", "print(f\"Shape: {movement_features_df.shape}\")\n", "print(\"\\nFirst few rows:\")\n", "print(movement_features_df.head(2))" ] }, { "cell_type": "markdown", "id": "97698c82-7b6f-4dcd-96a9-17c1f14151e5", "metadata": {}, "source": [ "#### Define weak link categories\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "40b37bda-7290-4cad-9ea1-dfff7bf98bb6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Weakest Link Distribution:\n", "WeakestLink\n", "LeftArmFallForward 616\n", "RightArmFallForward 458\n", "RightKneeMovesOutward 274\n", "RightShoulderElevation 245\n", "ExcessiveForwardLean 128\n", "ForwardHead 109\n", "LeftAsymmetricalWeightShift 80\n", "LeftShoulderElevation 55\n", "LeftKneeMovesOutward 54\n", "RightKneeMovesInward 45\n", "RightAsymmetricalWeightShift 20\n", "LeftHeelRises 7\n", "LeftKneeMovesInward 3\n", "RightHeelRises 2\n", "Name: count, dtype: int64\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ8AAAJOCAYAAAAZP6bBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8y5JREFUeJzs3Qm851P9+PEzYzD2se+iEsYasm8hY0mWsWYZEpJ9p+yESJayVIRCoiwhW4iyLylLiVL42cla9u//8Trzf3/nfL/zvTOD+zX3znk9H49rZu73O3fuPT6fzznnfd7nfQY0Go1GkiRJkiRJkrpgYDe+qCRJkiRJkmTwSZIkSZIkSV1l5pMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEnjwe9///s0YMCA5se//vWv8f7/ge+h/J74HsNhhx3W/Pzcc8+d+oJzzjmn5fud0FxzzTVp5ZVXTtNMM03zZxwyZEiakG2zzTbNn3WVVVZJteIei3bg3vu4JvR7RZLU9xl8kiSpF4JHfEwyySQ5UPDpT386rb766unwww9PTz75ZNfbl0l6fA9M3icEtU+WH3jggbTeeuulW265Jb322mvj/PeWWGKJZputvfbao72+1VZbtbTrP//5z5bX77333pbXr7766l75efq7sk24Nj9OULc3gkmSJPU3g8b3NyBJ0oTi3XffzR8ECx5//PF0ww03pCOPPDIdfPDB+WPgwFFrPp/5zGfS8ccf3/zzdNNNl8Y3vofye+J77Mu+8IUvtHy/E5JLLrkkvfPOO/n3k046adpjjz3SDDPMkAYPHjzGv7fSSiul++67L//+1ltvTR988EHLdfeHP/yh5f38mWBpuPnmm5u/5+8tv/zyvfYzadx9+9vfTq+++mr+/XLLLWfTSZL6PYNPkiT1gk033TQtueSSecLI5P/aa69N77//fv4g0+HZZ59Np59+evP9c845Z9pnn336RNsT5Gg0GmnqqafuM9/TuFhwwQXzx4To3//+d0uQ7dhjjx2nv0fw6aSTTsq/Jwh6//33p8UXXzz/mSy88uuCzKoRI0a0/Dksuuii+ZrQJ2/77be32SVJExS33UmS1AvWXHPNHLgh0+mqq67K26bmmWee5utnnHFGruEzLjWf3nzzzXTEEUfkoMFUU02VJp544jTTTDOlxRZbLE9K4+tEHaYyW+Xcc8/t+HXbt+Y9+OCDaf3110/TTz99zqz561//OsaaT+1ef/31tPfee+cgGtk4Q4cOTT/84Q9zEGtctwR22loX38O2227b8t5O25bGtjXvf//7XzrxxBNz9s60006bt0XOPPPMeTvaRRddNNr72/+fsCXttNNOS4ssskj+Gfl/8PWvfz395z//SR8GAcif/vSnabXVVsvZS/z/pN2/+MUvpp/85CfpvffeG61Nzj777Obn/vjHP47ztsoVV1yxpS3KTKcysDTrrLOO9jr/7/i3ykBWifbYbbfd0gILLJCmmGKKNNlkk+X/7wcccEB68cUXO7bndtttl69j/j2us8knnzx99rOfzf9/uUfG1RtvvJFWWGGFZjvQjpHhhT//+c/pa1/7Ws7W4/uacsop0+c///l09NFH5/upHUG4HXfcMc0777z5/fz/nX322fO1stdee+X7obx+S3zv3a5/1lPNp25co2TVxdebaKKJ8rUKrksCmcsuu2yuNTZo0KB83RLw3XrrrdOFF17YlZ9dkjSBakiSpA/tpptuIsrS/Dj77LNHe89dd93V8p411lijx7//+OOPN19bZZVVWl5r/9h0003z+w499NAxvq/8uiuvvHLzc5///OcbU0wxRcv7/vSnP+X3lp/jewzlvzXzzDM3llxyyY7/3q677trSBuW/O2LEiJbXaLPy76L9e+j0wffS098PzzzzTGPBBRcc49cZPnx449133+3x/8kKK6zQ8e+ttNJK43ydvPHGG/n9Y/o++Hdef/31jj9T+0d7G3YydOjQ5vs33HDD5ud33HHH/Lmpppqq5f/ns88+m19/4IEHWv6tX/3qV82/e9lllzUmn3zyHr+v2WefvfHwww+3fB977733GH+WSSaZpHH99de3/B1+vnidawf//e9/W66jmWaaqfGXv/yl+XdOO+20xqBBg3r8d2gProfw3HPPNWacccYxfm+nn356fm/573b6+NSnPjXW/x/t13Rcv2PC1+30/o96jfZ0r+y7777Nz0000USN888/v+P/i04fSy+99Fh/DkmSgtvuJEnqErZLsXWJrIzIPCELhuyCnpBxERlH1Nwhw+Bzn/tcziyhjlSZjbTGGmvkDA+280XhaLb+sQVwTLWk/vSnP+UsBopPk/nxt7/9bay1hErPPfdceuWVV9I3vvGNnBFx3nnnpaeeeiq/9oMf/CANHz48n9L2cepO3XPPPemXv/xl8/NlbadxqYGzxRZbpIceeqj554022ihn6Vx//fXp9ttvz5/79a9/nTNjDjnkkI5fgywgspX49y677LJmpg7/H++44460zDLLjPX7IFOozDji/xmZJPx9tmbGv8P7yDiJOlb87LQBqMm000475d8vtNBCY/03yVh6+OGHe8x84uch64qC+PH5jTfeuOX7jCwqcN1tvvnmOZMMZL5ssMEGuZ7U+eefn7OI/u///i//f6eN4vomO4rrYOGFF87/X8kweumll3JmINc52z35ueN77eStt97Khdcju2+22WbLtdTmn3/+/Ofbbrst7bLLLvl7Af9PyEIkM48sQO4bvj730XXXXdf8//7CCy/k35MRRyYTGT1PP/10vhfKNqPdv/zlL6d99913tC224ICB8enjXKPUoYv7imy8X/ziF/n/YWSacV8HPk8GG9uK+f9dZltKkjROmmEoSZLUq5lP2GSTTVre9/zzz3f8+5GhdN999zU/t8ACCzQ++OCDlq/33nvvNf71r3+Nc3ZRp/fwQSZLu3HNfOKjzJDg70088cTN17bYYotx+t7GlLk0ptfG9h6yuMrP77fffi3tt+yyyzZfm2666Rrvv/9+x/8nG2ywQbP9X3rppZwZEq+dcsopjbF58cUXW/4O10JP1wbv4/1jygAaVxdccEHLz0FG0gsvvNAYMGBA/vNRRx3V+N///teYdNJJW7LVyKiLvzPffPM1v96ee+7Z/PznPve5/HfD008/3fIzXn755S3fC2175513Ns4555zGSSed1Dj++OMbe+21V8v398QTT3T8ufn/tPbaazf/PNdcczUee+yxlq/P/6N4nYzB+H/ZKfPwz3/+c/7897///ebnyAbrlK0W2WBhXO718ZH5NK7XaPu9cuSRRzZ/z3VwxRVXtPz7L7/8cvP1qaeeuvH222+3vM6/+c9//vNDtYMkqW5mPkmS1EXtNZDGhno6ZGGQIUJ2CPVxqF1D9hN1XVZfffX0qU996mN9T2TPkE3yUZElUWZXUZ+Gejw33XRT/vO9996bxqfIbAplQW2ycrbccsvme15++eX0yCOP5HZvR9ZL1Pshc4c6Q2R9YVxq6tx11105063T9xF/jtpT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WfrrX/+ahg4dmu6+++605JJL5vdcc801ae21105PPfVU/vtj89prr6Vpppkmf22yp3qDp91JkiRJkqT+alxjJX0+8+k3v/lNDhhtvPHGaaaZZkqf//zn009+8pPm648//nh69tln81a7wA++9NJLp9tvvz3/mV/ZaheBJ/D+gQMH5kwpSZIkSZIkdUefDz7985//TKeffnqad95507XXXpt22mmntNtuu6Vzzz03v07gCWQ6lfhzvMavBK5KgwYNStNNN13zPe3efvvtHMErPyRJkiRJkvThDEp93AcffJAzlo4++uj8ZzKfHnzwwVzfacSIEV37d4855ph0+OGHd+3rS5IkSZIk1aDPZz5xgh31mkoLLLBAeuKJJ/LvZ5lllvzrc8891/Ie/hyv8evzzz/f8vp7772XT8CL97Q78MAD857F+HjyySd79eeSJEmSJEmqQZ8PPnHS3SOPPNLyub///e/pU5/6VP79PPPMkwNIN9xwQ/N1tshRy2nZZZfNf+bXV155Jd17773N99x44405q4raUJ1MOumkuVhW+SFJkiRJkqQJbNvdnnvumZZbbrm87W6TTTZJd911V/rxj3+cPzBgwIC0xx57pKOOOirXhSIYdfDBB+cT7NZff/1mptSaa66Ztt9++7xd791330277LJLPglvXE66kyRJkiRJ0gQafPrCF76QLr300rwN7ogjjsjBpZNOOiltscUWzffst99+6c0330w77LBDznBaYYUV0jXXXJMGDx7cfM/555+fA06rrbZaPuVu+PDh6ZRTThlPP5UkSZIkSVIdBjQajcb4/ib6A7byTTPNNLn+U29twRt25FWpr7r24HXG97cgSZIkSZImgFhJn6/5JEmSJEmSpP7L4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkgw+SZIkSZIkqf8x80mSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSXUHnw477LA0YMCAlo/555+/+fpbb72Vdt555zT99NOnKaecMg0fPjw999xzLV/jiSeeSOuss06afPLJ00wzzZT23Xff9N57742Hn0aSJEmSJKkeg1I/seCCC6bf/e53zT8PGjTqW99zzz3TVVddlS6++OI0zTTTpF122SVtuOGG6dZbb82vv//++znwNMsss6TbbrstPfPMM2nrrbdOE088cTr66KPHy88jSZIkSZJUg34TfCLYRPCo3auvvprOOuusdMEFF6RVV101f+7ss89OCyywQLrjjjvSMsssk6677rr08MMP5+DVzDPPnBZbbLF05JFHpv333z9nVU0yySTj4SeSJEmSJEma8PWLbXd49NFH02yzzZY+/elPpy222CJvo8O9996b3n333bT66qs338uWvLnmmivdfvvt+c/8uvDCC+fAUxg2bFh67bXX0kMPPTQefhpJkiRJkqQ69IvMp6WXXjqdc845ab755stb5g4//PC04oorpgcffDA9++yzOXNpyJAhLX+HQBOvgV/LwFO8Hq918vbbb+ePQKBKkiRJkiRJE2Dwaa211mr+fpFFFsnBqE996lPpoosuSpNNNllX/s1jjjkmB7kkSZIkSZJUwba7EllOn/vc59Jjjz2W60C988476ZVXXml5D6fdRY0ofm0//S7+3KmOFA488MBcTyo+nnzyya79PJIkSZIkSROqfhl8euONN9I//vGPNOuss6Ylllgin1p3ww03NF9/5JFHck2oZZddNv+ZXx944IH0/PPPN99z/fXXp6mnnjoNHTq0478x6aST5tfLD0mSJEmSJE2A2+722WeftO666+atdk8//XQ69NBD00QTTZQ233zzNM0006Ttttsu7bXXXmm66abLQaJdd901B5w46Q5rrLFGDjJttdVW6bjjjst1ng466KC088475yCTJEmSJEmS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nSRJkiRJkiZ8g7rxRcluOvPMM/PHCy+8kD744IM044wzpoEDez3WJUmSJEmSpNqCTyWCTpIkSZIkSapTrwefjjjiiLG+hzpQBx98cG//05IkSZIkSZrQg0+HHXbYGINO1IAy+CRJkiRJklSHXi/CRH2n9o/33nsv/eMf/0h77rlnPvHu+eef7+1/VpIkSZIkSX3QJ1IBnELj88wzT/re976X5p133rTrrrt+Ev+sJEmSJEmSxrNP/Pi5lVZaKf32t7/9pP9ZSZIkSZIk1RB8uueee3ImlCRJkiRJkiZ8vV5w/Gc/+1nHz7/yyivplltuSZdcckn6+te/3tv/rCRJkiRJkmoIPm2zzTY9vjbDDDOkAw44IB1yyCEf6muefvrp+eNf//pX/vOCCy6Yv8Zaa62V//zWW2+lvffeO1144YXp7bffTsOGDUunnXZamnnmmZtf44knnkg77bRTuummm9KUU06ZRowYkY455pg0aFCvN4EkSZIkSZL+v16PvDz++OOjfW7AgAFp2mmnTVNNNdVH+ppzzDFHOvbYY3Ox8kajkc4999y03nrrpT/96U85EMUpeldddVW6+OKL0zTTTJN22WWXtOGGG6Zbb701//33338/rbPOOmmWWWZJt912W3rmmWfS1ltvnSaeeOJ09NFHf+yfWZIkSZIkSZ0NaBDN6Yemm266dPzxx6eNNtoozTjjjOmCCy7Iv8ff/va3tMACC6Tbb789LbPMMunqq69OX/7yl9PTTz/dzIY644wz0v77759eeOGFNMkkk4z133vttddyYOvVV19NU089da/8DMOOvCr1VdcevE7qy2w7SZIkSZLGr3GNlfS7yt9kMbG97s0330zLLrtsuvfee9O7776bVl999eZ75p9//jTXXHPl4BP4deGFF27ZhsfWPBrpoYceGi8/hyRJkiRJUg16fdsdJ9mxze7D4P3vvffeGN/zwAMP5GAT9Z2o2XTppZemoUOHpvvvvz9nLg0ZMqTl/QSann322fx7fi0DT/F6vNYJtaP4CASqJEmSJEmSNJ6DTxQCv+yyy3JGEdlF8803X3Mr3HXXXZcWWmihtP7663/or8vXIdBEKtevfvWrXDD85ptvTt1CMfLDDz+8a19fkiRJkiSpBr0efJptttnS888/nx588MFm4Cn89a9/Tauuump+z/bbb/+hvi7ZTZ/97Gfz75dYYol09913p5NPPjltuumm6Z133kmvvPJKS/bTc889lwuMg1/vuuuulq/H6/FaJwceeGDaa6+9WjKf5pxzzg/1PUuSJEmSJNWu12s+UQSc0+baA0+gCDivHXfccR/73/nggw/ytjgCUZxad8MNNzRfe+SRR9ITTzyRt+mBX9m2R1AsXH/99bkYFlv3Opl00knz6+WHJEmSJEmSxnPm01NPPZWDQT3hNd7zYZCFtNZaa+Ui4q+//no+2e73v/99uvbaa3NV9e222y5nKXECHkGiXXfdNQecOOkOa6yxRg4ybbXVVjnwRZ2ngw46KO288845yCRJkiRJkqR+EnyiptNpp52WvvrVr6bZZ5+95TWCTrzGyXMfBhlLW2+9dXrmmWdysGmRRRbJgacvfelL+fUTTzwxFzofPnx4zoai1hT/TphooonSlVdemXbaaacclJpiiilyzagjjjiil35qSZIkSZIkdTKg0Wg0Ui/64x//mIM/2GCDDZp1mh599NFciJx/jsLjK6ywQupPqPlE4IuC5721BW/YkVelvurag9dJfZltJ0mSJElS/4iV9HrmE0GlO++8Mx188MHp0ksvTf/73//y5yebbLIclOIEuQ+b+SRJkiRJkqT+qdeDT7H1jsATRcFfeOGF/LkZZ5wxb42TJEmSJElSPboSfAoEmwYPHpymnHJKA0+SJEmSJEkV6koq0j333JPWXHPNNPnkk6fpp58+3XzzzfnzL774YlpvvfXySXWSJEmSJEma8PV68Om2227LdZ8oML7lllvmrXdhhhlmyEWofvSjH/X2PytJkiRJkqQagk/f+ta30gILLJAefvjhdPTRR4/2+he/+MVckFySJEmSJEkTvl4PPt19991p2223TZNOOmkaMGDAaK/PPvvs6dlnn+3tf1aSJEmSJEk1BJ8mnnjilq127f7v//4vFyCXJEmSJEnShK/XT7tbZpll0q9+9au0xx57jPbam2++mc4+++y08sor9/Y/K2kcDDvyqj7bTtcevM74/hYkSZIkSf0h8+nwww/Pp92ts8466eqrr86f+/Of/5zOPPPMtMQSS6QXXnghHXzwwb39z0qSJEmSJKmGzKell146/fa3v0077bRT2nrrrfPn9t577/zrZz7zmfzaIoss0tv/rCRJkiRJkib04FOj0Uivv/56Wm655dIjjzyS7r///vTo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xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSusbgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmSumZQ9760JEn6KIYdeVWfbrhrD15nfH8LkiRJ6kf6RebTLbfcktZdd90022yzpQEDBqTLLrus5fVGo5EOOeSQNOuss6bJJpssrb766unRRx9tec/LL7+ctthiizT11FOnIUOGpO222y698cYbn/BPIkmSJEmSVJd+EXx6880306KLLppOPfXUjq8fd9xx6ZRTTklnnHFGuvPOO9MUU0yRhg0blt56663mewg8PfTQQ+n6669PV155ZQ5o7bDDDp/gTyFJkiRJklSffrHtbq211sofnZD1dNJJJ6WDDjoorbfeevlzP/vZz9LMM8+cM6Q222yz9Ne//jVdc8016e67705LLrlkfs8PfvCDtPbaa6fvfe97OaNKkiRJkiRJlWY+jcnjjz+enn322bzVLkwzzTRp6aWXTrfffnv+M7+y1S4CT+D9AwcOzJlSnbz99tvptddea/mQJEmSJElSZcEnAk8g06nEn+M1fp1ppplaXh80aFCabrrpmu9pd8wxx+QgVnzMOeecXfsZJEmSJEmSJlT9PvjULQceeGB69dVXmx9PPvnk+P6WJEmSJEmS+p1+H3yaZZZZ8q/PPfdcy+f5c7zGr88//3zL6++9914+AS/e027SSSfNJ+OVH5IkSZIkSaos+DTPPPPkANINN9zQ/Bz1majltOyyy+Y/8+srr7yS7r333uZ7brzxxvTBBx/k2lCSJEmSJEmq+LS7N954Iz322GMtRcbvv//+XLNprrnmSnvssUc66qij0rzzzpuDUQcffHA+wW799dfP719ggQXSmmuumbbffvt0xhlnpHfffTftsssu+SQ8T7qTJEmSJEmqPPh0zz33pC9+8YvNP++111751xEjRqRzzjkn7bfffunNN99MO+ywQ85wWmGFFdI111yTBg8e3Pw7559/fg44rbbaavmUu+HDh6dTTjllvPw8kiRJkiRJtegXwadVVlklNRqNHl8fMGBAOuKII/JHT8iSuuCCC7r0HUqSJEmSJGmCrPkkSZIkSZKkvsvgkyRJkiRJkrrG4JMkSZIkSZK6xuCTJEmSJEmS6i44LkmSNC6GHXlVn22oaw9eZ3x/C5IkSeOFmU+SJEmSJEnqGoNPkiRJkiRJ6hqDT5IkSZIkSeoag0+SJEmSJEnqGoNPkiRJkiRJ6hqDT5IkSZIkSeoag0+SJEmSJEnqGoNPkiRJkiRJ6hqDT5IkSZIkSeoag0+SJEmSJEnqGoNPkiRJkiRJ6hqDT5IkSZIkSeoag0+SJEmSJEnqmkHd+9KSJEnqD4YdeVXqy649eJ3UV/XltuvL7SZJqouZT5IkSZIkSeoag0+SJEmSJEky+CRJkiRJkqT+x8wnSZIkSZIkdY0FxyVJkiR9oizULkl1MfNJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXWPwSZIkSZIkSV1j8EmSJEmSJEldY/BJkiRJkiRJXTOoe19akiRJktSbhh15VZ9t0GsPXmd8fwuS+igznyRJkiRJktQ1Bp8kSZIkSZLUNQafJEmSJEmS1DUGnyRJkiRJktQ1Bp8kSZIkSZLUNdUFn0499dQ099xzp8GDB6ell1463XXXXeP7W5IkSZIkSZpgDUoV+eUvf5n22muvdMYZZ+TA00knnZSGDRuWHnnkkTTTTDON729PkiRJktQFw468qs+267UHrzO+vwWp66rKfPr+97+ftt9++7TtttumoUOH5iDU5JNPnn7605+O729NkiRJkiRpglRN5tM777yT7r333nTggQc2Pzdw4MC0+uqrp9tvv328fm+SJEmSJPVFZo2pN1QTfHrxxRfT+++/n2aeeeaWz/Pnv/3tb6O9/+23384f4dVXX82/vvbaa732Pb331n9TX9WbP2c32Ha2m9db/7hfvVcnvHaD15zt5jXXP+5X79UJr93gNWe7ec31j/t1g+9em/qqS/cf1uv/DxqNxhjfN6AxtndMIJ5++uk0++yzp9tuuy0tu+yyzc/vt99+6eabb0533nlny/sPO+ywdPjhh4+H71SSJEmSJKn/ePLJJ9Mcc8zR4+vVZD7NMMMMaaKJJkrPPfdcy+f58yyzzDLa+9meR3Hy8MEHH6SXX345TT/99GnAgAGpryHaOOecc+b/4VNPPfX4/nb6DdvNtvOa6z+8X203r7f+wXvVdvOa6x+8V207r7n+47U+PN8nn+n1119Ps8022xjfV03waZJJJklLLLFEuuGGG9L666/fDCjx51122WW090866aT5ozRkyJDU13Eh9rWLsT+w3Ww7r7n+w/vVdvN66x+8V203r7n+wXvVtvOa6z+m7qPz/WmmmWas76km+AQymUaMGJGWXHLJtNRSS6WTTjopvfnmm/n0O0mSJEmSJPW+qoJPm266aXrhhRfSIYcckp599tm02GKLpWuuuWa0IuSSJEmSJEnqHVUFn8AWu07b7Po7tggeeuiho20VlO3mNde3eK/adl5z/YP3qm3nNdd/eL/abl5z/YP3at1tV81pd5IkSZIkSfrkDRwP/6YkSZIkSZIqYfBJkiRJkiRJXWPwSZIkSZIkSV1j8EkTJEuZ2XaSJKn/c0wnSRMGg0/9gJ3uh/Piiy+mAQMG2G4fEW33wQcffNS/LkmS9LHdfPPN+VfHdB+N8wdJfY3Bpz7qnHPOSQcddFD+vZ3uuOP4ydlmmy098cQTttuH9M1vfjMtv/zy+fcDBw40ACX1Yddee2166623xve30S8nY++///74/jZUkYsuuihddtll4/vb6HeOPfbYtPPOO6ef//zn+c+OhT/8s442kz4JxxxzTDrkkEMMeGqsDD71Qf/973/TH/7wh3TNNdek7373u/lzdrrjZsstt0wrrrhiWmmlldK///1v220cvffee7ndnn/++bT++uvnzxmAkvqmf/zjH2mttdZKe+yxR3r77bfH97fTrzzzzDNpookmyr//6U9/mv785z+P729JE/j1dvTRR6cf/ehHeUyncbfpppumeeedN9+n5557bv6cY+Fxc+edd6b77rsv/36HHXZIJ5xwgpfeh8wWe/zxx9Nzzz1nu42jySabLB111FHp+OOPNwD1IXxQ4U4Tg0990OSTT56+853v5GDAFVdckY488sj8eTvdsWOgQtbY0KFD0yqrrJKeeuop220cDBo0KG200Ubpe9/7XnrsscfSeuutlz9vAOqjdxymu49dtNEjjzySgwAPP/zwuFyu1fvMZz6TfvOb36Tzzz8/7bnnnul///tf9W0yNnfffXeeTMwxxxx5Urbvvvumb3/722nIkCG23Ye4V//zn/+kl156yTYbR7POOmsOPBEkPu2009KVV15p242Dd955J80zzzy57aaddtp0wQUXpPPOOy+/5li4Z4cffni644470oYbbpjHc1tvvXVuu9VXX93r7kNki5GpuNlmm6Vf/vKX6fXXX7ftxqHdWAw744wz0oEHHpiOO+649O6779pu4zB/GDhwZCjmJz/5SbrqqquqaDODT33wBiYLZZZZZknbbLNNWmCBBdKFF16YTjzxxPy6ne7YAwB//OMf06qrrpozn4YNG+YWvHFsu4knnjh/kPlE0HOLLbbInzcANeb7NToOBisEA9gOFfdqjSsaHwZt9Otf/zott9xyaYMNNkjLLrtsnmxozNcc19WXv/zldPHFF+esgCOOOCK9+eabNlsPlllmmbT77runqaaaKu244455YefHP/5xnqR96lOfMlA8jvfqpZdemtZZZ5205JJLpv333z/df//9XnNjwH3KFs+ll146l1F47bXX8vPtd7/7ne02lnabZJJJ8u//9Kc/5XuU4DHb8BgPx/XoAk+rNddcM49BeN4xDrnhhhvyn88888y06KKLNvsPjfk5x8LO5ptvnsfALMrSbwTbb3S0SbTLJptskrfeEYDiWecYeNzmD/vvv3867LDD8iIsCzwTOoNPfTQLhUnFfvvtl1dq/+///i+nzNLxwk53dHED02bcxNh+++2b28msATX2ttt7771zNgADZIIBBKDMgBq3egq0HantdLh77bVX2m677Zpta+fbue3icIBvfetbeYWWuh78fqeddsq1AzTme5YVMiZmZPKwPZssHmtAjY4gE1snbrvttjTDDDOk6aefPmeK0VZsidK4ueeee/IzjgwKnm8EAdhiEQWhNTr6B7Z4ErS75JJL0iuvvJK33pGdEosU6vx8A/3pVlttlZ9xBxxwQM6GOvnkk82A6uCBBx7Imf6XX355/jMBTnYAUAOVvuKuu+5qXpOOSXpGX8E2WfrU3XbbLU033XTphRdeyBlQBECdf3V+znHPspBIoJ2yAPS1tJ9b8Ho24P/PH77//e/nRUTuU8bAZHpO8Brqc+69997GFFNM0fjJT37S+L//+7/Gk08+2fjqV7/a+MIXvtA49thjm+/74IMPxuv32df89a9/bcwxxxyN3/zmN83P/fnPf26ssMIKjbnnnrvxxBNP5M/ZbqO7+eabGzPMMEP+FW+99Vbj3HPPze22/vrrN9/3/vvvfwL/J/uXf/zjH43VV1+98Ze//CVfYz/60Y8aCy64YGOTTTZpvsd2G90111zTOO644xq777574913321+/vTTT28MHDiwccwxx3xC/wf7n9/+9reNwYMHN0466aTGT3/608Zhhx3WmGSSSRrf/OY3G//73//G97fXp/z6179uzDfffLlfPeqooxo77bRT47bbbmvsvPPOjUknnbTxu9/9Lr+vvAY1+jPu+OOPbxx55JHNz915552NxRdfvLHBBhs0fv/739tkPaBPnXjiiXO/wHV31VVX5f5hrbXWalx77bW2W6Ecmz322GN5/HHZZZc1P/f444831lhjjcZiiy3WuPDCCzv+vVr95z//yePfbbbZpvGtb32rMfnkkzeef/75xn333df4zGc+k8cjd9111/j+Nvu8119/PT/XTjnllMZ///vf3JbLL798Y5ZZZmlMNNFEjcsvv3x8f4t90gMPPNCYaqqp8nPujTfeyPNW5quM5b773e86Bu7B22+/3dhqq61yG8Vz76KLLmqstNJKjW984xsTbN9q8KkPaO84ufDoLF555ZXm57iR6Txmm222POFQ64SeTuKf//xn7nAJOJXvYcA3zTTTND7/+c/nwYtGD4ZcffXVjRlnnLHx0ksvtXTCJ598cmPAgAGNrbfe2mbrgIn/Kqus0thss81yJ4I333yz8bOf/awxdOjQxqabbtrjfV779cegjmtr0UUXHW3iTwCK4MrBBx883r7HvuxrX/tay7WFSy65JAeg9thjjzz400gEhb/yla805p9//ny90Zfiueeea2y//fY5AFUO8L7zne80HnroIZvv/z+zmMDOPvvseUGMQHHp9ttvz/3qxhtv3Lj++uttsw4OP/zwxnLLLdfyuVtvvTUHRFkYi+Bn7coxyauvvtp49tlnG5/+9KebQab33nsv//rUU0/lhbKll1469xO1Y7wRGOsS6GQc/K9//avl88wpWMTm91h55ZUbp5122nj5nvsyxr30r4xLaMf11luv8cMf/jA/B9ddd90cKNDoY1r60M9+9rM5YaJ09NFH536Xa80Fns7zgC996Us5oP6rX/2qseqqqzZWW221xrbbbtuYd9558zhvQpw7GHzqA+LCYoWM1UQCAXQURJLLTvnRRx9tDBkypDHnnHPmjIGalTfjvvvu2/j617+eA1DcwHvttVfL66+99lpjmWWWyRF4OhKNcsQRR+RO4W9/+1se6P3yl78cbcWbiQedB+2qUcgwOfTQQ/O9ygSsFAGohRdeOGdFafT7lkAnK2NcW2ef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OjvpxGXdCQYtNR+/245VflawOd2OGii0GZMKrksKeFK3gxVvalNodLQV7VZiUMxkjdc6DehqnsyCySo1YljJDgSGyUohE4rMiaFDh+YT7VgFkj6K8vnORJZrjpR2nmtl3SICUHPOOWfemt1pW3HtaCsymmIRImoTga0UjFPg5HX0LShRL5HnGoGUGLOx8s/1yEKFR7N3RvCENiK7jowK6lCWr1HvqTzZuFbleIKMaxYMybSO/jWuRwJQlJtge2xZM0bqDSxOsMWT8hIs6JSn2pE5S+22su/Q2ANQzGPZ/u+4pB4DU5cNHDgw/f3vf0+HHHJI/vPFF1+cFllkkfTYY4/lP88+++xpyJAhaeWVV05//OMf0+9+97u00EIL5dcIjq211lrpc5/7XKrRfffdl7bYYot04oknpr322ivtuOOOaeKJJ04DBgzIry+++OLpD3/4Q5p//vnTjTfemGaYYYZmu9GmvI/fx/trdf3116df/epX6be//W064ogj0ogRI9K///3vtOKKK+b2HDx4cNpjjz3SQQcdlK699trcZhop2oI2ev7559Nbb73VbJpll102rbHGGumXv/xleu2110ZrsokmmqjqZnz55Zfzvcf9y3WFZZZZJn3/+99PF154YVp11VXTSy+9lB5//PHq71F9NB988EHLtfPMM8/kj4cffji9/fbbaZJJJknvvvtufm3jjTfO196PfvSj/ExU63OOtppuuunSlVdemT836aST5jbEkksumd55553mmEYpX3c333xz2mabbdL++++f7r333nTRRRflMdztt9+em2irrbZKX/va19IjjzySjjvuuOa1WOu92smcc86Z/ve//6Wdd945HXDAAekb3/hG/jyfO+OMM9IUU0yRZplllk/4u+1baIsYT/B8W2655dK3v/3t9Prrr6dHH300f/7/L6anmWeeOW2//fZp7bXXzn2w4zn1hriOpppqqnTuueempZZaKq233nq5P+VZyLONecZDDz1kg38I8847bzr++OPTSiut1Jz7qwLdjGyRisiJa2xxYpWC6OZEE03UPMkjttKR/USNJ1YrNAq1YciSmGWWWRpTTz11MyOszCJja2J5ZLtZTqOjzg71J3DhhRfm1cXTTjst/5ktZHGaHddjzdli7VtiS2wDoDjg1Vdf3dI2rPSQLeBpT61bUGKVlm0oZDiRiULh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9NFHp2WWWSYdccQR6YADDkirr756+t3vfpc+85nP5Paba6650s9//vM044wzpprRFtF2Z555ZnryySfznw866KC06KKLpq997Wvp0EMPTU899VS68sor00QTTZROPPHE9Nxzz+XrbsCAAflr8GuNHnzwwbTCCiuk9dZbr/m5m2++Of3xj3/M19uXv/zltMEGG6Qddtght+tOO+2Ur71dd911vH7ffcl7772Xr68555wzvfvuu+moo45KN9xwQ/rLX/6SJp100nTRRRelBRdcMG288cbphBNOSPPMM8/4/pY1AeBZNv3006ff/OY3aeutt07HH3982n777fPz7Iorrkj//ve/0y677JKmnHLK5t8ZNKjXuvh+gec6P/O//vWvNOusszY/R5tdfvnl+d7kddrxmmuuSRtttFEek5x77rlppplmSrWLvvEf//hH/j1tNffcc6dDDjkk/f73v8/jPMYnPAPff//9dPjhh6frrrsu3XjjjfnZVyPaa6mllsr9JmNg2uHxxx9vXn9vvvlmbkfGfXzw+2mmmSY99thjabbZZhvf336fw1yBfpWxMeNinnM77rhjfu3Pf/5z/jx96vzzz9/ybJTGFdfR+eefn5/95513XnrnnXear8X8Iiy00EK5nx08eHBaYoklbGSpFwwgAtUbX+jSSy/NwZFLLrkkPfroozl4suaaa6Yf/ehH+fW33347d8rPPvtsmnjiifPgr/bAEwO5n/zkJ+nHP/5xnqTuueee+fN33313Ovjgg9Pf//73PKltn7yWX6Mm5c9NsOmUU05Jyy+/fLrjjjvSZz/72fSLX/wi/8rnf/vb3+YB8dJLL52vtYsvvjhfdwyYax6o7LXXXnkSxuQCTCRovxdffDEHme6///60ySab5IDdf/7zn3TLLbekddddt+o262S77bbLzzyuR4J5q666atptt93SsssumwNPBEalj6Kn5/upp56a+wX6UvoLJrpg8YJ7loExk7Wa8XxnIkEQjrHGV7/61fS3v/0t/exnP0urrbZavk9Z5Nlss83StNNOm66//vr8915//fU01VRTje9vv0/41a9+lfsJAkyf/vSncxt+85vfTH/961/T8OHD02uvvZaDJrQfk7irr746ff7zn0+1op0iyEtQmKAmAbt77rknLx7SXkOGDMn3Nb/HWmutlc4555z8+1rHJOVzrmwDFq653q666qq86EWwCW+99VZ+zhEEuPDCC6scA6t38LznPmXM9sUvfjFfe0yFCTSB+5V+hPfxK8837tlaA+xSnw0+fe9738uBJz4Y3A0bNiydfvrpuYNgtZFVs5NPPjkHAJTS/vvvnx9+Sy65ZJ78M7BjFZHJRQSgyOCh3Vwha0UWExMvVmMXWWSR9PLLL+eJBZcy19+8886bJ2hkRZFdxyojq5PlILHWFe3bb789ryLSFvz5jTfeSPvss08OMDFgPvLII9P3v//9nCE1++yzN/9+rW0X7UZ7PPHEE3mljEEIbUE2BavaZE9MNtlkeQCz5ZZb5gnHYYcdVm12nT66MiuTbCYQFFlllVXy78keJshOAJnAAO/ffffdc/CYfqS2ezQmsGRKxNjilVdead6XTPYJzjGBXXnlldMcc8yR30PmNX0s2Z61tdmYrrunn346rbTSSunAAw/MwaU//OEP6de//nVeGIvFMfoHJmUEoFhkrDWz8+GHH05Dhw7Nv2esu8466+QFHMYmLChy/dE+XF+TTz55ft///ve//HuCeF53I7HQxfiXa5DxxyyzzJLvS65Bnn1klDHpJyj6zDPPpD/96U/NTDIDUPoofQTPOZ5fv/zlL/NY7ZFHHsk7JxjHsWjBr9EPc62RWLHwwgvb2FJvGdf9eVEP5n//+1/H1zkZYIUVVsj7szndqfw77KWlpgIn36nR+M1vfpPbKYo9U8TzuOOOy8XGOd0jUDdmzz33rH4/O8eexnV30kkn5dOcqH3FiROBa2vhhRduLLLIIh2LO9da64kTJQNFYalrcs011zT233//XM+JI5/LujDUQKFem4VQR6E+FvVOFl100XyCESeMtRf+f+655xoHH3xwY7rppuuxALk0rqiLSNF/auxQfJdT7sJXvvKVfGIWNRWpcbfiiis2i6TWWPuE4uIUFgc1OTgIgNPXqM3Gffnaa6+N9ndGjBiRa37UVhMrxNisPCWMZxrtSL2seP3JJ5/MJ91xiuJ3v/vd8fb99sWi2Isttliu+8cYjcL/jIHDdtttlw+aiJMoO6n12isde+yxjWmmmSa319xzz50/qEsJxikUe6a/XX311fM9G21W43NOvdNHUId48sknbzzxxBO5ViIHZDFvoC5sKIuOx2nQksZTwXFO89h4440bN95442ivMcDbY489cmCAwuJxShtFUilc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qYmZT0RElOaVKlVKpkyZoidqaLK7ceNGvR+BJ5zARUVFSevWrWX79u2xZnti4ImIvJU98HThwgXp16+ftGzZUk6cOKFZnB06dJCjR4/KwIEDdTbPzZs3S0hIiERHR2sGFPZvyI4iIiLyBsx8IiKiezoDCr1SEHjCCVtkZKQGpIiIvBkmREA/OwTJUTZcv359zXZq1KiRZMmSRVasWCEFChSQZcuWydKlSzWrs2TJklpqjPJjBNiDgoI0MPXss8+m9p9DRETE4BMREd2bAShkDaAB73vvvafNxXfu3KmBJ5baEZE3+/DDDzVohFK63377TYPpyOxs3ry57ssaNGggfn5+OuMdAlBw+PBhzXRCRhT2fSjFQ1Bq/fr18sADD6T2n0RERMSyOyIiundL8NDfiYEnIkpLgafu3bvLtGnTJCIiQmbPni3nz5+X5cuXaxYUAkm4H2V4Zv8GmPkOTcgx62fnzp315xYvXszAExEReQ32fCIionsyADVhwgTp0aOH7Nq1ixlPROT11q1bJy+//LIMGjRIWrVqpffVrVtXs5zQSPzixYty+fJlDSh99913OqECSosxI55934eG5Ci9q1y5cir+NURERLGx5xMREd3zWGpHRGmhZBgz2OXKlUt71lWpUkVatGgh4eHh0rBhQ20knjNnTnn00UddwSkE2WfMmCE+Pj6u2fGQIYWeT0RERN6EwSciIiIiIi/qWYdgUkxMjFy6dEk+/vhjKVOmjGYzoQfUmDFj5Ny5c/Lcc89pTzu4ceOG/gwREZG3YvCJiIiIiMiLAlDdunWTLVu2yMyZM3W2TjsEpXbs2KGz4DHgREREaQWDT0REREREXuTQoUPaeBzlc5j5DoGm+EqImfFERERpBYNPREREREReWoIHgwcP1ubiREREaRW7ERIREREReRnMXDdlyhQtrevVq5fO3ElERJRWMfhEREREROSlAahx48ZJ7dq1JTAwMLVfDhER0V1j2R0RERERURpw8+ZN7QNFRESU1jD4REREREREREREHsNLJ0RERERERERE5DEMPhERERERERERkccw+ERERERERERERB7D4BMREREREREREXkMg09EREREREREROQxDD4REREREREREZHHMPhEREREjvbSSy9J1qxZPfb869atk3Tp0unXu/3ZxYsXe+S1EREREaUEBp+IiIgoxSxcuFCD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aN68uZbdIRCEUrrp06ff8WeQ7YOZ3DAzIBp8305i1pd7tpb9vUFmFhp8365Je5EiRfTrwYMHY2Uq/fXXX3GyvrDs/v374zwHyg/tz3UnaOyO4Bfe40ceeUQbmCe0ETsRERElHcvuiIiIKMVhJjnThwfZNfbMJwSeHn74YQkLC9PeQ/Z+P5gZDhlDb731VpwMIfwfAQx7VpF9GXw/efLkW74mlNqh1xNmkEPgBrO9eRMEhaZMmSIzZszQ7KQ7adWqlWb5YHZA9M5yh5K8QYMGJXp9ISMKzp07F6e3EjKoMOOcO/R4Msujp1b69OnjBNAwK547BB7xPthfP7aJmTNnStGiRaVcuXKSEPh97dq105JKzMaH9WJmUyQiIiLPY+YTERERpTgEehDk2bBhgwabkO1kh2DUhAkT9Ht78AnZNW+//bZm8qDhNDKCkAl05MgRWbZsmTai7tu3r5aNYVl8j+AW+h8tWbIk3n5KdsjYCQ8P115AwcHBsn79egkMDLzj3/Puu+9KlixZYt2Hkq6BAwdKcurRo4c2EkfQCM29b/f8vr6+GkyrX7++1K5dW4NDyErC/Xv37tUeSOixhOBUYtaXea969uypDdoRuGrbtq32h3rllVdk1KhRsmPHDs3Uwu9CLyiUvCGQhYBY/vz55bXXXtP3t2nTppqVhKbzyDbLkydPrMyqAQMGaPYW3gv8PvSFQnYW3m+8vsSUzZngHRqfjxkzJtHrnoiIiJLAgzPpEREREd3SG2+8gTQbq0aNGnEeW7p0qT6WLVs26/r163EeX7JkiVWrVi3Lz89Pb2XKlLG6d+9u7d+/37XMvn37rPr161tZs2a18uTJY3Xp0sXauXOnPu/HH3/sWu7FF1/U57CLioqyypUrZ/n7+1sHDhy45d8wdOhQfb74bj4+PrrM2rVr9f/4atSpU8cqX758nOfDaylSpIjr/+ZnFy1aFGu5fv366f1Tp0617iQ6Otp68803rQoVKlhZsmSxMmXKZAUGBur6P3XqVKLXF96PkJAQK2/evFa6dOn0cbuZM2daQUFBVubMmfX9w+/F6z158mSs5xgyZIiuXyxXr149KzIy0sqdO7f16quvxnq+Q4cOWa1atbJy5sypr71atWpWeHh4rGVutZ7cYZ3fd9991vHjx++43oiIiCj5pMM/SQleERERERElFcrykImFzDZTDpjcMJshsqfWrFnjkecnIiKi+LHnExERERGlqMuXL8e5b9KkSfrVU43et27dquWA9obqRERElDKY+UREREREKQpNv3FDQ/GsWbPqrIfo7YQ+UatXr07W37Vnzx7Ztm2b9piKioqSw4cPa7N7IiIiSjlsOE5EREREKQozzWEGurFjx2oDddOEHCV3yW3x4sUyfPhwCQgI0AAXA09EREQpj5lPRERERERERETkMez5REREREREREREHsPgExEREREREREReQyDT0RERERERERE5DEMPhERERERERERkccw+ERERERERERERB7D4BMREREREREREXkMg09EREREREREROQxDD4REREREREREZHHMPhERERERERERETiKf8HJV/K44iOnZ8AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "weaklink_categories = [\n", " \"ExcessiveForwardLean\",\n", " \"ForwardHead\",\n", " \"LeftArmFallForward\",\n", " \"LeftAsymmetricalWeightShift\",\n", " \"LeftHeelRises\",\n", " \"LeftKneeMovesInward\",\n", " \"LeftKneeMovesOutward\",\n", " \"LeftShoulderElevation\",\n", " \"RightArmFallForward\",\n", " \"RightAsymmetricalWeightShift\",\n", " \"RightHeelRises\",\n", " \"RightKneeMovesInward\",\n", " \"RightKneeMovesOutward\",\n", " \"RightShoulderElevation\"\n", "]\n", "\n", "# For each row, find the column name with the maximum score\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": "markdown", "id": "5f9354f4-8dd7-4087-96c3-06d34e82e66d", "metadata": {}, "source": [ "#### Merge datasets" ] }, { "cell_type": "code", "execution_count": 27, "id": "e0b7b5a8-9e24-43f6-a445-cd42a68c4b92", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Merged dataset: (2094, 44)\n" ] } ], "source": [ "target_df = weaklink_scores_df[['ID', 'WeakestLink']].copy()\n", "merged_df = movement_features_df.merge(target_df, on='ID', how='inner')\n", "\n", "print(f\"Merged dataset: {merged_df.shape}\")" ] }, { "cell_type": "markdown", "id": "92098dca-dae7-4d12-8fe2-31d9a2dbd3df", "metadata": {}, "source": [ "#### Body regions " ] }, { "cell_type": "code", "execution_count": 28, "id": "124141b7-431f-4bbd-858d-0d40bc60c0bc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Body region distribution:\n", "BodyRegion\n", "Upper Body 1484\n", "Lower Body 610\n", "Name: count, dtype: int64\n" ] } ], "source": [ "# Define the groups as mentioned in Slide 6 into 2 distinct regions\n", "upper_body_classes = [\n", " \"ForwardHead\",\n", " \"LeftArmFallForward\",\n", " \"RightArmFallForward\",\n", " \"LeftShoulderElevation\",\n", " \"RightShoulderElevation\"\n", "]\n", "\n", "lower_body_classes = [\n", " \"ExcessiveForwardLean\",\n", " \"LeftAsymmetricalWeightShift\",\n", " \"RightAsymmetricalWeightShift\",\n", " \"LeftKneeMovesInward\",\n", " \"RightKneeMovesInward\",\n", " \"LeftKneeMovesOutward\",\n", " \"RightKneeMovesOutward\",\n", " \"LeftHeelRises\",\n", " \"RightHeelRises\"\n", "]\n", "def get_region(label):\n", " if label in upper_body_classes:\n", " return \"Upper Body\"\n", " else:\n", " return \"Lower Body\"\n", "\n", "merged_df['BodyRegion'] = merged_df['WeakestLink'].apply(get_region)\n", "\n", "print(f\"\\nBody region distribution:\")\n", "print(merged_df['BodyRegion'].value_counts())" ] }, { "cell_type": "markdown", "id": "9b103ab6-dd2a-4945-a7bb-2aac325f7424", "metadata": {}, "source": [ "#### Prepare features" ] }, { "cell_type": "code", "execution_count": 29, "id": "13068de8-4cac-42b6-95db-935a554d8469", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Features shape: (2094, 41)\n", "Number of features: 41\n", "14-class target: 14 classes\n", "Region target: 2 classes\n" ] } ], "source": [ "# Exclude non-features\n", "exclude_from_X = ['ID', 'WeakestLink', 'EstimatedScore', 'BodyRegion']\n", "feature_columns = [col for col in merged_df.columns if col not in exclude_from_X]\n", "\n", "X = merged_df[feature_columns].values\n", "y_14class = merged_df['WeakestLink'].values # For predicting specific weak link\n", "y_region = merged_df['BodyRegion'].values # For predicting 2 body region\n", "\n", "print(f\"Features shape: {X.shape}\")\n", "print(f\"Number of features: {len(feature_columns)}\")\n", "print(f\"14-class target: {len(np.unique(y_14class))} classes\")\n", "print(f\"Region target: {len(np.unique(y_region))} classes\")" ] }, { "cell_type": "markdown", "id": "54b65680-f28b-4e37-a79b-927d8dd3db64", "metadata": {}, "source": [ "#### Train/test split" ] }, { "cell_type": "code", "execution_count": 30, "id": "2ca48980-f52f-48ef-8068-76327682881c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Training set: 1675 samples\n", "Test set: 419 samples\n" ] } ], "source": [ "# Same random split for all X, y_14class and y_Region\n", "X_train, X_test, y_train_14, y_test_14, y_train_region, y_test_region = train_test_split(\n", " X, y_14class, y_region, test_size=0.2, random_state=RANDOM_STATE, stratify=y_region\n", ")\n", "\n", "# Scaling\n", "scaler = StandardScaler()\n", "X_train_scaled = scaler.fit_transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)\n", "\n", "print(f\"\\nTraining set: {X_train.shape[0]} samples\")\n", "print(f\"Test set: {X_test.shape[0]} samples\")" ] }, { "cell_type": "markdown", "id": "c324acc3-769f-44fb-9d4c-8a5fcd4f455e", "metadata": {}, "source": [ "#### Cross validation setup" ] }, { "cell_type": "code", "execution_count": 31, "id": "e777809d-c0ba-4c0f-b2ee-b1a1f39fc9c7", "metadata": {}, "outputs": [], "source": [ "# Body region (upper and lower) with cross validation\n", "\n", "cv_strategy = StratifiedKFold(n_splits=N_SPLITS, shuffle=True, random_state=RANDOM_STATE)\n", "def evaluate_classification_cv(model, X, y, cv, model_name=\"Model\"):\n", " scoring = {\n", " 'accuracy': 'accuracy',\n", " 'precision': 'precision_weighted',\n", " 'recall': 'recall_weighted',\n", " 'f1': 'f1_weighted'\n", " }\n", " \n", " cv_results = cross_validate(model, X, y, cv=cv, scoring=scoring)\n", " return {\n", " 'Model': model_name,\n", " 'Accuracy_mean': cv_results['test_accuracy'].mean(),\n", " 'Accuracy_std': cv_results['test_accuracy'].std(),\n", " 'Precision_mean': cv_results['test_precision'].mean(),\n", " 'Precision_std': cv_results['test_precision'].std(),\n", " 'Recall_mean': cv_results['test_recall'].mean(),\n", " 'Recall_std': cv_results['test_recall'].std(),\n", " 'F1_mean': cv_results['test_f1'].mean(),\n", " 'F1_std': cv_results['test_f1'].std()\n", " }, cv_results['test_f1']\n" ] }, { "cell_type": "code", "execution_count": 32, "id": "621f9c9d-0106-43c9-939e-ce232b33cd0b", "metadata": {}, "outputs": [], "source": [ "# Define models for region classification\n", "models_region = {\n", " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=RANDOM_STATE, 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", "results_region = []\n", "f1_scores_region_dict = {}\n", "\n", "for name, model in models_region.items():\n", " result, f1_scores = evaluate_classification_cv(model, X_train_scaled, y_train_region, cv_strategy, name)\n", " results_region.append(result)\n", " f1_scores_region_dict[name] = f1_scores\n", "\n", "results_region_df = pd.DataFrame(results_region).sort_values('F1_mean', ascending=False)" ] }, { "cell_type": "code", "execution_count": 33, "id": "d7362e1e-9e03-4330-b6bf-ce7ffa1128ef", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Body region (upper and lower) results of 5-FOLD CV\n", "\n", "\n", " Model Accuracy_mean Accuracy_std F1_mean F1_std\n", " KNN (k=7) 0.854925 0.010096 0.848728 0.009112\n", " KNN (k=10) 0.847761 0.012089 0.842864 0.011621\n", " KNN (k=5) 0.846567 0.011264 0.841796 0.009819\n", " LDA 0.845970 0.022065 0.841575 0.022885\n", "Logistic Regression 0.826866 0.023656 0.831218 0.022478\n", " Naive Bayes 0.786866 0.008142 0.786612 0.008865\n", " QDA 0.592239 0.104172 0.593148 0.117567\n", "\n", "Champion (Stage 1): KNN (k=7)\n", "F1-Score: 0.8487 +/- 0.0091\n" ] } ], "source": [ "print(\"Body region (upper and lower) results of 5-FOLD CV\")\n", "print(\"\\n\")\n", "print(results_region_df[['Model', 'Accuracy_mean', 'Accuracy_std', 'F1_mean', 'F1_std']].to_string(index=False))\n", "\n", "champion_region = results_region_df.iloc[0]['Model']\n", "champion_region_f1 = results_region_df.iloc[0]['F1_mean']\n", "\n", "print(f\"\\nChampion (Stage 1): {champion_region}\")\n", "print(f\"F1-Score: {champion_region_f1:.4f} +/- {results_region_df.iloc[0]['F1_std']:.4f}\")" ] }, { "cell_type": "code", "execution_count": 34, "id": "61bb327b-61c9-4fd2-8c1a-100c63b38416", "metadata": {}, "outputs": [], "source": [ "# 14 weak link categories classification with cross validation\n", "models_14class = {\n", " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=RANDOM_STATE, class_weight='balanced'),\n", " 'Naive Bayes': GaussianNB(),\n", " 'LDA': LinearDiscriminantAnalysis(),\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", "results_14class = []\n", "f1_scores_14class_dict = {}\n", "\n", "for name, model in models_14class.items():\n", " try:\n", " result, f1_scores = evaluate_classification_cv(model, X_train_scaled, y_train_14, cv_strategy, name)\n", " results_14class.append(result)\n", " f1_scores_14class_dict[name] = f1_scores\n", " except Exception as e:\n", " print(f\"failed: {e}\")\n", "\n", "results_14class_df = pd.DataFrame(results_14class).sort_values('F1_mean', ascending=False)" ] }, { "cell_type": "code", "execution_count": 35, "id": "04276bda-c2e8-42d3-971d-ce2acbfceb37", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "14 weak link categories with 5 -fold cross validation\n", "\n", "\n", " Model Accuracy_mean Accuracy_std F1_mean F1_std\n", " LDA 0.576716 0.023076 0.575048 0.020004\n", "Logistic Regression 0.531343 0.022812 0.543853 0.019283\n", " KNN (k=10) 0.564179 0.011940 0.543014 0.011788\n", " KNN (k=7) 0.548060 0.016631 0.533035 0.019749\n", " KNN (k=5) 0.536119 0.016631 0.523832 0.018366\n", " Naive Bayes 0.470448 0.019123 0.484504 0.013492\n", "\n", "Champion (Single Model): LDA\n", "F1-Score: 0.5750 +/- 0.0200\n" ] } ], "source": [ "print(\"14 weak link categories with 5 -fold cross validation\")\n", "print(\"\\n\")\n", "print(results_14class_df[['Model', 'Accuracy_mean', 'Accuracy_std', 'F1_mean', 'F1_std']].to_string(index=False))\n", "\n", "champion_14class = results_14class_df.iloc[0]['Model']\n", "champion_14class_f1 = results_14class_df.iloc[0]['F1_mean']\n", "\n", "print(f\"\\nChampion (Single Model): {champion_14class}\")\n", "print(f\"F1-Score: {champion_14class_f1:.4f} +/- {results_14class_df.iloc[0]['F1_std']:.4f}\")" ] }, { "cell_type": "markdown", "id": "97227c27-c686-420e-aea5-1426341a7328", "metadata": {}, "source": [ "### Improvements (as per A3 comments)" ] }, { "cell_type": "markdown", "id": "74f7108a-b588-4af6-81f5-c22f9de576da", "metadata": {}, "source": [ "### Predicting specific region and then train on specific region" ] }, { "cell_type": "code", "execution_count": 36, "id": "1168c973-a0ca-40ed-b764-f9b721be961c", "metadata": {}, "outputs": [], "source": [ "def evaluate_hierarchical_pipeline_cv(X, y_14class, y_region, cv, \n", " stage1_model_class, stage2_model_class):\n", " f1_scores = []\n", " \n", " for train_idx, test_idx in cv.split(X, y_region):\n", " # Split data\n", " X_train_fold = X[train_idx]\n", " X_test_fold = X[test_idx]\n", " y_train_14_fold = y_14class[train_idx]\n", " y_test_14_fold = y_14class[test_idx]\n", " y_train_region_fold = y_region[train_idx]\n", " \n", " # Stage 1: Train region classifier\n", " stage1 = stage1_model_class()\n", " stage1.fit(X_train_fold, y_train_region_fold)\n", " \n", " # Stage 2a: Train upper body \n", " upper_mask = y_train_region_fold == \"Upper Body\"\n", " X_train_upper = X_train_fold[upper_mask]\n", " y_train_upper = y_train_14_fold[upper_mask]\n", " \n", " stage2a = stage2_model_class()\n", " stage2a.fit(X_train_upper, y_train_upper)\n", " \n", " # Stage 2b: Train lower body \n", " lower_mask = y_train_region_fold == \"Lower Body\"\n", " X_train_lower = X_train_fold[lower_mask]\n", " y_train_lower = y_train_14_fold[lower_mask]\n", " \n", " stage2b = stage2_model_class()\n", " stage2b.fit(X_train_lower, y_train_lower)\n", " \n", " # Predict on test fold\n", " y_pred = []\n", " for i in range(len(X_test_fold)):\n", " x_sample = X_test_fold[i].reshape(1, -1)\n", " \n", " # Stage 1: Predict region\n", " region = stage1.predict(x_sample)[0]\n", " \n", " # Stage 2: Predict specific weak link\n", " if region == \"Upper Body\":\n", " weak_link = stage2a.predict(x_sample)[0]\n", " else:\n", " weak_link = stage2b.predict(x_sample)[0]\n", " \n", " y_pred.append(weak_link)\n", " \n", " # Compute F1-score\n", " f1 = f1_score(y_test_14_fold, y_pred, average='weighted', zero_division=0)\n", " f1_scores.append(f1)\n", " \n", " return np.array(f1_scores)" ] }, { "cell_type": "code", "execution_count": null, "id": "06933c9e-0992-468c-a1a7-ea7dc42087a8", "metadata": {}, "outputs": [], "source": [ "# Use best models from previous evaluations\n", "stage1_model = lambda: KNeighborsClassifier(n_neighbors=7) # Best region classifier\n", "stage2_model = lambda: LinearDiscriminantAnalysis()\n", "\n", "pipeline_f1_scores = evaluate_hierarchical_pipeline_cv(\n", " X_train_scaled, y_train_14, y_train_region, cv_strategy,\n", " stage1_model, stage2_model\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "cb653084-cc96-42ce-958f-bfdcc0de4b7c", "metadata": {}, "outputs": [], "source": [ "print(\"Comparison of Pipeline vs single model\")\n", "\n", "print(f\"\\nSingle Model ({champion_14class}):\")\n", "print(f\"F1-Score: {champion_14class_f1:.4f} +/- {results_14class_df.iloc[0]['F1_std']:.4f}\")\n", "\n", "print(f\"\\nHierarchical Pipeline:\")\n", "print(f\"F1-Score: {pipeline_f1_scores.mean():.4f} +/- {pipeline_f1_scores.std():.4f}\")\n", "\n", "improvement = pipeline_f1_scores.mean() - champion_14class_f1\n", "print(f\"\\nDifference: {improvement:+.4f} ({100*improvement/champion_14class_f1:+.2f}%)\")" ] }, { "cell_type": "markdown", "id": "d284b4e6-8596-4806-847b-84db5f41d1dd", "metadata": {}, "source": [ "### Statistical test" ] }, { "cell_type": "code", "execution_count": null, "id": "47af57a8-ef5a-4ef9-a09c-c723acec2384", "metadata": {}, "outputs": [], "source": [ "def corrected_resampled_ttest(scores_a, scores_b, n_train, n_test):\n", " k = len(scores_a)\n", " differences = scores_a - scores_b\n", " d_bar = differences.mean()\n", " s_squared = differences.var(ddof=1)\n", " var_corrected = (1/k + n_test/n_train) * s_squared\n", " t_stat = d_bar / np.sqrt(var_corrected)\n", " df = k - 1\n", " p_value = 2 * (1 - stats.t.cdf(abs(t_stat), df))\n", " return t_stat, p_value\n", "\n", "n_total = len(X_train_scaled)\n", "n_test_fold = n_total // N_SPLITS\n", "n_train_fold = n_total - n_test_fold\n", "\n", "champion_14class_scores = f1_scores_14class_dict[champion_14class]\n", "t_stat, p_value = corrected_resampled_ttest(pipeline_f1_scores, champion_14class_scores, n_train_fold, n_test_fold)\n", "\n", "print(f\"\\nStatistical Test (Corrected Resampled t-test):\")\n", "print(f\"t-statistic: {t_stat:.3f}\")\n", "print(f\"p-value: {p_value:.4f}\")\n", "if p_value < 0.05:\n", " print(f\" Result: Statistically SIGNIFICANT difference\")\n", "else:\n", " print(f\"Result: NOT statistically significant\")\n", "\n", "## - 54.47% chance this difference occurred by random chance\n", "# Cannot reject null hypothesis (no significant difference)\n", "# Pipeline is NOT reliably better than single LDA\n", "\n", "# determine if there is a significant difference between the means (averages) of two groups, or between one group and a known standard value. \n", " #It calculates a \n", "# statistic to assess whether observed differences between sample averages are likely due to real effects or just random chance" ] }, { "cell_type": "markdown", "id": "281ae294-b939-41af-bdda-030e77aefe08", "metadata": {}, "source": [ "### Visualization" ] }, { "cell_type": "code", "execution_count": null, "id": "b254832b-4cb3-4541-bd5e-4f47d42fb2ef", "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(8, 6))\n", "\n", "models = [f'Single Model\\n({champion_14class})', 'Hierarchical\\nPipeline']\n", "means = [champion_14class_f1, pipeline_f1_scores.mean()]\n", "stds = [results_14class_df.iloc[0]['F1_std'], pipeline_f1_scores.std()]\n", "\n", "bars = ax.bar(models, means, yerr=stds, capsize=10, \n", " color=['lightcoral', 'lightblue'], edgecolor='black', linewidth=2)\n", "ax.set_ylabel('F1-Score (weighted)', fontsize=12, fontweight='bold')\n", "ax.set_title('Hierarchical Pipeline vs Single Model\\n14-Class Weak Link Classification',\n", " fontsize=14, fontweight='bold')\n", "ax.grid(axis='y', alpha=0.3)\n", "ax.set_ylim([0, 1])\n", "\n", "# Add value labels on bars\n", "for i, (bar, mean, std) in enumerate(zip(bars, means, stds)):\n", " height = bar.get_height()\n", " ax.text(bar.get_x() + bar.get_width()/2., height + std + 0.02,\n", " f'{mean:.4f}+/-{std:.4f}',\n", " ha='center', va='bottom', fontsize=11, fontweight='bold')\n", "\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "4eb142dc-1e25-4249-9264-b2afa1d104e7", "metadata": {}, "outputs": [], "source": [ "print(\"Final moodel training\")\n", "\n", "if pipeline_f1_scores.mean() > champion_14class_f1 and p_value < 0.05:\n", " print(\"\\nTraining the pipeline model on full training set\")\n", " \n", " # Train Stage 1\n", " final_stage1 = KNeighborsClassifier(n_neighbors=7)\n", " final_stage1.fit(X_train_scaled, y_train_region)\n", " \n", " # Train Stage 2a (Upper region)\n", " upper_mask_train = y_train_region == \"Upper Body\"\n", " final_stage2a = LogisticRegression(max_iter=1000, random_state=RANDOM_STATE, class_weight='balanced')\n", " final_stage2a.fit(X_train_scaled[upper_mask_train], y_train_14[upper_mask_train])\n", " \n", " # Train Stage 2b (Lower region)\n", " lower_mask_train = y_train_region == \"Lower Body\"\n", " final_stage2b = LogisticRegression(max_iter=1000, random_state=RANDOM_STATE, class_weight='balanced')\n", " final_stage2b.fit(X_train_scaled[lower_mask_train], y_train_14[lower_mask_train])\n", " \n", " # Test set evaluation\n", " y_pred_test = []\n", " for i in range(len(X_test_scaled)):\n", " x_sample = X_test_scaled[i].reshape(1, -1)\n", " region = final_stage1.predict(x_sample)[0]\n", " if region == \"Upper Body\":\n", " weak_link = final_stage2a.predict(x_sample)[0]\n", " else:\n", " weak_link = final_stage2b.predict(x_sample)[0]\n", " y_pred_test.append(weak_link)\n", " \n", " test_f1 = f1_score(y_test_14, y_pred_test, average='weighted')\n", " test_acc = accuracy_score(y_test_14, y_pred_test)\n", " \n", " print(f\"\\nTest Set Performance (Hierarchical Pipeline):\")\n", " print(f\"Accuracy: {test_acc:.4f}\")\n", " print(f\"F1-Score: {test_f1:.4f}\")\n", " \n", " # Save pipeline\n", " final_model = {\n", " 'type': 'hierarchical_pipeline',\n", " 'stage1': final_stage1,\n", " 'stage2a': final_stage2a,\n", " 'stage2b': final_stage2b,\n", " 'scaler': scaler,\n", " 'feature_columns': feature_columns,\n", " 'upper_classes': upper_body_classes,\n", " 'lower_classes': lower_body_classes\n", " }\n", " \n", "else:\n", " print(f\"\\nTraining the single model ({champion_14class}) on full training set\")\n", " \n", " # Train single model\n", " if champion_14class == 'Logistic Regression':\n", " final_model_obj = LogisticRegression(max_iter=1000, random_state=RANDOM_STATE, class_weight='balanced')\n", " elif champion_14class == 'LDA':\n", " final_model_obj = LinearDiscriminantAnalysis()\n", " elif 'KNN' in champion_14class:\n", " k = int(champion_14class.split('k=')[1].rstrip(')'))\n", " final_model_obj = KNeighborsClassifier(n_neighbors=k)\n", " else:\n", " final_model_obj = GaussianNB()\n", " \n", " final_model_obj.fit(X_train_scaled, y_train_14)\n", " \n", " # Test set evaluation\n", " y_pred_test = final_model_obj.predict(X_test_scaled)\n", " test_f1 = f1_score(y_test_14, y_pred_test, average='weighted')\n", " test_acc = accuracy_score(y_test_14, y_pred_test)\n", " \n", " print(f\"\\nTest Set Performance ({champion_14class}):\")\n", " print(f\"Accuracy: {test_acc:.4f}\")\n", " print(f\"F1-Score: {test_f1:.4f}\")\n", " \n", " final_model = {\n", " 'type': 'single_model',\n", " 'model': final_model_obj,\n", " 'scaler': scaler,\n", " 'feature_columns': feature_columns\n", " }" ] }, { "cell_type": "markdown", "id": "898490a6-59e2-4c42-bc98-943d9ac1c6c0", "metadata": {}, "source": [ "### Classification report" ] }, { "cell_type": "code", "execution_count": null, "id": "b4c216b2-4af1-4e75-b5f4-67571a7cbc2a", "metadata": {}, "outputs": [], "source": [ "print(\"\\nClassification Report:\")\n", "print(classification_report(y_test_14, y_pred_test, zero_division=0))" ] }, { "cell_type": "markdown", "id": "d8004001-9372-4c40-85e7-179f80ce6a7a", "metadata": {}, "source": [ "### Class imbalance analysis - Using Random forest\n" ] }, { "cell_type": "code", "execution_count": null, "id": "caa895a5-ed03-43a3-97e2-b12143ae1528", "metadata": {}, "outputs": [], "source": [ "\n", "# Train Random Forest\n", "rf_model = RandomForestClassifier(\n", " n_estimators=200, # 200 decision trees\n", " max_depth=15, # Max tree depth\n", " min_samples_split=5, \n", " min_samples_leaf=2, \n", " class_weight='balanced', \n", " random_state=RANDOM_STATE,\n", " n_jobs=-1 \n", ")\n", "\n", "rf_model.fit(X_train_scaled, y_train_14)\n", "\n", "# Predict on test set\n", "y_pred_rf = rf_model.predict(X_test_scaled)\n", "\n", "# Evaluate\n", "rf_f1 = f1_score(y_test_14, y_pred_rf, average='weighted')\n", "rf_acc = accuracy_score(y_test_14, y_pred_rf)\n", "rf_precision = precision_score(y_test_14, y_pred_rf, average='weighted', zero_division=0)\n", "rf_recall = recall_score(y_test_14, y_pred_rf, average='weighted', zero_division=0)\n", "\n", "print(f\"\\nRandom Forest trained with {rf_model.n_estimators} trees\")\n", "print(f\"\\nTest Set Performance:\")\n", "print(f\"Accuracy: {rf_acc:.4f}\")\n", "print(f\"Precision: {rf_precision:.4f}\")\n", "print(f\"Recall: {rf_recall:.4f}\")\n", "print(f\"F1-Score: {rf_f1:.4f}\")\n", "\n", "print(f\"\\nComparison to baselines:\")\n", "print(f\"Baseline (LDA): F1 = 0.5750\")\n", "print(f\"Baseline (Pipeline): F1 = 0.5473\")\n", "print(f\"Random Forest: F1 = {rf_f1:.4f}\")\n", "improvement_vs_lda = ((rf_f1 - 0.5750) / 0.5750) * 100\n", "print(f\"Improvement vs LDA: {improvement_vs_lda:+.2f}%\")" ] }, { "cell_type": "markdown", "id": "0b16e409-7698-4f98-9c2e-20eec70213c4", "metadata": {}, "source": [ "### Final comparison" ] }, { "cell_type": "code", "execution_count": null, "id": "8559eb54-5bbc-436c-ba9b-f279e5d3bdd7", "metadata": {}, "outputs": [], "source": [ "\n", "\n", "# Collect all results\n", "results_all = [\n", " {'Approach': 'Baseline - LDA (Lab 3)', \n", " 'F1-Score': 0.5750}, \n", " \n", " {'Approach': 'Hierarchical Pipeline', \n", " 'F1-Score': 0.5473},\n", " \n", " {'Approach': 'Random Forest', \n", " 'F1-Score': rf_f1},\n", "]\n", "\n", "# Create DataFrame and sort\n", "results_comparison_df = pd.DataFrame(results_all)\n", "results_comparison_df = results_comparison_df.sort_values('F1-Score', ascending=False)\n", "\n", "print(\"\\n\")\n", "print(results_comparison_df.to_string(index=False))\n", "\n", "# Identify best approach\n", "best_approach = results_comparison_df.iloc[0]\n", "baseline_f1 = 0.5750\n", "\n", "\n", "print(f\"Model: {best_approach['Approach']}\")\n", "print(f\"F1-Score: {best_approach['F1-Score']:.4f}\")\n", "print(f\"Improvement over baseline: {((best_approach['F1-Score'] - baseline_f1) / baseline_f1 * 100):+.2f}%\")\n", "\n", "# Visualization\n", "fig, ax = plt.subplots(figsize=(8, 6))\n", "\n", "approaches = results_comparison_df['Approach']\n", "f1_scores = results_comparison_df['F1-Score']\n", "\n", "bars = ax.barh(approaches, f1_scores, color='skyblue', edgecolor='black', linewidth=1.5)\n", "\n", "# Color best bar gold\n", "bars[0].set_color('gold')\n", "bars[0].set_edgecolor('darkgoldenrod')\n", "bars[0].set_linewidth=2\n", "\n", "# Add baseline reference line\n", "ax.axvline(0.5750, color='red', linestyle='--', linewidth=2, \n", " label='Original Baseline (LDA = 0.575)', alpha=0.7)\n", "\n", "ax.set_xlabel('F1-Score (weighted)', fontsize=12, fontweight='bold')\n", "ax.set_title('Comparison of All Classification Approaches\\n14-Class Weak Link Prediction', \n", " fontsize=14, fontweight='bold')\n", "ax.legend(fontsize=10)\n", "ax.grid(axis='x', alpha=0.3)\n", "ax.set_xlim([0.5, 0.7])\n", "\n", "# Add value labels\n", "for bar, score in zip(bars, f1_scores):\n", " ax.text(score + 0.005, bar.get_y() + bar.get_height()/2, \n", " f'{score:.4f}',\n", " va='center', fontsize=10, fontweight='bold')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "78ebe496-49a6-416a-956a-ac7ac466f81c", "metadata": {}, "outputs": [], "source": [ "# Detailed analysis of the champion model\n", "\n", "if best_approach['Approach'] == 'Random Forest':\n", " best_model = rf_model\n", " best_predictions = y_pred_rf\n", "else:\n", " best_model = None\n", " best_predictions = y_pred_rf\n", "\n", "print(f\"\\nClassification Report for: {best_approach['Approach']}\")\n", "print(classification_report(y_test_14, best_predictions, zero_division=0))\n" ] }, { "cell_type": "code", "execution_count": null, "id": "7f6355aa-1149-40ac-9e03-b17f9bae19a6", "metadata": {}, "outputs": [], "source": [ "# Prepare the final model package\n", "final_model_package = {\n", " 'model_type': 'Random Forest',\n", " 'model': rf_model,\n", " 'scaler': scaler,\n", " 'feature_columns': feature_columns,\n", " 'classes': list(rf_model.classes_),\n", " 'weaklink_categories': weaklink_categories,\n", " 'upper_body_classes': upper_body_classes,\n", " 'lower_body_classes': lower_body_classes,\n", " 'test_performance': {\n", " 'accuracy': rf_acc,\n", " 'precision': rf_precision,\n", " 'recall': rf_recall,\n", " 'f1_score': rf_f1\n", " },\n", " 'training_info': {\n", " 'n_estimators': rf_model.n_estimators,\n", " 'max_depth': rf_model.max_depth,\n", " 'random_state': RANDOM_STATE,\n", " 'training_samples': X_train.shape[0],\n", " 'test_samples': X_test.shape[0],\n", " 'n_features': len(feature_columns)\n", " }\n", "}\n", "\n", "# Save to pickle file\n", "model_path = OUT_DIR / 'weaklink_classifier_rf.pkl'\n", "with open(model_path, 'wb') as f:\n", " pickle.dump(final_model_package, f)" ] }, { "cell_type": "code", "execution_count": null, "id": "c97378c3-bc86-4ca1-8829-e97da3c8f560", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.11" } }, "nbformat": 4, "nbformat_minor": 5 }