RasaBh commited on
Commit
901167d
·
1 Parent(s): 4d1cb53

removed estimated feature

Browse files
Files changed (1) hide show
  1. A3/A3_Test.ipynb +63 -757
A3/A3_Test.ipynb CHANGED
@@ -307,10 +307,10 @@
307
  "name": "stdout",
308
  "output_type": "stream",
309
  "text": [
310
- "Features (X) shape: (2094, 42)\n",
311
  "Target (y) shape: (2094,)\n",
312
  "\n",
313
- "Number of features: 42\n",
314
  "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",
315
  "\n",
316
  "Number of classes: 14\n",
@@ -320,7 +320,7 @@
320
  ],
321
  "source": [
322
  "# Drop non-feature columns \n",
323
- "exclude_from_X = ['ID', 'WeakestLink']\n",
324
  "feature_columns = [col for col in merged_df.columns if col not in exclude_from_X]\n",
325
  "\n",
326
  "X = merged_df[feature_columns].copy()\n",
@@ -513,56 +513,56 @@
513
  " <tr>\n",
514
  " <th>2</th>\n",
515
  " <td>LDA</td>\n",
516
- " <td>0.579952</td>\n",
517
- " <td>0.420048</td>\n",
518
- " <td>0.594921</td>\n",
519
- " <td>0.579952</td>\n",
520
- " <td>0.580049</td>\n",
521
  " </tr>\n",
522
  " <tr>\n",
523
  " <th>0</th>\n",
524
  " <td>Logistic Regression</td>\n",
525
- " <td>0.548926</td>\n",
526
- " <td>0.451074</td>\n",
527
- " <td>0.623611</td>\n",
528
- " <td>0.548926</td>\n",
529
- " <td>0.566248</td>\n",
530
  " </tr>\n",
531
  " <tr>\n",
532
- " <th>3</th>\n",
533
- " <td>KNN (k=5)</td>\n",
534
  " <td>0.553699</td>\n",
535
  " <td>0.446301</td>\n",
536
- " <td>0.556792</td>\n",
537
  " <td>0.553699</td>\n",
538
- " <td>0.546164</td>\n",
539
  " </tr>\n",
540
  " <tr>\n",
541
  " <th>5</th>\n",
542
  " <td>KNN (k=10)</td>\n",
543
- " <td>0.551313</td>\n",
544
- " <td>0.448687</td>\n",
545
- " <td>0.573710</td>\n",
546
- " <td>0.551313</td>\n",
547
- " <td>0.542103</td>\n",
548
  " </tr>\n",
549
  " <tr>\n",
550
- " <th>4</th>\n",
551
- " <td>KNN (k=7)</td>\n",
552
- " <td>0.544153</td>\n",
553
- " <td>0.455847</td>\n",
554
- " <td>0.542687</td>\n",
555
- " <td>0.544153</td>\n",
556
- " <td>0.538519</td>\n",
557
  " </tr>\n",
558
  " <tr>\n",
559
  " <th>1</th>\n",
560
  " <td>Naive Bayes</td>\n",
561
- " <td>0.431981</td>\n",
562
- " <td>0.568019</td>\n",
563
- " <td>0.513408</td>\n",
564
- " <td>0.431981</td>\n",
565
- " <td>0.447074</td>\n",
566
  " </tr>\n",
567
  " </tbody>\n",
568
  "</table>\n",
@@ -570,12 +570,12 @@
570
  ],
571
  "text/plain": [
572
  " Model Accuracy Error Rate Precision Recall F1-Score\n",
573
- "2 LDA 0.579952 0.420048 0.594921 0.579952 0.580049\n",
574
- "0 Logistic Regression 0.548926 0.451074 0.623611 0.548926 0.566248\n",
575
- "3 KNN (k=5) 0.553699 0.446301 0.556792 0.553699 0.546164\n",
576
- "5 KNN (k=10) 0.551313 0.448687 0.573710 0.551313 0.542103\n",
577
- "4 KNN (k=7) 0.544153 0.455847 0.542687 0.544153 0.538519\n",
578
- "1 Naive Bayes 0.431981 0.568019 0.513408 0.431981 0.447074"
579
  ]
580
  },
581
  "metadata": {},
@@ -603,7 +603,7 @@
603
  "text": [
604
  "\n",
605
  "CHAMPION: LDA\n",
606
- "F1-Score: 0.5800\n"
607
  ]
608
  }
609
  ],
@@ -626,7 +626,7 @@
626
  },
627
  {
628
  "cell_type": "code",
629
- "execution_count": 12,
630
  "id": "6cecb844-b3b1-448f-b0fa-e917e4f979d7",
631
  "metadata": {},
632
  "outputs": [
@@ -636,112 +636,8 @@
636
  "text": [
637
  "\n",
638
  "Tuning Logistic Regression...\n",
639
- " Parameters to test: {'C': [0.001, 0.01, 0.1, 1, 10, 100], 'solver': ['lbfgs', 'saga'], 'class_weight': [None, 'balanced']}\n",
640
- "Best params: {'C': 10, 'class_weight': None, 'solver': 'lbfgs'}\n",
641
- "CV F1-Score: 0.5968\n",
642
- "Test F1-Score: 0.6195\n",
643
- "Improvement: +0.0532\n",
644
- "\n",
645
- "Tuning LDA...\n",
646
- " Parameters to test: {'solver': ['svd', 'lsqr', 'eigen']}\n",
647
- "Best params: {'solver': 'svd'}\n",
648
- "CV F1-Score: 0.5774\n",
649
- "Test F1-Score: 0.5800\n",
650
- "Improvement: +0.0000\n",
651
- "\n",
652
- "Tuning KNN (k=5)...\n",
653
- " Parameters to test: {'n_neighbors': [3, 5, 7, 9, 11, 13], 'weights': ['uniform', 'distance'], 'metric': ['euclidean', 'manhattan']}\n",
654
- "Best params: {'metric': 'manhattan', 'n_neighbors': 5, 'weights': 'distance'}\n",
655
- "CV F1-Score: 0.5560\n",
656
- "Test F1-Score: 0.5571\n",
657
- "Improvement: +0.0110\n",
658
- "\n",
659
- "\n",
660
- "Hyperparameter Tuning Results (14-class):\n",
661
- "\n",
662
- "\n"
663
  ]
664
- },
665
- {
666
- "data": {
667
- "text/html": [
668
- "<div>\n",
669
- "<style scoped>\n",
670
- " .dataframe tbody tr th:only-of-type {\n",
671
- " vertical-align: middle;\n",
672
- " }\n",
673
- "\n",
674
- " .dataframe tbody tr th {\n",
675
- " vertical-align: top;\n",
676
- " }\n",
677
- "\n",
678
- " .dataframe thead th {\n",
679
- " text-align: right;\n",
680
- " }\n",
681
- "</style>\n",
682
- "<table border=\"1\" class=\"dataframe\">\n",
683
- " <thead>\n",
684
- " <tr style=\"text-align: right;\">\n",
685
- " <th></th>\n",
686
- " <th>Model</th>\n",
687
- " <th>Best Params</th>\n",
688
- " <th>CV Score</th>\n",
689
- " <th>Test Accuracy</th>\n",
690
- " <th>Test F1-Score</th>\n",
691
- " <th>Improvement</th>\n",
692
- " </tr>\n",
693
- " </thead>\n",
694
- " <tbody>\n",
695
- " <tr>\n",
696
- " <th>0</th>\n",
697
- " <td>Logistic Regression (Tuned)</td>\n",
698
- " <td>{'C': 10, 'class_weight': None, 'solver': 'lbf...</td>\n",
699
- " <td>0.596789</td>\n",
700
- " <td>0.620525</td>\n",
701
- " <td>0.619470</td>\n",
702
- " <td>0.053222</td>\n",
703
- " </tr>\n",
704
- " <tr>\n",
705
- " <th>1</th>\n",
706
- " <td>LDA (Tuned)</td>\n",
707
- " <td>{'solver': 'svd'}</td>\n",
708
- " <td>0.577370</td>\n",
709
- " <td>0.579952</td>\n",
710
- " <td>0.580049</td>\n",
711
- " <td>0.000000</td>\n",
712
- " </tr>\n",
713
- " <tr>\n",
714
- " <th>2</th>\n",
715
- " <td>KNN (k=5) (Tuned)</td>\n",
716
- " <td>{'metric': 'manhattan', 'n_neighbors': 5, 'wei...</td>\n",
717
- " <td>0.555957</td>\n",
718
- " <td>0.568019</td>\n",
719
- " <td>0.557133</td>\n",
720
- " <td>0.010970</td>\n",
721
- " </tr>\n",
722
- " </tbody>\n",
723
- "</table>\n",
724
- "</div>"
725
- ],
726
- "text/plain": [
727
- " Model \\\n",
728
- "0 Logistic Regression (Tuned) \n",
729
- "1 LDA (Tuned) \n",
730
- "2 KNN (k=5) (Tuned) \n",
731
- "\n",
732
- " Best Params CV Score Test Accuracy \\\n",
733
- "0 {'C': 10, 'class_weight': None, 'solver': 'lbf... 0.596789 0.620525 \n",
734
- "1 {'solver': 'svd'} 0.577370 0.579952 \n",
735
- "2 {'metric': 'manhattan', 'n_neighbors': 5, 'wei... 0.555957 0.568019 \n",
736
- "\n",
737
- " Test F1-Score Improvement \n",
738
- "0 0.619470 0.053222 \n",
739
- "1 0.580049 0.000000 \n",
740
- "2 0.557133 0.010970 "
741
- ]
742
- },
743
- "metadata": {},
744
- "output_type": "display_data"
745
  }
746
  ],
747
  "source": [
@@ -833,7 +729,7 @@
833
  },
834
  {
835
  "cell_type": "code",
836
- "execution_count": 13,
837
  "id": "9a43d212-4268-4921-8926-0ee1a017d771",
838
  "metadata": {},
839
  "outputs": [],
@@ -844,193 +740,10 @@
844
  },
845
  {
846
  "cell_type": "code",
847
- "execution_count": 14,
848
  "id": "2256f87c-6d23-4a03-a614-53cfe31916bc",
849
  "metadata": {},
850
- "outputs": [
851
- {
852
- "name": "stdout",
853
- "output_type": "stream",
854
- "text": [
855
- "New Class Distribution based on two Body Regions\n",
856
- "WeakestRegion\n",
857
- "Upper Body 1525\n",
858
- "Lower Body 569\n",
859
- "Name: count, dtype: int64\n",
860
- "(2094, 45)\n"
861
- ]
862
- },
863
- {
864
- "data": {
865
- "text/html": [
866
- "<div>\n",
867
- "<style scoped>\n",
868
- " .dataframe tbody tr th:only-of-type {\n",
869
- " vertical-align: middle;\n",
870
- " }\n",
871
- "\n",
872
- " .dataframe tbody tr th {\n",
873
- " vertical-align: top;\n",
874
- " }\n",
875
- "\n",
876
- " .dataframe thead th {\n",
877
- " text-align: right;\n",
878
- " }\n",
879
- "</style>\n",
880
- "<table border=\"1\" class=\"dataframe\">\n",
881
- " <thead>\n",
882
- " <tr style=\"text-align: right;\">\n",
883
- " <th></th>\n",
884
- " <th>AimoScore</th>\n",
885
- " <th>No_1_Angle_Deviation</th>\n",
886
- " <th>No_2_Angle_Deviation</th>\n",
887
- " <th>No_3_Angle_Deviation</th>\n",
888
- " <th>No_4_Angle_Deviation</th>\n",
889
- " <th>No_5_Angle_Deviation</th>\n",
890
- " <th>No_6_Angle_Deviation</th>\n",
891
- " <th>No_7_Angle_Deviation</th>\n",
892
- " <th>No_8_Angle_Deviation</th>\n",
893
- " <th>No_9_Angle_Deviation</th>\n",
894
- " <th>...</th>\n",
895
- " <th>No_22_NASM_Deviation</th>\n",
896
- " <th>No_23_NASM_Deviation</th>\n",
897
- " <th>No_24_NASM_Deviation</th>\n",
898
- " <th>No_25_NASM_Deviation</th>\n",
899
- " <th>No_1_Time_Deviation</th>\n",
900
- " <th>No_2_Time_Deviation</th>\n",
901
- " <th>EstimatedScore</th>\n",
902
- " <th>ID</th>\n",
903
- " <th>WeakestLink</th>\n",
904
- " <th>WeakestRegion</th>\n",
905
- " </tr>\n",
906
- " </thead>\n",
907
- " <tbody>\n",
908
- " <tr>\n",
909
- " <th>0</th>\n",
910
- " <td>0.323667</td>\n",
911
- " <td>0.538020</td>\n",
912
- " <td>0.815878</td>\n",
913
- " <td>0.346724</td>\n",
914
- " <td>0.382114</td>\n",
915
- " <td>0.302248</td>\n",
916
- " <td>0.947872</td>\n",
917
- " <td>0.275945</td>\n",
918
- " <td>0.521760</td>\n",
919
- " <td>0.457198</td>\n",
920
- " <td>...</td>\n",
921
- " <td>0.552846</td>\n",
922
- " <td>0.648972</td>\n",
923
- " <td>0.578192</td>\n",
924
- " <td>0.560019</td>\n",
925
- " <td>0.821616</td>\n",
926
- " <td>0.818747</td>\n",
927
- " <td>0.209947</td>\n",
928
- " <td>0003cdcc-86ed-494a-a3b5-90d09e96e06b.Kinect</td>\n",
929
- " <td>RightShoulderElevation</td>\n",
930
- " <td>Upper Body</td>\n",
931
- " </tr>\n",
932
- " <tr>\n",
933
- " <th>1</th>\n",
934
- " <td>0.323699</td>\n",
935
- " <td>0.443807</td>\n",
936
- " <td>0.306552</td>\n",
937
- " <td>0.823529</td>\n",
938
- " <td>0.188905</td>\n",
939
- " <td>0.497370</td>\n",
940
- " <td>0.140124</td>\n",
941
- " <td>0.664275</td>\n",
942
- " <td>0.521760</td>\n",
943
- " <td>0.729316</td>\n",
944
- " <td>...</td>\n",
945
- " <td>0.805356</td>\n",
946
- " <td>0.848876</td>\n",
947
- " <td>0.889048</td>\n",
948
- " <td>0.816834</td>\n",
949
- " <td>0.307987</td>\n",
950
- " <td>0.248207</td>\n",
951
- " <td>0.457198</td>\n",
952
- " <td>003115c4-bdb8-491c-b571-8fcebdecf8ed.Kinect</td>\n",
953
- " <td>RightArmFallForward</td>\n",
954
- " <td>Upper Body</td>\n",
955
- " </tr>\n",
956
- " <tr>\n",
957
- " <th>2</th>\n",
958
- " <td>0.848327</td>\n",
959
- " <td>0.603539</td>\n",
960
- " <td>0.373984</td>\n",
961
- " <td>0.346724</td>\n",
962
- " <td>0.590626</td>\n",
963
- " <td>0.341942</td>\n",
964
- " <td>0.298900</td>\n",
965
- " <td>0.276901</td>\n",
966
- " <td>0.623625</td>\n",
967
- " <td>0.658058</td>\n",
968
- " <td>...</td>\n",
969
- " <td>0.690579</td>\n",
970
- " <td>0.648972</td>\n",
971
- " <td>0.578192</td>\n",
972
- " <td>0.555715</td>\n",
973
- " <td>0.218556</td>\n",
974
- " <td>0.235294</td>\n",
975
- " <td>0.107126</td>\n",
976
- " <td>00316bfb-ed43-489f-a55b-11c7f01c852d.Kinect</td>\n",
977
- " <td>LeftArmFallForward</td>\n",
978
- " <td>Upper Body</td>\n",
979
- " </tr>\n",
980
- " </tbody>\n",
981
- "</table>\n",
982
- "<p>3 rows × 45 columns</p>\n",
983
- "</div>"
984
- ],
985
- "text/plain": [
986
- " AimoScore No_1_Angle_Deviation No_2_Angle_Deviation \\\n",
987
- "0 0.323667 0.538020 0.815878 \n",
988
- "1 0.323699 0.443807 0.306552 \n",
989
- "2 0.848327 0.603539 0.373984 \n",
990
- "\n",
991
- " No_3_Angle_Deviation No_4_Angle_Deviation No_5_Angle_Deviation \\\n",
992
- "0 0.346724 0.382114 0.302248 \n",
993
- "1 0.823529 0.188905 0.497370 \n",
994
- "2 0.346724 0.590626 0.341942 \n",
995
- "\n",
996
- " No_6_Angle_Deviation No_7_Angle_Deviation No_8_Angle_Deviation \\\n",
997
- "0 0.947872 0.275945 0.521760 \n",
998
- "1 0.140124 0.664275 0.521760 \n",
999
- "2 0.298900 0.276901 0.623625 \n",
1000
- "\n",
1001
- " No_9_Angle_Deviation ... No_22_NASM_Deviation No_23_NASM_Deviation \\\n",
1002
- "0 0.457198 ... 0.552846 0.648972 \n",
1003
- "1 0.729316 ... 0.805356 0.848876 \n",
1004
- "2 0.658058 ... 0.690579 0.648972 \n",
1005
- "\n",
1006
- " No_24_NASM_Deviation No_25_NASM_Deviation No_1_Time_Deviation \\\n",
1007
- "0 0.578192 0.560019 0.821616 \n",
1008
- "1 0.889048 0.816834 0.307987 \n",
1009
- "2 0.578192 0.555715 0.218556 \n",
1010
- "\n",
1011
- " No_2_Time_Deviation EstimatedScore \\\n",
1012
- "0 0.818747 0.209947 \n",
1013
- "1 0.248207 0.457198 \n",
1014
- "2 0.235294 0.107126 \n",
1015
- "\n",
1016
- " ID WeakestLink \\\n",
1017
- "0 0003cdcc-86ed-494a-a3b5-90d09e96e06b.Kinect RightShoulderElevation \n",
1018
- "1 003115c4-bdb8-491c-b571-8fcebdecf8ed.Kinect RightArmFallForward \n",
1019
- "2 00316bfb-ed43-489f-a55b-11c7f01c852d.Kinect LeftArmFallForward \n",
1020
- "\n",
1021
- " WeakestRegion \n",
1022
- "0 Upper Body \n",
1023
- "1 Upper Body \n",
1024
- "2 Upper Body \n",
1025
- "\n",
1026
- "[3 rows x 45 columns]"
1027
- ]
1028
- },
1029
- "execution_count": 14,
1030
- "metadata": {},
1031
- "output_type": "execute_result"
1032
- }
1033
- ],
1034
  "source": [
1035
  "# Define the groups as mentioned in Slide 6 into 3 distinct regions\n",
1036
  "def get_region(label):\n",
@@ -1057,24 +770,14 @@
1057
  },
1058
  {
1059
  "cell_type": "code",
1060
- "execution_count": 15,
1061
  "id": "c556f1ac-552b-4ccb-82a1-6c3b782c3c75",
1062
  "metadata": {},
1063
- "outputs": [
1064
- {
1065
- "name": "stdout",
1066
- "output_type": "stream",
1067
- "text": [
1068
- "\n",
1069
- "Training set: 1675 samples\n",
1070
- "Test set: 419 samples\n"
1071
- ]
1072
- }
1073
- ],
1074
  "source": [
1075
  "# Prepare data for region wise classification\n",
1076
  "\n",
1077
- "exclude_region = ['ID', 'WeakestLink', 'WeakestRegion']\n",
1078
  "features_region = [c for c in merged_df.columns if c not in exclude_region]\n",
1079
  "\n",
1080
  "X_region = merged_df[features_region].copy()\n",
@@ -1095,130 +798,10 @@
1095
  },
1096
  {
1097
  "cell_type": "code",
1098
- "execution_count": 16,
1099
  "id": "cc39415b-8dab-4af3-bd1c-830c01735921",
1100
  "metadata": {},
1101
- "outputs": [
1102
- {
1103
- "name": "stdout",
1104
- "output_type": "stream",
1105
- "text": [
1106
- "\n",
1107
- "Final Classification Performance\n"
1108
- ]
1109
- },
1110
- {
1111
- "data": {
1112
- "text/html": [
1113
- "<div>\n",
1114
- "<style scoped>\n",
1115
- " .dataframe tbody tr th:only-of-type {\n",
1116
- " vertical-align: middle;\n",
1117
- " }\n",
1118
- "\n",
1119
- " .dataframe tbody tr th {\n",
1120
- " vertical-align: top;\n",
1121
- " }\n",
1122
- "\n",
1123
- " .dataframe thead th {\n",
1124
- " text-align: right;\n",
1125
- " }\n",
1126
- "</style>\n",
1127
- "<table border=\"1\" class=\"dataframe\">\n",
1128
- " <thead>\n",
1129
- " <tr style=\"text-align: right;\">\n",
1130
- " <th></th>\n",
1131
- " <th>Model</th>\n",
1132
- " <th>Accuracy</th>\n",
1133
- " <th>Error Rate</th>\n",
1134
- " <th>Precision</th>\n",
1135
- " <th>Recall</th>\n",
1136
- " <th>F1-Score</th>\n",
1137
- " </tr>\n",
1138
- " </thead>\n",
1139
- " <tbody>\n",
1140
- " <tr>\n",
1141
- " <th>2</th>\n",
1142
- " <td>LDA</td>\n",
1143
- " <td>0.842482</td>\n",
1144
- " <td>0.157518</td>\n",
1145
- " <td>0.837328</td>\n",
1146
- " <td>0.842482</td>\n",
1147
- " <td>0.837989</td>\n",
1148
- " </tr>\n",
1149
- " <tr>\n",
1150
- " <th>6</th>\n",
1151
- " <td>KNN (k=10)</td>\n",
1152
- " <td>0.832936</td>\n",
1153
- " <td>0.167064</td>\n",
1154
- " <td>0.826575</td>\n",
1155
- " <td>0.832936</td>\n",
1156
- " <td>0.824195</td>\n",
1157
- " </tr>\n",
1158
- " <tr>\n",
1159
- " <th>5</th>\n",
1160
- " <td>KNN (k=7)</td>\n",
1161
- " <td>0.832936</td>\n",
1162
- " <td>0.167064</td>\n",
1163
- " <td>0.827125</td>\n",
1164
- " <td>0.832936</td>\n",
1165
- " <td>0.822706</td>\n",
1166
- " </tr>\n",
1167
- " <tr>\n",
1168
- " <th>4</th>\n",
1169
- " <td>KNN (k=5)</td>\n",
1170
- " <td>0.825776</td>\n",
1171
- " <td>0.174224</td>\n",
1172
- " <td>0.818545</td>\n",
1173
- " <td>0.825776</td>\n",
1174
- " <td>0.818477</td>\n",
1175
- " </tr>\n",
1176
- " <tr>\n",
1177
- " <th>0</th>\n",
1178
- " <td>Logistic Regression</td>\n",
1179
- " <td>0.809069</td>\n",
1180
- " <td>0.190931</td>\n",
1181
- " <td>0.833434</td>\n",
1182
- " <td>0.809069</td>\n",
1183
- " <td>0.815823</td>\n",
1184
- " </tr>\n",
1185
- " <tr>\n",
1186
- " <th>1</th>\n",
1187
- " <td>Naive Bayes</td>\n",
1188
- " <td>0.770883</td>\n",
1189
- " <td>0.229117</td>\n",
1190
- " <td>0.763969</td>\n",
1191
- " <td>0.770883</td>\n",
1192
- " <td>0.766729</td>\n",
1193
- " </tr>\n",
1194
- " <tr>\n",
1195
- " <th>3</th>\n",
1196
- " <td>QDA</td>\n",
1197
- " <td>0.548926</td>\n",
1198
- " <td>0.451074</td>\n",
1199
- " <td>0.688926</td>\n",
1200
- " <td>0.548926</td>\n",
1201
- " <td>0.570997</td>\n",
1202
- " </tr>\n",
1203
- " </tbody>\n",
1204
- "</table>\n",
1205
- "</div>"
1206
- ],
1207
- "text/plain": [
1208
- " Model Accuracy Error Rate Precision Recall F1-Score\n",
1209
- "2 LDA 0.842482 0.157518 0.837328 0.842482 0.837989\n",
1210
- "6 KNN (k=10) 0.832936 0.167064 0.826575 0.832936 0.824195\n",
1211
- "5 KNN (k=7) 0.832936 0.167064 0.827125 0.832936 0.822706\n",
1212
- "4 KNN (k=5) 0.825776 0.174224 0.818545 0.825776 0.818477\n",
1213
- "0 Logistic Regression 0.809069 0.190931 0.833434 0.809069 0.815823\n",
1214
- "1 Naive Bayes 0.770883 0.229117 0.763969 0.770883 0.766729\n",
1215
- "3 QDA 0.548926 0.451074 0.688926 0.548926 0.570997"
1216
- ]
1217
- },
1218
- "metadata": {},
1219
- "output_type": "display_data"
1220
- }
1221
- ],
1222
  "source": [
1223
  "models_region = {\n",
1224
  " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n",
@@ -1244,20 +827,10 @@
1244
  },
1245
  {
1246
  "cell_type": "code",
1247
- "execution_count": 17,
1248
  "id": "c291d288-2668-4c28-a731-0ccc845dc4d1",
1249
  "metadata": {},
1250
- "outputs": [
1251
- {
1252
- "name": "stdout",
1253
- "output_type": "stream",
1254
- "text": [
1255
- "\n",
1256
- "Baseline Champion (Body Regions): LDA\n",
1257
- "F1-Score: 0.8380\n"
1258
- ]
1259
- }
1260
- ],
1261
  "source": [
1262
  "champion_region_baseline = results_region_baseline.iloc[0]['Model']\n",
1263
  "champion_region_f1_baseline = results_region_baseline.iloc[0]['F1-Score']\n",
@@ -1275,122 +848,10 @@
1275
  },
1276
  {
1277
  "cell_type": "code",
1278
- "execution_count": 18,
1279
  "id": "aafe02c6-101b-4494-8679-70c6f8c67563",
1280
  "metadata": {},
1281
- "outputs": [
1282
- {
1283
- "name": "stdout",
1284
- "output_type": "stream",
1285
- "text": [
1286
- "\n",
1287
- "Tuning Logistic Regression...\n",
1288
- " Parameters to test: {'C': [0.01, 0.1, 1, 10, 100], 'solver': ['lbfgs', 'saga', 'newton-cg']}\n",
1289
- "Best params: {'C': 0.1, 'solver': 'lbfgs'}\n",
1290
- "CV F1-Score: 0.8290\n",
1291
- "Test F1-Score: 0.8137\n",
1292
- "Improvement: -0.0022\n",
1293
- "\n",
1294
- "Tuning LDA...\n",
1295
- " Parameters to test: {'solver': ['svd', 'lsqr', 'eigen']}\n",
1296
- "Best params: {'solver': 'svd'}\n",
1297
- "CV F1-Score: 0.8434\n",
1298
- "Test F1-Score: 0.8380\n",
1299
- "Improvement: +0.0000\n",
1300
- "\n",
1301
- "Tuning KNN (k=10)...\n",
1302
- " Parameters to test: {'n_neighbors': [7, 9, 10, 11, 13, 15], 'weights': ['uniform', 'distance'], 'metric': ['euclidean', 'manhattan', 'minkowski']}\n",
1303
- "Best params: {'metric': 'euclidean', 'n_neighbors': 10, 'weights': 'distance'}\n",
1304
- "CV F1-Score: 0.8643\n",
1305
- "Test F1-Score: 0.8335\n",
1306
- "Improvement: +0.0093\n",
1307
- "Hyperparameter Tuning Results (Body Regions):\n",
1308
- "\n",
1309
- "\n"
1310
- ]
1311
- },
1312
- {
1313
- "data": {
1314
- "text/html": [
1315
- "<div>\n",
1316
- "<style scoped>\n",
1317
- " .dataframe tbody tr th:only-of-type {\n",
1318
- " vertical-align: middle;\n",
1319
- " }\n",
1320
- "\n",
1321
- " .dataframe tbody tr th {\n",
1322
- " vertical-align: top;\n",
1323
- " }\n",
1324
- "\n",
1325
- " .dataframe thead th {\n",
1326
- " text-align: right;\n",
1327
- " }\n",
1328
- "</style>\n",
1329
- "<table border=\"1\" class=\"dataframe\">\n",
1330
- " <thead>\n",
1331
- " <tr style=\"text-align: right;\">\n",
1332
- " <th></th>\n",
1333
- " <th>Model</th>\n",
1334
- " <th>Best Params</th>\n",
1335
- " <th>CV Score</th>\n",
1336
- " <th>Test Accuracy</th>\n",
1337
- " <th>Test F1-Score</th>\n",
1338
- " <th>Improvement</th>\n",
1339
- " </tr>\n",
1340
- " </thead>\n",
1341
- " <tbody>\n",
1342
- " <tr>\n",
1343
- " <th>1</th>\n",
1344
- " <td>LDA (Tuned)</td>\n",
1345
- " <td>{'solver': 'svd'}</td>\n",
1346
- " <td>0.843434</td>\n",
1347
- " <td>0.842482</td>\n",
1348
- " <td>0.837989</td>\n",
1349
- " <td>0.00000</td>\n",
1350
- " </tr>\n",
1351
- " <tr>\n",
1352
- " <th>2</th>\n",
1353
- " <td>KNN (k=10) (Tuned)</td>\n",
1354
- " <td>{'metric': 'euclidean', 'n_neighbors': 10, 'we...</td>\n",
1355
- " <td>0.864273</td>\n",
1356
- " <td>0.844869</td>\n",
1357
- " <td>0.833524</td>\n",
1358
- " <td>0.00933</td>\n",
1359
- " </tr>\n",
1360
- " <tr>\n",
1361
- " <th>0</th>\n",
1362
- " <td>Logistic Regression (Tuned)</td>\n",
1363
- " <td>{'C': 0.1, 'solver': 'lbfgs'}</td>\n",
1364
- " <td>0.829037</td>\n",
1365
- " <td>0.806683</td>\n",
1366
- " <td>0.813662</td>\n",
1367
- " <td>-0.00216</td>\n",
1368
- " </tr>\n",
1369
- " </tbody>\n",
1370
- "</table>\n",
1371
- "</div>"
1372
- ],
1373
- "text/plain": [
1374
- " Model \\\n",
1375
- "1 LDA (Tuned) \n",
1376
- "2 KNN (k=10) (Tuned) \n",
1377
- "0 Logistic Regression (Tuned) \n",
1378
- "\n",
1379
- " Best Params CV Score Test Accuracy \\\n",
1380
- "1 {'solver': 'svd'} 0.843434 0.842482 \n",
1381
- "2 {'metric': 'euclidean', 'n_neighbors': 10, 'we... 0.864273 0.844869 \n",
1382
- "0 {'C': 0.1, 'solver': 'lbfgs'} 0.829037 0.806683 \n",
1383
- "\n",
1384
- " Test F1-Score Improvement \n",
1385
- "1 0.837989 0.00000 \n",
1386
- "2 0.833524 0.00933 \n",
1387
- "0 0.813662 -0.00216 "
1388
- ]
1389
- },
1390
- "metadata": {},
1391
- "output_type": "display_data"
1392
- }
1393
- ],
1394
  "source": [
1395
  "tuning_configs_region = {\n",
1396
  " 'Logistic Regression': {\n",
@@ -1473,28 +934,10 @@
1473
  },
1474
  {
1475
  "cell_type": "code",
1476
- "execution_count": 19,
1477
  "id": "4080074b-fd20-4ed2-8130-84ee3c45c888",
1478
  "metadata": {},
1479
- "outputs": [
1480
- {
1481
- "name": "stdout",
1482
- "output_type": "stream",
1483
- "text": [
1484
- "Original features: 42\n",
1485
- "After polynomial transformation: 903\n",
1486
- "New features created: 861\n",
1487
- "\n",
1488
- "Training Logistic Regression with polynomial features...\n",
1489
- "\n",
1490
- "Polynomial Features Results:\n",
1491
- "Accuracy: 0.8496\n",
1492
- "F1-Score: 0.8498\n",
1493
- "Baseline F1: 0.8380\n",
1494
- "Improvement: +0.0119\n"
1495
- ]
1496
- }
1497
- ],
1498
  "source": [
1499
  "# Create polynomial features\n",
1500
  "poly = PolynomialFeatures(degree=2, include_bias=False, interaction_only=True)\n",
@@ -1528,110 +971,10 @@
1528
  },
1529
  {
1530
  "cell_type": "code",
1531
- "execution_count": 20,
1532
  "id": "6aaac401-c2d4-43b9-aba0-45a3315fd932",
1533
  "metadata": {},
1534
- "outputs": [
1535
- {
1536
- "name": "stdout",
1537
- "output_type": "stream",
1538
- "text": [
1539
- "\n",
1540
- "ALL ITERATIONS RANKED BY PERFORMANCE:\n"
1541
- ]
1542
- },
1543
- {
1544
- "data": {
1545
- "text/html": [
1546
- "<div>\n",
1547
- "<style scoped>\n",
1548
- " .dataframe tbody tr th:only-of-type {\n",
1549
- " vertical-align: middle;\n",
1550
- " }\n",
1551
- "\n",
1552
- " .dataframe tbody tr th {\n",
1553
- " vertical-align: top;\n",
1554
- " }\n",
1555
- "\n",
1556
- " .dataframe thead th {\n",
1557
- " text-align: right;\n",
1558
- " }\n",
1559
- "</style>\n",
1560
- "<table border=\"1\" class=\"dataframe\">\n",
1561
- " <thead>\n",
1562
- " <tr style=\"text-align: right;\">\n",
1563
- " <th></th>\n",
1564
- " <th>Approach</th>\n",
1565
- " <th>Iteration</th>\n",
1566
- " <th>Model</th>\n",
1567
- " <th>F1-Score</th>\n",
1568
- " </tr>\n",
1569
- " </thead>\n",
1570
- " <tbody>\n",
1571
- " <tr>\n",
1572
- " <th>4</th>\n",
1573
- " <td>Body Regions</td>\n",
1574
- " <td>Polynomial</td>\n",
1575
- " <td>LR + Poly Features</td>\n",
1576
- " <td>0.849847</td>\n",
1577
- " </tr>\n",
1578
- " <tr>\n",
1579
- " <th>3</th>\n",
1580
- " <td>Body Regions</td>\n",
1581
- " <td>Tuned</td>\n",
1582
- " <td>LDA (Tuned)</td>\n",
1583
- " <td>0.837989</td>\n",
1584
- " </tr>\n",
1585
- " <tr>\n",
1586
- " <th>2</th>\n",
1587
- " <td>Body Regions</td>\n",
1588
- " <td>Baseline</td>\n",
1589
- " <td>LDA</td>\n",
1590
- " <td>0.837989</td>\n",
1591
- " </tr>\n",
1592
- " <tr>\n",
1593
- " <th>1</th>\n",
1594
- " <td>14-Class</td>\n",
1595
- " <td>Tuned</td>\n",
1596
- " <td>Logistic Regression (Tuned)</td>\n",
1597
- " <td>0.619470</td>\n",
1598
- " </tr>\n",
1599
- " <tr>\n",
1600
- " <th>0</th>\n",
1601
- " <td>14-Class</td>\n",
1602
- " <td>Baseline</td>\n",
1603
- " <td>LDA</td>\n",
1604
- " <td>0.580049</td>\n",
1605
- " </tr>\n",
1606
- " </tbody>\n",
1607
- "</table>\n",
1608
- "</div>"
1609
- ],
1610
- "text/plain": [
1611
- " Approach Iteration Model F1-Score\n",
1612
- "4 Body Regions Polynomial LR + Poly Features 0.849847\n",
1613
- "3 Body Regions Tuned LDA (Tuned) 0.837989\n",
1614
- "2 Body Regions Baseline LDA 0.837989\n",
1615
- "1 14-Class Tuned Logistic Regression (Tuned) 0.619470\n",
1616
- "0 14-Class Baseline LDA 0.580049"
1617
- ]
1618
- },
1619
- "metadata": {},
1620
- "output_type": "display_data"
1621
- },
1622
- {
1623
- "name": "stdout",
1624
- "output_type": "stream",
1625
- "text": [
1626
- "FINAL CHAMPION MODEL\n",
1627
- "Approach: Body Regions\n",
1628
- "Iteration: Polynomial\n",
1629
- "Model: LR + Poly Features\n",
1630
- "F1-Score: 0.8498\n",
1631
- "Improvement over baseline: +0.0119\n"
1632
- ]
1633
- }
1634
- ],
1635
  "source": [
1636
  "all_iterations = pd.DataFrame([\n",
1637
  " # 14-class approaches\n",
@@ -1671,39 +1014,10 @@
1671
  },
1672
  {
1673
  "cell_type": "code",
1674
- "execution_count": 21,
1675
  "id": "bb170b58-c408-4db5-a262-0fc00b93ba07",
1676
  "metadata": {},
1677
- "outputs": [
1678
- {
1679
- "name": "stdout",
1680
- "output_type": "stream",
1681
- "text": [
1682
- "\n",
1683
- "Classification Report:\n",
1684
- "----------------------------------------------------------------------------------------------------\n",
1685
- " precision recall f1-score support\n",
1686
- "\n",
1687
- " Lower Body 0.72 0.73 0.72 114\n",
1688
- " Upper Body 0.90 0.90 0.90 305\n",
1689
- "\n",
1690
- " accuracy 0.85 419\n",
1691
- " macro avg 0.81 0.81 0.81 419\n",
1692
- "weighted avg 0.85 0.85 0.85 419\n",
1693
- "\n"
1694
- ]
1695
- },
1696
- {
1697
- "data": {
1698
- "image/png": "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",
1699
- "text/plain": [
1700
- "<Figure size 800x600 with 2 Axes>"
1701
- ]
1702
- },
1703
- "metadata": {},
1704
- "output_type": "display_data"
1705
- }
1706
- ],
1707
  "source": [
1708
  "# Determine which champion to use\n",
1709
  "if final_champion_row['Approach'] == 'Body Regions':\n",
@@ -1751,18 +1065,10 @@
1751
  },
1752
  {
1753
  "cell_type": "code",
1754
- "execution_count": 22,
1755
  "id": "b894966a-0c41-4d24-83a9-3d9eef777493",
1756
  "metadata": {},
1757
- "outputs": [
1758
- {
1759
- "name": "stdout",
1760
- "output_type": "stream",
1761
- "text": [
1762
- "Model saved: final_champion_model_A3.pkl\n"
1763
- ]
1764
- }
1765
- ],
1766
  "source": [
1767
  "# Save the champion model\n",
1768
  "model_filename = 'final_champion_model_A3.pkl'\n",
 
307
  "name": "stdout",
308
  "output_type": "stream",
309
  "text": [
310
+ "Features (X) shape: (2094, 41)\n",
311
  "Target (y) shape: (2094,)\n",
312
  "\n",
313
+ "Number of features: 41\n",
314
  "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",
315
  "\n",
316
  "Number of classes: 14\n",
 
320
  ],
321
  "source": [
322
  "# Drop non-feature columns \n",
323
+ "exclude_from_X = ['ID', 'WeakestLink', 'EstimatedScore']\n",
324
  "feature_columns = [col for col in merged_df.columns if col not in exclude_from_X]\n",
325
  "\n",
326
  "X = merged_df[feature_columns].copy()\n",
 
513
  " <tr>\n",
514
  " <th>2</th>\n",
515
  " <td>LDA</td>\n",
516
+ " <td>0.565632</td>\n",
517
+ " <td>0.434368</td>\n",
518
+ " <td>0.578220</td>\n",
519
+ " <td>0.565632</td>\n",
520
+ " <td>0.566721</td>\n",
521
  " </tr>\n",
522
  " <tr>\n",
523
  " <th>0</th>\n",
524
  " <td>Logistic Regression</td>\n",
525
+ " <td>0.546539</td>\n",
526
+ " <td>0.453461</td>\n",
527
+ " <td>0.614849</td>\n",
528
+ " <td>0.546539</td>\n",
529
+ " <td>0.562310</td>\n",
530
  " </tr>\n",
531
  " <tr>\n",
532
+ " <th>4</th>\n",
533
+ " <td>KNN (k=7)</td>\n",
534
  " <td>0.553699</td>\n",
535
  " <td>0.446301</td>\n",
536
+ " <td>0.548231</td>\n",
537
  " <td>0.553699</td>\n",
538
+ " <td>0.545808</td>\n",
539
  " </tr>\n",
540
  " <tr>\n",
541
  " <th>5</th>\n",
542
  " <td>KNN (k=10)</td>\n",
543
+ " <td>0.556086</td>\n",
544
+ " <td>0.443914</td>\n",
545
+ " <td>0.551704</td>\n",
546
+ " <td>0.556086</td>\n",
547
+ " <td>0.540911</td>\n",
548
  " </tr>\n",
549
  " <tr>\n",
550
+ " <th>3</th>\n",
551
+ " <td>KNN (k=5)</td>\n",
552
+ " <td>0.539379</td>\n",
553
+ " <td>0.460621</td>\n",
554
+ " <td>0.532738</td>\n",
555
+ " <td>0.539379</td>\n",
556
+ " <td>0.530905</td>\n",
557
  " </tr>\n",
558
  " <tr>\n",
559
  " <th>1</th>\n",
560
  " <td>Naive Bayes</td>\n",
561
+ " <td>0.434368</td>\n",
562
+ " <td>0.565632</td>\n",
563
+ " <td>0.511623</td>\n",
564
+ " <td>0.434368</td>\n",
565
+ " <td>0.449053</td>\n",
566
  " </tr>\n",
567
  " </tbody>\n",
568
  "</table>\n",
 
570
  ],
571
  "text/plain": [
572
  " Model Accuracy Error Rate Precision Recall F1-Score\n",
573
+ "2 LDA 0.565632 0.434368 0.578220 0.565632 0.566721\n",
574
+ "0 Logistic Regression 0.546539 0.453461 0.614849 0.546539 0.562310\n",
575
+ "4 KNN (k=7) 0.553699 0.446301 0.548231 0.553699 0.545808\n",
576
+ "5 KNN (k=10) 0.556086 0.443914 0.551704 0.556086 0.540911\n",
577
+ "3 KNN (k=5) 0.539379 0.460621 0.532738 0.539379 0.530905\n",
578
+ "1 Naive Bayes 0.434368 0.565632 0.511623 0.434368 0.449053"
579
  ]
580
  },
581
  "metadata": {},
 
603
  "text": [
604
  "\n",
605
  "CHAMPION: LDA\n",
606
+ "F1-Score: 0.5667\n"
607
  ]
608
  }
609
  ],
 
626
  },
627
  {
628
  "cell_type": "code",
629
+ "execution_count": null,
630
  "id": "6cecb844-b3b1-448f-b0fa-e917e4f979d7",
631
  "metadata": {},
632
  "outputs": [
 
636
  "text": [
637
  "\n",
638
  "Tuning Logistic Regression...\n",
639
+ " Parameters to test: {'C': [0.001, 0.01, 0.1, 1, 10, 100], 'solver': ['lbfgs', 'saga'], 'class_weight': [None, 'balanced']}\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
641
  }
642
  ],
643
  "source": [
 
729
  },
730
  {
731
  "cell_type": "code",
732
+ "execution_count": null,
733
  "id": "9a43d212-4268-4921-8926-0ee1a017d771",
734
  "metadata": {},
735
  "outputs": [],
 
740
  },
741
  {
742
  "cell_type": "code",
743
+ "execution_count": null,
744
  "id": "2256f87c-6d23-4a03-a614-53cfe31916bc",
745
  "metadata": {},
746
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
747
  "source": [
748
  "# Define the groups as mentioned in Slide 6 into 3 distinct regions\n",
749
  "def get_region(label):\n",
 
770
  },
771
  {
772
  "cell_type": "code",
773
+ "execution_count": null,
774
  "id": "c556f1ac-552b-4ccb-82a1-6c3b782c3c75",
775
  "metadata": {},
776
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
777
  "source": [
778
  "# Prepare data for region wise classification\n",
779
  "\n",
780
+ "exclude_region = ['ID', 'WeakestLink', 'WeakestRegion', 'EstimatedScore']\n",
781
  "features_region = [c for c in merged_df.columns if c not in exclude_region]\n",
782
  "\n",
783
  "X_region = merged_df[features_region].copy()\n",
 
798
  },
799
  {
800
  "cell_type": "code",
801
+ "execution_count": null,
802
  "id": "cc39415b-8dab-4af3-bd1c-830c01735921",
803
  "metadata": {},
804
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
805
  "source": [
806
  "models_region = {\n",
807
  " 'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42, class_weight='balanced'),\n",
 
827
  },
828
  {
829
  "cell_type": "code",
830
+ "execution_count": null,
831
  "id": "c291d288-2668-4c28-a731-0ccc845dc4d1",
832
  "metadata": {},
833
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
834
  "source": [
835
  "champion_region_baseline = results_region_baseline.iloc[0]['Model']\n",
836
  "champion_region_f1_baseline = results_region_baseline.iloc[0]['F1-Score']\n",
 
848
  },
849
  {
850
  "cell_type": "code",
851
+ "execution_count": null,
852
  "id": "aafe02c6-101b-4494-8679-70c6f8c67563",
853
  "metadata": {},
854
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
855
  "source": [
856
  "tuning_configs_region = {\n",
857
  " 'Logistic Regression': {\n",
 
934
  },
935
  {
936
  "cell_type": "code",
937
+ "execution_count": null,
938
  "id": "4080074b-fd20-4ed2-8130-84ee3c45c888",
939
  "metadata": {},
940
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
941
  "source": [
942
  "# Create polynomial features\n",
943
  "poly = PolynomialFeatures(degree=2, include_bias=False, interaction_only=True)\n",
 
971
  },
972
  {
973
  "cell_type": "code",
974
+ "execution_count": null,
975
  "id": "6aaac401-c2d4-43b9-aba0-45a3315fd932",
976
  "metadata": {},
977
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
978
  "source": [
979
  "all_iterations = pd.DataFrame([\n",
980
  " # 14-class approaches\n",
 
1014
  },
1015
  {
1016
  "cell_type": "code",
1017
+ "execution_count": null,
1018
  "id": "bb170b58-c408-4db5-a262-0fc00b93ba07",
1019
  "metadata": {},
1020
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1021
  "source": [
1022
  "# Determine which champion to use\n",
1023
  "if final_champion_row['Approach'] == 'Body Regions':\n",
 
1065
  },
1066
  {
1067
  "cell_type": "code",
1068
+ "execution_count": null,
1069
  "id": "b894966a-0c41-4d24-83a9-3d9eef777493",
1070
  "metadata": {},
1071
+ "outputs": [],
 
 
 
 
 
 
 
 
1072
  "source": [
1073
  "# Save the champion model\n",
1074
  "model_filename = 'final_champion_model_A3.pkl'\n",