{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"}],"dockerImageVersionId":31090,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix, classification_report, precision_recall_curve, auc\nimport itertools\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-20T09:55:53.233354Z","iopub.execute_input":"2025-11-20T09:55:53.233659Z","iopub.status.idle":"2025-11-20T09:55:55.793165Z","shell.execute_reply.started":"2025-11-20T09:55:53.233628Z","shell.execute_reply":"2025-11-20T09:55:55.792321Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# ------------------------------\n# Tạo DataFrame tổng hợp\n# ------------------------------\n\nresults_data = [\n\n    # Notebook 1 - Baseline\n    {'model': 'LogisticRegression (MI)', 'modality':'IMU', 'f1_macro':0.330270, 'accuracy':0.425000, 'train_time':0.014678, 'n_params':0.010},\n    {'model': 'LogisticRegression (PCA)', 'modality':'IMU', 'f1_macro':0.309983, 'accuracy':0.416667, 'train_time':0.010892, 'n_params':0.010},\n\n    # Notebook 3 - Transformer\n    {'model': 'Vanilla Transformer', 'modality':'IMU', 'f1_macro':0.854641, 'accuracy':0.851608, 'train_time':10784.24, 'n_params':0.352},\n\n    # Notebook 4 - Fusion\n    {'model': 'EARLY_ALL', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.370722, 'accuracy':0.4711, 'train_time':40.19, 'n_params':0.405},\n    {'model': 'LATE_ALL', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.278066, 'accuracy':0.3533, 'train_time':53.84, 'n_params':0.142},\n    {'model': 'MOE_ALL', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.258067, 'accuracy':0.3324, 'train_time':54.67, 'n_params':0.251},\n    {'model': 'ATTN_ALL', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.247515, 'accuracy':0.3142, 'train_time':53.99, 'n_params':0.093},\n    {'model': 'IMU_ONLY', 'modality':'IMU', 'f1_macro':0.144073, 'accuracy':0.1816, 'train_time':6.859, 'n_params':0.039},\n    {'model': 'THERMO_ONLY', 'modality':'Thermo', 'f1_macro':0.131439, 'accuracy':0.2042, 'train_time':6.476, 'n_params':0.038},\n    {'model': 'TOF_ONLY', 'modality':'ToF', 'f1_macro':0.119538, 'accuracy':0.1868, 'train_time':52.26, 'n_params':0.075},\n\n    # Notebook 5 - Representation Learning\n    {'model': 'SimCLR:LinearProbe', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.3249, 'accuracy':0.6986, 'train_time':401.88, 'n_params':0.298},\n    {'model': 'SimCLR:FineTune', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.3693, 'accuracy':0.7547, 'train_time':417.34, 'n_params':0.266},\n    {'model': 'FromScratch', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.3616, 'accuracy':0.7628, 'train_time':17.33, 'n_params':0.266},\n    {'model': 'MAE:LinearProbe', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.3633, 'accuracy':0.7116, 'train_time':143.34, 'n_params':0.457},\n    {'model': 'MAE:FineTune', 'modality':'IMU+ToF+Thermo', 'f1_macro':0.3775, 'accuracy':0.7660, 'train_time':160.72, 'n_params':0.457},\n\n    # Notebook 6 - Graph / Spatial\n    {'model': 'GCN', 'modality':'ToF', 'f1_macro':0.1956, 'accuracy':0.6426, 'train_time':16.70, 'n_params':0.108},\n    {'model': 'GAT', 'modality':'ToF', 'f1_macro':0.1956, 'accuracy':0.6426, 'train_time':31.47, 'n_params':0.141},\n    {'model': 'CNN2D+GRU', 'modality':'ToF', 'f1_macro':0.3496, 'accuracy':0.7019, 'train_time':16.93, 'n_params':0.842},\n    {'model': 'CNN3D', 'modality':'ToF', 'f1_macro':0.1956, 'accuracy':0.6426, 'train_time':9.04, 'n_params':0.070},\n\n]\n\nresults = pd.DataFrame(results_data)\n\n# Hiển thị bảng\nresults\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-20T09:55:55.794715Z","iopub.execute_input":"2025-11-20T09:55:55.795656Z","iopub.status.idle":"2025-11-20T09:55:55.841134Z","shell.execute_reply.started":"2025-11-20T09:55:55.795635Z","shell.execute_reply":"2025-11-20T09:55:55.840281Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ------------------------------\n# Trade-off: Accuracy/F1 vs Training Time vs Params\n# ------------------------------\nplt.figure(figsize=(10,6))\nsns.scatterplot(\n    data=results,\n    x='train_time',\n    y='f1_macro',\n    size='n_params',\n    hue='modality',\n    palette='Set2',\n    sizes=(50,500)\n)\nplt.xlabel(\"Training Time (s)\")\nplt.ylabel(\"Macro F1 Score\")\nplt.title(\"Trade-off: Accuracy/F1 vs Training Time vs Params\")\nplt.legend(bbox_to_anchor=(1.05,1))\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-20T09:55:55.846685Z","iopub.execute_input":"2025-11-20T09:55:55.847005Z","iopub.status.idle":"2025-11-20T09:55:56.580029Z","shell.execute_reply.started":"2025-11-20T09:55:55.846976Z","shell.execute_reply":"2025-11-20T09:55:56.579176Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ------------------------------\n# Heatmap: Macro F1 Score per Model & Modality\n# ------------------------------\nperf_table = results.pivot_table(index='model', columns='modality', values='f1_macro')\nplt.figure(figsize=(12,6))\nsns.heatmap(perf_table, annot=True, fmt=\".3f\", cmap=\"YlGnBu\")\nplt.title(\"Macro F1 Score Heatmap\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-20T09:55:56.581018Z","iopub.execute_input":"2025-11-20T09:55:56.581312Z","iopub.status.idle":"2025-11-20T09:55:57.060978Z","shell.execute_reply.started":"2025-11-20T09:55:56.581287Z","shell.execute_reply":"2025-11-20T09:55:57.059982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ------------------------------\n# Ranking by Modality & Model\n# ------------------------------\nmodality_ranking = results.groupby('modality')['f1_macro'].mean().sort_values(ascending=False)\nmodel_ranking = results.groupby('model')['f1_macro'].mean().sort_values(ascending=False)\n\nprint(\"Modality Ranking:\\n\", modality_ranking)\nprint(\"\\nModel Ranking:\\n\", model_ranking)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-20T09:55:57.062081Z","iopub.execute_input":"2025-11-20T09:55:57.062458Z","iopub.status.idle":"2025-11-20T09:55:57.071910Z","shell.execute_reply.started":"2025-11-20T09:55:57.062429Z","shell.execute_reply":"2025-11-20T09:55:57.070971Z"}},"outputs":[],"execution_count":null}]}