{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[]},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"competition","sourceId":59093,"databundleVersionId":7469972}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"! pip install focal-loss-torch","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:17.818598Z","iopub.execute_input":"2025-01-24T05:50:17.818874Z","iopub.status.idle":"2025-01-24T05:50:22.888619Z","shell.execute_reply.started":"2025-01-24T05:50:17.818852Z","shell.execute_reply":"2025-01-24T05:50:22.887595Z"},"trusted":true},"outputs":[{"name":"stdout","text":"Collecting focal-loss-torch\n  Downloading focal_loss_torch-0.1.2-py3-none-any.whl.metadata (2.2 kB)\nRequirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from focal-loss-torch) (2.4.1+cu121)\nRequirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from focal-loss-torch) (1.26.4)\nRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (3.16.1)\nRequirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (4.12.2)\nRequirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (1.13.3)\nRequirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (3.3)\nRequirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (3.1.4)\nRequirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch->focal-loss-torch) (2024.6.1)\nRequirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->focal-loss-torch) (2.1.5)\nRequirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->focal-loss-torch) (1.3.0)\nDownloading focal_loss_torch-0.1.2-py3-none-any.whl (4.5 kB)\nInstalling collected packages: focal-loss-torch\nSuccessfully installed focal-loss-torch-0.1.2\n","output_type":"stream"}],"execution_count":1},{"cell_type":"markdown","source":"# HMS - Harmful Brain Activity Classification","metadata":{"id":"3_jzt7rCE5PA"}},{"cell_type":"markdown","source":"TODOS\n\n1. Graph of uniques sum_of #votes against cont of #eeg_samples  ## Done\n2. confidence vs #samples eg 100% -- no of samples with 100% votes ## Done\n3. do your own inference about this data and share plots \n4. make a csv of eeg_id,eeg_sub_it for 100% sure class consensus\n5, come up with your idea for this\n","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\n# Example arrays\narr1 = np.array([1, 2, 3])\narr2 = np.array([4, 5, 6])\narr3 = np.array([7, 8, 9])\n\n# Dictionary of arrays\narrays_dict = {\n    'arr1': arr1,\n    'arr2': arr2,\n    'arr3': arr3\n}\n\n# Saving arrays using kwargs (by unpacking the dictionary)\nnp.savez_compressed('arrays_data.npz', **arrays_dict)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T05:50:22.890043Z","iopub.execute_input":"2025-01-24T05:50:22.890379Z","iopub.status.idle":"2025-01-24T05:50:22.897998Z","shell.execute_reply.started":"2025-01-24T05:50:22.890348Z","shell.execute_reply":"2025-01-24T05:50:22.897196Z"}},"outputs":[],"execution_count":2},{"cell_type":"code","source":"ld=np.load('arrays_data.npz')\nld.files","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T05:50:22.899643Z","iopub.execute_input":"2025-01-24T05:50:22.899925Z","iopub.status.idle":"2025-01-24T05:50:22.919433Z","shell.execute_reply.started":"2025-01-24T05:50:22.899897Z","shell.execute_reply":"2025-01-24T05:50:22.918682Z"}},"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"['arr1', 'arr2', 'arr3']"},"metadata":{}}],"execution_count":3},{"cell_type":"code","source":"import numpy as np\nimport time\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tqdm import tqdm\nfrom tqdm.notebook import tqdm as jptq\nimport sys\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn import CrossEntropyLoss\nimport torch.utils.data as data\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\nfrom torch.utils.data import Dataset, TensorDataset, DataLoader\nimport torch.optim as optim\nfrom bisect import bisect_left\nfrom focal_loss.focal_loss import FocalLoss\n\nimport warnings\nimport pickle\nimport subprocess\nimport traceback\nfrom concurrent.futures import ProcessPoolExecutor, as_completed, ThreadPoolExecutor\nimport os\nwarnings.filterwarnings('ignore')\n\nfrom transformers import Wav2Vec2ForSequenceClassification, Wav2Vec2Processor\nfrom sklearn.preprocessing import StandardScaler\nfrom scipy.signal import resample\nfrom sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score\n\nfrom sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score\nfrom sklearn.metrics import roc_auc_score, precision_recall_curve, cohen_kappa_score, classification_report\n\nfrom IPython.display import FileLink, display","metadata":{"id":"a6684e18","execution":{"iopub.status.busy":"2025-01-24T05:50:22.920836Z","iopub.execute_input":"2025-01-24T05:50:22.921087Z","iopub.status.idle":"2025-01-24T05:50:29.820233Z","shell.execute_reply.started":"2025-01-24T05:50:22.921067Z","shell.execute_reply":"2025-01-24T05:50:29.819558Z"},"trusted":true},"outputs":[],"execution_count":4},{"cell_type":"markdown","source":"## LOADING THE DATASET","metadata":{"id":"Jeaws__qE5PH"}},{"cell_type":"code","source":"model_folder_path=\"/kaggle/input/model_0_0/transformers/default/3\"\nmodel_path=\"/kaggle/input/model_0_0/transformers/default/3/model_2.pkl\"\ndataset_folder_path=\"/kaggle/input/new-dataset-0\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T05:50:29.821038Z","iopub.execute_input":"2025-01-24T05:50:29.821581Z","iopub.status.idle":"2025-01-24T05:50:29.825271Z","shell.execute_reply.started":"2025-01-24T05:50:29.821549Z","shell.execute_reply":"2025-01-24T05:50:29.82452Z"}},"outputs":[],"execution_count":5},{"cell_type":"code","source":"BASE_DIR = \"/kaggle/input/hms-harmful-brain-activity-classification/\"\ndf = pd.read_csv(f\"{BASE_DIR}train.csv\")\ndf['total_votes'] = df['seizure_vote']+df['lpd_vote']+df['gpd_vote']+df['lrda_vote']+df['grda_vote']+df['other_vote']\ndf['seizure_vote_normed'] = df['seizure_vote']/df['total_votes']\ndf['lpd_vote_normed'] = df['lpd_vote']/df['total_votes']\ndf['gpd_vote_normed'] = df['gpd_vote']/df['total_votes']\ndf['lrda_vote_normed'] = df['lrda_vote']/df['total_votes']\ndf['grda_vote_normed'] = df['grda_vote']/df['total_votes']\ndf['other_vote_normed'] = df['other_vote']/df['total_votes']\n\ntarget_encoding = {'Seizure':0, 'LPD':1, 'GPD':2, 'LRDA':3, 'GRDA':4, 'Other':5,\n                   'seizure':0, 'lpd':1, 'gpd':2, 'lrda':3, 'grda':4, 'other':5,\n                   0:'seizure', 1:'lpd', 2:'gpd', 3:'lrda', 4:'grda', 5:'other'}\ntotal_targets = 6\ndf.head()","metadata":{"id":"ab2bfbe1","outputId":"3e9fd5d9-f66a-4ead-e3a3-676461244431","execution":{"iopub.status.busy":"2025-01-24T05:50:29.826047Z","iopub.execute_input":"2025-01-24T05:50:29.826307Z","iopub.status.idle":"2025-01-24T05:50:30.096733Z","shell.execute_reply.started":"2025-01-24T05:50:29.826286Z","shell.execute_reply":"2025-01-24T05:50:30.095921Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":"       eeg_id  eeg_sub_id  eeg_label_offset_seconds  spectrogram_id  \\\n0  1628180742           0                       0.0          353733   \n1  1628180742           1                       6.0          353733   \n2  1628180742           2                       8.0          353733   \n3  1628180742           3                      18.0          353733   \n4  1628180742           4                      24.0          353733   \n\n   spectrogram_sub_id  spectrogram_label_offset_seconds    label_id  \\\n0                   0                               0.0   127492639   \n1                   1                               6.0  3887563113   \n2                   2                               8.0  1142670488   \n3                   3                              18.0  2718991173   \n4                   4                              24.0  3080632009   \n\n   patient_id expert_consensus  seizure_vote  ...  lrda_vote  grda_vote  \\\n0       42516          Seizure             3  ...          0          0   \n1       42516          Seizure             3  ...          0          0   \n2       42516          Seizure             3  ...          0          0   \n3       42516          Seizure             3  ...          0          0   \n4       42516          Seizure             3  ...          0          0   \n\n   other_vote  total_votes  seizure_vote_normed  lpd_vote_normed  \\\n0           0            3                  1.0              0.0   \n1           0            3                  1.0              0.0   \n2           0            3                  1.0              0.0   \n3           0            3                  1.0              0.0   \n4           0            3                  1.0              0.0   \n\n   gpd_vote_normed  lrda_vote_normed  grda_vote_normed  other_vote_normed  \n0              0.0               0.0               0.0                0.0  \n1              0.0               0.0               0.0                0.0  \n2              0.0               0.0               0.0                0.0  \n3              0.0               0.0               0.0                0.0  \n4              0.0               0.0               0.0                0.0  \n\n[5 rows x 22 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>eeg_id</th>\n      <th>eeg_sub_id</th>\n      <th>eeg_label_offset_seconds</th>\n      <th>spectrogram_id</th>\n      <th>spectrogram_sub_id</th>\n      <th>spectrogram_label_offset_seconds</th>\n      <th>label_id</th>\n      <th>patient_id</th>\n      <th>expert_consensus</th>\n      <th>seizure_vote</th>\n      <th>...</th>\n      <th>lrda_vote</th>\n      <th>grda_vote</th>\n      <th>other_vote</th>\n      <th>total_votes</th>\n      <th>seizure_vote_normed</th>\n      <th>lpd_vote_normed</th>\n      <th>gpd_vote_normed</th>\n      <th>lrda_vote_normed</th>\n      <th>grda_vote_normed</th>\n      <th>other_vote_normed</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1628180742</td>\n      <td>0</td>\n      <td>0.0</td>\n      <td>353733</td>\n      <td>0</td>\n      <td>0.0</td>\n      <td>127492639</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1628180742</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>353733</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>3887563113</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1628180742</td>\n      <td>2</td>\n      <td>8.0</td>\n      <td>353733</td>\n      <td>2</td>\n      <td>8.0</td>\n      <td>1142670488</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>1628180742</td>\n      <td>3</td>\n      <td>18.0</td>\n      <td>353733</td>\n      <td>3</td>\n      <td>18.0</td>\n      <td>2718991173</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1628180742</td>\n      <td>4</td>\n      <td>24.0</td>\n      <td>353733</td>\n      <td>4</td>\n      <td>24.0</td>\n      <td>3080632009</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 22 columns</p>\n</div>"},"metadata":{}}],"execution_count":6},{"cell_type":"markdown","source":"## DATA ANALYSIS\n\n### Dataframe attributes and Important results\n1. **`shape`**: (106800, 15)\n2. `df.isnull().any() = False` (for all columns)\n\n### Columns:\n\n1. **`eeg_id`**: Unique identifier for the entire EEG recording. It represents a specific EEG session or recording from a patient.\n\n2. **`eeg_sub_id`**: An ID for the specific 50-second long subsample to which the row's labels apply. This column helps identify a particular subset or segment within the larger EEG recording.\n\n3. **`eeg_label_offset_seconds`**: The time between the beginning of the consolidated EEG and the subsample. It indicates the time offset for the EEG subsample within the entire EEG recording.\n\n4. **`spectrogram_id`**: Unique identifier for the entire EEG recording, similar to `eeg_id`. It is related to the spectrogram data.\n\n5. **`spectrogram_sub_id`**: An ID for the specific 10-minute subsample to which the row's labels apply. This corresponds to a subset within the larger spectrogram data.\n\n6. **`spectrogram_label_offset_seconds`**: The time between the beginning of the consolidated spectrogram and the subsample. It indicates the time offset for the spectrogram subsample within the entire spectrogram recording.\n\n7. **`label_id`**: An ID for this set of labels. It helps distinguish different sets of labels within the dataset.\n\n8. **`patient_id`**: An ID for the patient who donated the data. It uniquely identifies each patient.\n\n9. **`expert_consensus`**: The consensus annotator label for convenience. This column may provide a summary or agreement among expert annotators regarding the type of brain activity in the given subsample.\n\n10. **`seizure_vote`**, **`lpd_vote`**, **`gpd_vote`**, **`lrda_vote`**, **`grda_vote`**, **`other_vote`**: These columns represent the count of annotator votes for specific brain activity classes. The classes are:\n    - `seizure_vote`: Count of votes for seizure.\n    - `lpd_vote`: Count of votes for lateralized periodic discharges.\n    - `gpd_vote`: Count of votes for generalized periodic discharges.\n    - `lrda_vote`: Count of votes for lateralized rhythmic delta activity.\n    - `grda_vote`: Count of votes for generalized rhythmic delta activity.\n    - `other_vote`: Count of votes for other types of brain activity.\n\n11. **Target Variable**: The target variable in this dataset is the actual brain activity class for each subsample. It could be any of the following:\n    - Seizure (`seizure_vote`): Represents the count of votes for seizure.\n    - Lateralized Periodic Discharges (`lpd_vote`): Represents the count of votes for lateralized periodic discharges.\n    - Generalized Periodic Discharges (`gpd_vote`): Represents the count of votes for generalized periodic discharges.\n    - Lateralized Rhythmic Delta Activity (`lrda_vote`): Represents the count of votes for lateralized rhythmic delta activity.\n    - Generalized Rhythmic Delta Activity (`grda_vote`): Represents the count of votes for generalized rhythmic delta activity.\n    - Other (`other_vote`): Represents the count of votes for other types of brain activity.\n\nThe target variable is the type of brain activity class (seizure, lpd, gpd, lrda, grda, other), and the goal of the competition or analysis is likely to predict or classify the correct brain activity class for each EEG subsample.","metadata":{"id":"24fe4409"}},{"cell_type":"code","source":"object_columns = df.select_dtypes(include=['object', 'bool']).columns\n# print(\"Object type columns:\")\n# print(object_columns)\nnumerical_columns = df.select_dtypes(include=['int64', 'float64']).columns\n# print(\"\\nNumerical type columns:\")\n# print(numerical_columns)","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.097509Z","iopub.execute_input":"2025-01-24T05:50:30.097752Z","iopub.status.idle":"2025-01-24T05:50:30.123905Z","shell.execute_reply.started":"2025-01-24T05:50:30.097732Z","shell.execute_reply":"2025-01-24T05:50:30.122786Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":7},{"cell_type":"markdown","source":"### Datatype analysis","metadata":{}},{"cell_type":"code","source":"# for col in df.columns:\n#     print(col)\n#     if not isinstance(df[col][0], str):\n#         for i,el in enumerate(tqdm(df[col])):\n#             if int(el)!=el:\n#                 print(i, el)","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.126209Z","iopub.execute_input":"2025-01-24T05:50:30.12647Z","iopub.status.idle":"2025-01-24T05:50:30.129556Z","shell.execute_reply.started":"2025-01-24T05:50:30.12645Z","shell.execute_reply":"2025-01-24T05:50:30.128846Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":8},{"cell_type":"code","source":"# Seen\ndef classify_features(df):\n    categorical_features = []\n    non_categorical_features = []\n    discrete_features = []\n    continuous_features = []\n    for column in df.columns:\n        if df[column].dtype in ['object', 'bool']:\n            if df[column].nunique() < 15:\n                categorical_features.append(column)\n            else:\n                non_categorical_features.append(column)\n        elif df[column].dtype in ['int64', 'float64']:\n            if df[column].nunique() < 10:\n                discrete_features.append(column)\n            else:\n                continuous_features.append(column)\n    return categorical_features, non_categorical_features, discrete_features, continuous_features\n\ncategorical, non_categorical, discrete, continuous = classify_features(df)\nprint(\"Categorical Features:\", categorical)\nprint(\"Non-Categorical Features:\", non_categorical)\nprint(\"Discrete Features:\", discrete)\nprint(\"Continuous Features:\", continuous)\nprint()\nfor i in categorical:\n    print(df[i].value_counts())\n    print()","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.130745Z","iopub.execute_input":"2025-01-24T05:50:30.130999Z","iopub.status.idle":"2025-01-24T05:50:30.188013Z","shell.execute_reply.started":"2025-01-24T05:50:30.130952Z","shell.execute_reply":"2025-01-24T05:50:30.187314Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[{"name":"stdout","text":"Categorical Features: ['expert_consensus']\nNon-Categorical Features: []\nDiscrete Features: []\nContinuous Features: ['eeg_id', 'eeg_sub_id', 'eeg_label_offset_seconds', 'spectrogram_id', 'spectrogram_sub_id', 'spectrogram_label_offset_seconds', 'label_id', 'patient_id', 'seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote', 'grda_vote', 'other_vote', 'total_votes', 'seizure_vote_normed', 'lpd_vote_normed', 'gpd_vote_normed', 'lrda_vote_normed', 'grda_vote_normed', 'other_vote_normed']\n\nexpert_consensus\nSeizure    20933\nGRDA       18861\nOther      18808\nGPD        16702\nLRDA       16640\nLPD        14856\nName: count, dtype: int64\n\n","output_type":"stream"}],"execution_count":9},{"cell_type":"code","source":"desc=df.describe()\ndesc.loc['unique_count'] = [len(df[col].unique()) for col in desc.columns]\nint_index=['count', 'min', '25%', '50%', '75%', 'max', 'unique_count']\nint_columns=['eeg_id', 'eeg_sub_id', 'eeg_label_offset_seconds', 'spectrogram_id',\n             'spectrogram_sub_id', 'spectrogram_label_offset_seconds', 'label_id',\n             'patient_id', 'seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote',\n             'grda_vote', 'other_vote', 'total_votes']\nfor col in int_columns:\n    desc[col] = desc[col].astype(object)\n    for ix in int_index:\n        desc.at[ix,col] = int(desc.at[ix,col])\ndesc","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.188785Z","iopub.execute_input":"2025-01-24T05:50:30.188975Z","iopub.status.idle":"2025-01-24T05:50:30.319143Z","shell.execute_reply.started":"2025-01-24T05:50:30.188958Z","shell.execute_reply":"2025-01-24T05:50:30.318236Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"                         eeg_id eeg_sub_id eeg_label_offset_seconds  \\\ncount                    106800     106800                   106800   \nmean           2104387418.18559  26.286189               118.817228   \nstd           1233370640.943936  69.757658               314.557803   \nmin                      568657          0                        0   \n25%                  1026895611          1                        6   \n50%                  2071325747          5                       26   \n75%                  3172786955         16                       82   \nmax                  4294958358        742                     3372   \nunique_count              17089        743                     1502   \n\n                 spectrogram_id spectrogram_sub_id  \\\ncount                    106800             106800   \nmean          1067262422.410206          43.733596   \nstd            629147497.031789         104.292116   \nmin                      353733                  0   \n25%                   523862583                  2   \n50%                  1057904259                  8   \n75%                  1623195435                 29   \nmax                  2147388374               1021   \nunique_count              11138               1022   \n\n             spectrogram_label_offset_seconds           label_id  \\\ncount                                  106800             106800   \nmean                               520.431404  2141414769.275365   \nstd                               1449.759868  1241669702.709632   \nmin                                         0                338   \n25%                                        12         1067419431   \n50%                                        62         2138331961   \n75%                                       394         3217815860   \nmax                                     17632         4294933502   \nunique_count                             4686             106800   \n\n                patient_id seizure_vote  lpd_vote  ... lrda_vote grda_vote  \\\ncount               106800       106800    106800  ...    106800    106800   \nmean          32304.428493     0.878024  1.138783  ...  0.948296  1.059185   \nstd           18538.196252     1.538873  2.818845  ...  2.136799  2.228492   \nmin                     56            0         0  ...         0         0   \n25%                  16707            0         0  ...         0         0   \n50%                  32068            0         0  ...         0         0   \n75%                  48036            1         1  ...         1         1   \nmax                  65494           19        18  ...        15        15   \nunique_count          1950           18        19  ...        16        16   \n\n             other_vote total_votes seizure_vote_normed  lpd_vote_normed  \\\ncount            106800      106800       106800.000000    106800.000000   \nmean           1.966283    7.255496            0.208319         0.132120   \nstd             3.62118    5.645681            0.378275         0.277731   \nmin                   0           1            0.000000         0.000000   \n25%                   0           3            0.000000         0.000000   \n50%                   0           3            0.000000         0.000000   \n75%                   2          13            0.200000         0.066667   \nmax                  25          28            1.000000         1.000000   \nunique_count         26          26          106.000000       129.000000   \n\n              gpd_vote_normed  lrda_vote_normed  grda_vote_normed  \\\ncount           106800.000000     106800.000000     106800.000000   \nmean                 0.128533          0.138913          0.179294   \nstd                  0.276172          0.280059          0.336370   \nmin                  0.000000          0.000000          0.000000   \n25%                  0.000000          0.000000          0.000000   \n50%                  0.000000          0.000000          0.000000   \n75%                  0.000000          0.076923          0.153846   \nmax                  1.000000          1.000000          1.000000   \nunique_count       109.000000        101.000000        107.000000   \n\n              other_vote_normed  \ncount             106800.000000  \nmean                   0.212822  \nstd                    0.315197  \nmin                    0.000000  \n25%                    0.000000  \n50%                    0.000000  \n75%                    0.333333  \nmax                    1.000000  \nunique_count         139.000000  \n\n[9 rows x 21 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>eeg_id</th>\n      <th>eeg_sub_id</th>\n      <th>eeg_label_offset_seconds</th>\n      <th>spectrogram_id</th>\n      <th>spectrogram_sub_id</th>\n      <th>spectrogram_label_offset_seconds</th>\n      <th>label_id</th>\n      <th>patient_id</th>\n      <th>seizure_vote</th>\n      <th>lpd_vote</th>\n      <th>...</th>\n      <th>lrda_vote</th>\n      <th>grda_vote</th>\n      <th>other_vote</th>\n      <th>total_votes</th>\n      <th>seizure_vote_normed</th>\n      <th>lpd_vote_normed</th>\n      <th>gpd_vote_normed</th>\n      <th>lrda_vote_normed</th>\n      <th>grda_vote_normed</th>\n      <th>other_vote_normed</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>count</th>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>...</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800</td>\n      <td>106800.000000</td>\n      <td>106800.000000</td>\n      <td>106800.000000</td>\n      <td>106800.000000</td>\n      <td>106800.000000</td>\n      <td>106800.000000</td>\n    </tr>\n    <tr>\n      <th>mean</th>\n      <td>2104387418.18559</td>\n      <td>26.286189</td>\n      <td>118.817228</td>\n      <td>1067262422.410206</td>\n      <td>43.733596</td>\n      <td>520.431404</td>\n      <td>2141414769.275365</td>\n      <td>32304.428493</td>\n      <td>0.878024</td>\n      <td>1.138783</td>\n      <td>...</td>\n      <td>0.948296</td>\n      <td>1.059185</td>\n      <td>1.966283</td>\n      <td>7.255496</td>\n      <td>0.208319</td>\n      <td>0.132120</td>\n      <td>0.128533</td>\n      <td>0.138913</td>\n      <td>0.179294</td>\n      <td>0.212822</td>\n    </tr>\n    <tr>\n      <th>std</th>\n      <td>1233370640.943936</td>\n      <td>69.757658</td>\n      <td>314.557803</td>\n      <td>629147497.031789</td>\n      <td>104.292116</td>\n      <td>1449.759868</td>\n      <td>1241669702.709632</td>\n      <td>18538.196252</td>\n      <td>1.538873</td>\n      <td>2.818845</td>\n      <td>...</td>\n      <td>2.136799</td>\n      <td>2.228492</td>\n      <td>3.62118</td>\n      <td>5.645681</td>\n      <td>0.378275</td>\n      <td>0.277731</td>\n      <td>0.276172</td>\n      <td>0.280059</td>\n      <td>0.336370</td>\n      <td>0.315197</td>\n    </tr>\n    <tr>\n      <th>min</th>\n      <td>568657</td>\n      <td>0</td>\n      <td>0</td>\n      <td>353733</td>\n      <td>0</td>\n      <td>0</td>\n      <td>338</td>\n      <td>56</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>25%</th>\n      <td>1026895611</td>\n      <td>1</td>\n      <td>6</td>\n      <td>523862583</td>\n      <td>2</td>\n      <td>12</td>\n      <td>1067419431</td>\n      <td>16707</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>50%</th>\n      <td>2071325747</td>\n      <td>5</td>\n      <td>26</td>\n      <td>1057904259</td>\n      <td>8</td>\n      <td>62</td>\n      <td>2138331961</td>\n      <td>32068</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>75%</th>\n      <td>3172786955</td>\n      <td>16</td>\n      <td>82</td>\n      <td>1623195435</td>\n      <td>29</td>\n      <td>394</td>\n      <td>3217815860</td>\n      <td>48036</td>\n      <td>1</td>\n      <td>1</td>\n      <td>...</td>\n      <td>1</td>\n      <td>1</td>\n      <td>2</td>\n      <td>13</td>\n      <td>0.200000</td>\n      <td>0.066667</td>\n      <td>0.000000</td>\n      <td>0.076923</td>\n      <td>0.153846</td>\n      <td>0.333333</td>\n    </tr>\n    <tr>\n      <th>max</th>\n      <td>4294958358</td>\n      <td>742</td>\n      <td>3372</td>\n      <td>2147388374</td>\n      <td>1021</td>\n      <td>17632</td>\n      <td>4294933502</td>\n      <td>65494</td>\n      <td>19</td>\n      <td>18</td>\n      <td>...</td>\n      <td>15</td>\n      <td>15</td>\n      <td>25</td>\n      <td>28</td>\n      <td>1.000000</td>\n      <td>1.000000</td>\n      <td>1.000000</td>\n      <td>1.000000</td>\n      <td>1.000000</td>\n      <td>1.000000</td>\n    </tr>\n    <tr>\n      <th>unique_count</th>\n      <td>17089</td>\n      <td>743</td>\n      <td>1502</td>\n      <td>11138</td>\n      <td>1022</td>\n      <td>4686</td>\n      <td>106800</td>\n      <td>1950</td>\n      <td>18</td>\n      <td>19</td>\n      <td>...</td>\n      <td>16</td>\n      <td>16</td>\n      <td>26</td>\n      <td>26</td>\n      <td>106.000000</td>\n      <td>129.000000</td>\n      <td>109.000000</td>\n      <td>101.000000</td>\n      <td>107.000000</td>\n      <td>139.000000</td>\n    </tr>\n  </tbody>\n</table>\n<p>9 rows × 21 columns</p>\n</div>"},"metadata":{}}],"execution_count":10},{"cell_type":"code","source":"def show_aggregate_distribution(df=df, grp_col='total_votes', agg='count', agg_col='total_votes', return_agg=False):\n    tv = df.groupby(grp_col).agg({agg_col:agg})\n    # fig = plt.figure(figsize=(12,8),)\n    fig = plt.figure()\n    plt.xticks(tv.index)\n    plt.plot(np.array(tv.index), np.array(tv))\n    plt.xlabel('Index')\n    plt.ylabel(agg_col)\n    plt.title(f'{agg_col} by Index')\n    \n    plt.tight_layout()\n    plt.show()\n    if return_agg:\n        return tv\n\nshow_aggregate_distribution()","metadata":{"id":"8ee6e8ce","execution":{"iopub.status.busy":"2025-01-24T05:50:30.320028Z","iopub.execute_input":"2025-01-24T05:50:30.32028Z","iopub.status.idle":"2025-01-24T05:50:30.699015Z","shell.execute_reply.started":"2025-01-24T05:50:30.32026Z","shell.execute_reply":"2025-01-24T05:50:30.698143Z"},"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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JgICAoRWqy33uVZWz9mzZ8XgwYOFt7e3cHFxEe3atSu1/Ym1yYoaS0REREQ1HOfYEREREdUSDHZEREREtQSDHREREVEtwWBHREREVEsw2BERERHVEgx2RERERLUEgx0RERFRLcFgR0RERFRLMNgREdmBTCbD+vXr7d0MIqplGOyIiEz03HPPYdCgQfZuBhFRKQx2RERERLUEgx0RURV0794dkyZNwhtvvAEvLy/4+vpi5syZBmUSEhLw8MMPw8nJCWFhYdi+fXupei5duoShQ4fC09MTXl5eGDhwIJKSkgAAp0+fhouLC3766Sep/Jo1a+Ds7IyTJ09a8+kRUQ3DYEdEVEXfffcdXF1dsW/fPsydOxezZs2SwptOp8PgwYOhVCqxb98+LFmyBG+++abB/fPz8xEVFQV3d3fs2bMHe/fuhZubG/r06QONRoPQ0FB88skneOWVV5CcnIzLly9j7Nix+OijjxAWFmaPp0xE1ZRMCCHs3QgioprkueeeQ1paGtavX4/u3btDq9Viz5490u1dunRBjx498OGHH+L3339Hv379cPHiRfj5+QEAYmJi0LdvX6xbtw6DBg3CypUr8d577+HUqVOQyWQAAI1GA09PT6xfvx69e/cGADz++OPIyMiAUqmEQqFATEyMVJ6ICAAc7N0AIqKarl27dgY/N2rUCNevXwcAnDp1CgEBAVKoA4DIyEiD8kePHsW5c+fg7u5ucD03Nxfnz5+Xfv7222/RokULyOVynDhxgqGOiEphsCMiqiJHR0eDn2UyGXQ6ndH3z8rKQkREBH788cdStzVs2FD6/ujRo8jOzoZcLse1a9fQqFEj8xtNRLUSgx0RkRW1atUKly5dMghi//77r0GZjh07YvXq1fD29oZarS6zntu3b+O5557DW2+9hWvXruGZZ57B4cOH4ezsbPXnQEQ1BxdPEBFZUa9evdCiRQuMGjUKR48exZ49e/DWW28ZlHnmmWfQoEEDDBw4EHv27EFiYiJ27dqFSZMm4fLlywCAsWPHIiAgANOnT8dnn30GrVaL1157zR5PiYiqMQY7IiIrksvlWLduHe7evYsuXbrghRdewPvvv29QxsXFBX/99RcCAwMxePBgtGrVCmPGjEFubi7UajW+//57bNmyBT/88AMcHBzg6uqKlStX4uuvv8bWrVvt9MyIqDriqlgiIiKiWoI9dkRERES1BIMdERERUS3BYEdERERUSzDYEREREdUSDHZEREREtQSDHREREVEtwWBHREREVEsw2BERERHVEgx2RERERLUEgx0RERFRLcFgR0RERFRLMNgRERER1RL/D139n5RvqIYuAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":11},{"cell_type":"markdown","source":"### Complete the confidence filtering","metadata":{}},{"cell_type":"code","source":"def get_col_ix(col_id): #Consistency checked\n    if isinstance(col_id, int):\n        return 9+col_id\n    elif isinstance(col_id, str):\n        return 9+target_encoding[col_id]\n    \ndef get_vote_col(col_id): #Consistency checked\n    if isinstance(col_id, int):\n        return f'{target_encoding[col_id]}_vote'\n    elif isinstance(col_id, str):\n        return f'{col_id}_vote'\n    \ndef get_normed_ix(col_id): #Consistency checked\n    if isinstance(col_id, int):\n        return 16+col_id\n    elif isinstance(col_id, str):\n        return 16+target_encoding[col_id]\n    \ndef get_normed_col(col_id): #Consistency checked\n    if isinstance(col_id, int):\n        return f'{target_encoding[col_id]}_vote_normed'\n    elif isinstance(col_id, str):\n        return f'{col_id}_vote_normed'","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.699792Z","iopub.execute_input":"2025-01-24T05:50:30.700017Z","iopub.status.idle":"2025-01-24T05:50:30.705655Z","shell.execute_reply.started":"2025-01-24T05:50:30.699996Z","shell.execute_reply":"2025-01-24T05:50:30.704728Z"},"trusted":true},"outputs":[],"execution_count":12},{"cell_type":"code","source":"df['confidence'] = df.apply(lambda row: row[get_normed_col(target_encoding[row['expert_consensus']])], axis=1)\ndf['full_confidence'] = (df['confidence'] > 0.999) & (df['confidence'] < 1.001)\n\nbins = [i / 10 for i in range(11)]\nbins[-1]+=0.01 \nlabels = [(i+0.5)/10 for i in range(10)]\ndf['confidence_classes'] = pd.cut(df['confidence'], bins=bins, labels=labels, include_lowest=True)\n\ncon_agg = show_aggregate_distribution(df,'confidence_classes', agg_col='confidence_classes', return_agg=True)\n\nfc_df=df[df['full_confidence']]\nfc_df.drop(columns=['full_confidence', 'confidence_classes'], inplace=True)\n\ncategorical, non_categorical, discrete, continuous = classify_features(fc_df)","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:30.706533Z","iopub.execute_input":"2025-01-24T05:50:30.706804Z","iopub.status.idle":"2025-01-24T05:50:31.893Z","shell.execute_reply.started":"2025-01-24T05:50:30.706783Z","shell.execute_reply":"2025-01-24T05:50:31.892067Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABviklEQVR4nO3deVxUVf8H8M/MwAz7ICCbICiI+5ILRGlakahUbv3UMkUzrTRLrTSfSs16Iq2etCxbzK00t8py19xT0kQxV0REcWMT2ZeBmfP7A+fmBCgMg8MMn/frxavm3jP3fs+M4adz7zlXJoQQICIiIiKLJzd3AURERERkGgx2RERERFaCwY6IiIjISjDYEREREVkJBjsiIiIiK8FgR0RERGQlGOyIiIiIrASDHREREZGVYLAjIiIishIMdkR0V99//z1atWoFW1tbuLq6AgB69eqFXr163fW9e/bsgUwmw549e+q0xvpIJpNh1qxZ5i6jzowaNQpOTk7mLsMoo0aNQmBgoLnLIDI5BjsiuqOzZ89i1KhRCAoKwrfffotvvvnG3CVRAxMYGIjHH3/c3GUQWQQbcxdARPXbnj17oNPpMH/+fAQHB0vbt2/fbsaqiIioMgx2RHRH6enpACBdgtVTKpVmqIaIiO6El2KJLMjVq1cxZswY+Pr6QqVSoVmzZnjppZeg0WikNhcuXMD//d//wc3NDQ4ODrj//vuxadMmg+Po73tbs2YN/vvf/8LPzw92dnZ49NFHcf78ealdYGAgZs6cCQBo3LixwT1jld1jd+XKFQwYMACOjo7w9PTE5MmTUVJSUmlfDh06hD59+kCtVsPBwQE9e/bEgQMHDNrMmjULMpkM58+fx6hRo+Dq6gq1Wo3Ro0ejsLCwwjF/+OEHhIaGwsHBAY0aNcJDDz1UYWRxy5Yt6NGjBxwdHeHs7IyoqCicOnXqzh98JYqLizFr1iyEhITAzs4OPj4+GDRoEJKSkqp8z6VLlzB+/Hi0bNkS9vb2cHd3x//93//h4sWLBu1KS0vx7rvvokWLFrCzs4O7uzu6d++OHTt2SG1SU1MxevRo+Pn5QaVSwcfHB/37969wrOr0t7rHqsqFCxcQGRkJR0dH+Pr6Yvbs2RBCAACEEAgMDET//v0r/QzVajVeeOGFap1H7+LFi5DJZPj444/xzTffICgoCCqVCt26dcNff/1Vof369evRrl072NnZoV27dvjll18qPa5Op8O8efPQtm1b2NnZwcvLCy+88AJu3rwptZk5cybkcjl27txp8N5x48ZBqVTi+PHjNeoLkalxxI7IQly7dg2hoaHIzs7GuHHj0KpVK1y9ehXr1q1DYWEhlEol0tLS8MADD6CwsBCvvPIK3N3dsWzZMjz55JNYt24dBg4caHDMDz/8EHK5HK+//jpycnIwd+5cDB8+HIcOHQIAzJs3D8uXL8cvv/yChQsXwsnJCR06dKi0vqKiIjz66KNISUnBK6+8Al9fX3z//ffYtWtXhba7du1C37590aVLF+kvyiVLluCRRx7B/v37ERoaatB+yJAhaNasGWJiYnD06FEsWrQInp6emDNnjtTm3XffxaxZs/DAAw9g9uzZUCqVOHToEHbt2oXevXsDKJ8EEh0djcjISMyZMweFhYVYuHAhunfvjmPHjlX7ZnqtVovHH38cO3fuxLBhw/Dqq68iLy8PO3bswMmTJxEUFFTp+/766y8cPHgQw4YNg5+fHy5evIiFCxeiV69eOH36NBwcHACUB9qYmBg8//zzCA0NRW5uLo4cOYKjR4/iscceAwAMHjwYp06dwsSJExEYGIj09HTs2LEDKSkpUj+q29/qHOtOn0WfPn1w//33Y+7cudi6dStmzpyJsrIyzJ49GzKZDM8++yzmzp2LrKwsuLm5Se/dsGEDcnNz8eyzz1brc/+3lStXIi8vDy+88AJkMhnmzp2LQYMG4cKFC7C1tQVQfsvA4MGD0aZNG8TExODGjRtSiP23F154AUuXLsXo0aPxyiuvIDk5GQsWLMCxY8dw4MAB2Nra4u2338aGDRswZswYnDhxAs7Ozti2bRu+/fZbvPfee+jYsaNRfSEyGUFEFmHkyJFCLpeLv/76q8I+nU4nhBBi0qRJAoDYv3+/tC8vL080a9ZMBAYGCq1WK4QQYvfu3QKAaN26tSgpKZHazp8/XwAQJ06ckLbNnDlTABAZGRkG5+zZs6fo2bOn9HrevHkCgFizZo20raCgQAQHBwsAYvfu3VKtLVq0EJGRkVLdQghRWFgomjVrJh577LEK537uuecMzj1w4EDh7u4uvU5MTBRyuVwMHDhQ6uO/P5u8vDzh6uoqxo4da7A/NTVVqNXqCtvvZPHixQKA+N///ldh3+19AiBmzpxp0Md/i42NFQDE8uXLpW0dO3YUUVFRVZ7/5s2bAoD46KOPqmxT3f5W51hViY6OFgDExIkTpW06nU5ERUUJpVIp/ZlJSEgQAMTChQsN3v/kk0+KwMBAg8+sMgEBAQafR3JysgAg3N3dRVZWlrT9119/FQDEhg0bpG2dOnUSPj4+Ijs7W9q2fft2AUAEBARI2/bv3y8AiBUrVhice+vWrRW2nzhxQiiVSvH888+LmzdviiZNmoiuXbuK0tLSO/aD6F7gpVgiC6DT6bB+/Xo88cQT6Nq1a4X9MpkMALB582aEhoaie/fu0j4nJyeMGzcOFy9exOnTpw3eN3r0aIN75Xr06AGg/NJaTW3evBk+Pj546qmnpG0ODg4YN26cQbv4+HgkJibimWeewY0bN5CZmYnMzEwUFBTg0Ucfxb59+6DT6Qze8+KLLxq87tGjB27cuIHc3FwA5ZfadDodZsyYAbnc8Nea/rPZsWMHsrOz8fTTT0vnzMzMhEKhQFhYGHbv3l3tvv7000/w8PDAxIkTK+zTn68y9vb20r+Xlpbixo0bCA4OhqurK44ePSrtc3V1xalTp5CYmFjlcZRKJfbs2WNwmfB21e1vdY51Ny+//LL07zKZDC+//DI0Gg1+//13AEBISAjCwsKwYsUKqV1WVha2bNmC4cOH3/Ezu5OhQ4eiUaNG0ut///m9fv064uPjER0dDbVaLbV77LHH0KZNG4NjrV27Fmq1Go899pjB59WlSxc4OTkZ/Plo164d3n33XSxatAiRkZHIzMzEsmXLYGPDi2BkfvxTSGQBMjIykJubi3bt2t2x3aVLlxAWFlZhe+vWraX9tx+jadOmBu30f0ka8xf8pUuXEBwcXOEv6ZYtWxq81oeV6OjoKo+Vk5Nj8Bf2nep0cXFBUlIS5HJ5hb+sKzvvI488Uul+FxeXKt/7b0lJSWjZsmWN/yIvKipCTEwMlixZgqtXr0r3oQHlfdabPXs2+vfvj5CQELRr1w59+vTBiBEjpMvgKpUKc+bMwWuvvQYvLy/cf//9ePzxxzFy5Eh4e3vXqL/VOdadyOVyNG/e3GBbSEgIABjcozdy5Ei8/PLLuHTpEgICArB27VqUlpZixIgRdz1HVe725/fSpUsAgBYtWlR4b8uWLQ3CdGJiInJycuDp6VnpufSTiPTeeOMNrFq1CocPH8YHH3xwxz97RPcSgx1RA6ZQKCrdfnvgMDX9aNxHH32ETp06Vdrm34vemqJO/Xm///77SgPLvRhtmThxIpYsWYJJkyYhPDwcarUaMpkMw4YNMxilfOihh5CUlIRff/0V27dvx6JFi/Dpp5/iq6++wvPPPw8AmDRpEp544gmsX78e27ZtwzvvvIOYmBjs2rUL9913X436e7djmcKwYcMwefJkrFixAv/5z3/www8/oGvXrhWCf02Y8s+vTqeDp6enwaji7Ro3bmzw+sKFC1J4PnHiRI3PR1RXGOyILEDjxo3h4uKCkydP3rFdQEAAEhISKmw/e/astL+uBAQE4OTJkxBCGIza/bse/cQCFxcXREREmOTcQUFB0Ol0OH36dJVhUX9eT0/PWp83KCgIhw4dQmlpqXSTfnWsW7cO0dHR+OSTT6RtxcXFyM7OrtDWzc0No0ePxujRo5Gfn4+HHnoIs2bNkoKdvo7XXnsNr732GhITE9GpUyd88skn+OGHH2rc3zsd6050Oh0uXLggjdIBwLlz5wDAYOKFm5sboqKisGLFCgwfPhwHDhzAvHnz7lpXbej/vFd2SbuyP5e///47HnzwQYNL5pXR6XQYNWoUXFxcMGnSJHzwwQd46qmnMGjQINMVT2Qk3mNHZAHkcjkGDBiADRs24MiRIxX260co+vXrh8OHDyM2NlbaV1BQgG+++QaBgYF1ermoX79+uHbtGtatWydtKywsrPCkii5duiAoKAgff/wx8vPzKxwnIyOjxuceMGAA5HI5Zs+eXeH+PP1nExkZCRcXF3zwwQcoLS2t1XkHDx6MzMxMLFiwoMK+O40WKRSKCvs///xzaLVag203btwweO3k5ITg4GBp6ZjCwkIUFxcbtAkKCoKzs7PUprr9rc6x7ub2z0EIgQULFsDW1haPPvqoQbsRI0bg9OnTeOONN6BQKDBs2LBqHd9YPj4+6NSpE5YtW2ZwqXvHjh0V7jcdMmQItFot3nvvvQrHKSsrMwjf//vf/3Dw4EF88803eO+99/DAAw/gpZdeQmZmZp31hai6OGJHZCE++OADbN++HT179sS4cePQunVrXL9+HWvXrsUff/wBV1dXvPnmm/jxxx/Rt29fvPLKK3Bzc8OyZcuQnJyMn376qcLEAlMaO3YsFixYgJEjRyIuLg4+Pj74/vvvpSU89ORyORYtWoS+ffuibdu2GD16NJo0aYKrV69i9+7dcHFxwYYNG2p07uDgYLz11lt477330KNHDwwaNAgqlQp//fUXfH19ERMTAxcXFyxcuBAjRoxA586dMWzYMDRu3BgpKSnYtGkTHnzwwUqDWmVGjhyJ5cuXY8qUKTh8+DB69OiBgoIC/P777xg/fnyla7YBwOOPP47vv/8earUabdq0QWxsLH7//Xe4u7sbtGvTpg169eqFLl26wM3NDUeOHMG6deukSQrnzp3Do48+iiFDhqBNmzawsbHBL7/8grS0NCksVbe/1TnWndjZ2WHr1q2Ijo5GWFgYtmzZgk2bNuE///lPhcuXUVFRcHd3x9q1a9G3b98q72czpZiYGERFRaF79+547rnnkJWVhc8//xxt27Y1+B+Lnj174oUXXkBMTAzi4+PRu3dv2NraIjExEWvXrsX8+fPx1FNP4cyZM3jnnXcwatQoPPHEEwCApUuXolOnThg/fjzWrFlT530iuiNzTcclopq7dOmSGDlypGjcuLFQqVSiefPmYsKECQZLliQlJYmnnnpKuLq6Cjs7OxEaGio2btxocBz9cidr16412K5fRmLJkiXStuoud6Kv78knnxQODg7Cw8NDvPrqq9JyEfrlTvSOHTsmBg0aJNzd3YVKpRIBAQFiyJAhYufOnXc995IlSwQAkZycbLB98eLF4r777hMqlUo0atRI9OzZU+zYsaNC3yMjI4VarRZ2dnYiKChIjBo1Shw5cqTC530nhYWF4q233hLNmjUTtra2wtvbWzz11FMiKSlJaoN/LXdy8+ZNMXr0aOHh4SGcnJxEZGSkOHv2rAgICBDR0dFSu/fff1+EhoYKV1dXYW9vL1q1aiX++9//Co1GI4QQIjMzU0yYMEG0atVKODo6CrVaLcLCwgyWmqluf2tyrH+Ljo4Wjo6OIikpSfTu3Vs4ODgILy8vMXPmzArLzuiNHz9eABArV66szscshKh6uZPKlmj592cuhBA//fSTaN26tVCpVKJNmzbi559/FtHR0QbLneh98803okuXLsLe3l44OzuL9u3bi6lTp4pr166JsrIy0a1bN+Hn52ewfIoQ/ywVtHr16mr3i6guyISow7ukiYiIbjN58mR89913SE1NrTCaS0S1x3vsiIjoniguLsYPP/yAwYMHM9QR1RHeY0dEdItGo0FWVtYd26jV6rvOmiRD6enp+P3337Fu3TrcuHEDr776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nMFLL72EgoICjB492iyfCxEREdUv9f2JE3pmHUu8cuUKnn76ady4cQONGzdG9+7d8eeff6Jx48YAgE8//RRyuRyDBw9GSUkJIiMj8eWXX0rvVygU2LhxI1566SWEh4fD0dER0dHRmD17ttSmWbNm2LRpEyZPnoz58+fDz88PixYtQmRkpNRm6NChyMjIwIwZM5CamopOnTph69atFSZUEBERUcN0LrV8ceL6PCMWAGRCCGHuIqxBbm4u1Go1cnJyeL8dERGRFRFCoNPsHcgpKsWmV7qjra/6np6/JhmjXt1jR0RERFTfpOeVIKeoFHIZENS4fo/YMdgRERER3YF+/bpAD0fY2SrMXM2dMdgRERER3YE0I7aeT5wAGOyIiIiI7sgSnjihx2BHREREdAeWsoYdwGBHREREVCWdTuBcWvlSJxyxIyIiIrJgV24WoahUC6VCjkB3B3OXc1cMdkRERERV0D9xIsjTCTaK+h+b6n+FRERERGbyz4zY+r1+nR6DHREREVEVpBmxFjBxAmCwIyIiIqqSJa1hBzDYEREREVWqVKtDUoblzIgFGOyIiIiIKnUxswClWgFHpQJNXO3NXU61MNgRERERVUI/I7aFlzPkcpmZq6keBjsiIiKiSpxLtaz76wAGOyIiIqJK6UfsLGVGLMBgR0RERFQp/aPEOGJHREREZMGKS7W4eKMAABDibRmLEwMMdkREREQVnE/PhxBAIwdbNHZSmbucamOwIyIiIvoX/cLEIV7OkMksY0YswGBHREREVIF+4kRLC5o4ATDYEREREVWgX+rEUp44ocdgR0RERPQv0oxYjtgRERERWa684lJczS4CAIR4MtgRERERWSz9aJ23ix3UDrZmrqZmGOyIiIiIbnPOAp84ocdgR0RERHSbBOkZsZazMLEegx0RERHRbW5fw87SMNgRERER3eacha5hBzDYEREREUky80uQma+BTAYEe/JSLBEREZHF0o/WNXVzgIPSxszV1ByDHREREdEtlvrECT0GOyIiIqJbEvRPnGCwIyIiIrJslryGHcBgR0RERAQAEELcdinW8iZOAAx2RERERACA6znFyCspg41chuYeDHZEREREFivh1mXYZh6OUNpYZkSyzKqJiIiITEy6DGuh99cBDHZEREREAP4ZsbPUGbEAgx0RERERAMt+Rqwegx0RERE1eFqdQKJ+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YVjqd5aTkwMnJycolUpERUXh888/x2OPPSbtt8R+/fHHH/juu+/w7bffVnlcS+xXy5YtsXjxYvz666/44YcfoNPp8MADD+DKlStSG0vs14ULF7Bu3TpotVps3rwZ77zzDj755BO8//77Uhtr+N1x+PBhnDx5Es8//7zBdkv8zp555hnMnj0b3bt3h62tLYKCgtCrVy/85z//kdqY+zszpl+RkZH43//+h8TEROh0OuzYsQM///wzrl+/LrW5p/26J+OCZODq1asCgDh48KDB9jfeeEOEhoZW+h5bW1uxcuVKg21ffPGF8PT0rPI8SUlJAoD4/fffa190NRjTr9tVdSn2327evClcXFzEokWLjC21xmrbt5iYGNGoUSNx/PjxO7azlO9Mq9WKxMREcezYMfHxxx8LtVotdu/eXWX7+t6v3NxcERgYKDZv3ixtq86lrvrer8poNBoRFBRkcOn83yyhXy1atBD+/v6irKxM2vbJJ58Ib2/vKs9jib87xo0bJ9q3b3/Xdpbwne3evVt4eXmJb7/9Vvz999/i559/Fv7+/mL27NlVnudef2fG9Cs9PV30799fyOVyoVAoREhIiBg/fryws7Or8jx12S+O2JmBh4cHFAoF0tLSDLanpaXB29u70vd4e3vXqD0ANG/eHB4eHjh//nzti64GY/plDFdXV4SEhNyzfgG169vHH3+MDz/8ENu3b0eHDh3u2NZSvjO5XI7g4GB06tQJr732Gp566inExMRU2b6+9yspKQkXL17EE088ARsbG9jY2GD58uX47bffYGNjg6SkpErPU9/7VRlbW1vcd999d6zZEvrl4+ODkJAQKBQKaVvr1q2RmpoKjUZT6Xss7XdHQUEBVq1adcdbA/Qs4Tt75513MGLECDz//PNo3749Bg4ciA8++AAxMTHQ6XSVvudef2fG9Ktx48ZYv349CgoKcOnSJZw9exZOTk5o3rx5leepy34x2JmBUqlEly5dsHPnTmmbTqfDzp07ER4eXul7wsPDDdoDwI4dO6psDwBXrlzBjRs34OPjY5rC78KYfhkjPz8fSUlJ96xfgPF9mzt3Lt577z1s3boVXbt2vet5LPU70+l0KCkpqXJ/fe9Xq1atcOLECcTHx0s/Tz75JB5++GHEx8fD39+/0vPU935VRqvV4sSJE3es2RL69eCDD+L8+fMGgeDcuXPw8fGBUqms9D2W9LsDKF/iqqSkBM8+++xdz2MJ31lhYSHkcsPYoQ/mooqnm97r76w235ednR2aNGmCsrIy/PTTT+jfv3+Vbeu0XyYfA6RqWbVqlVCpVGLp0qXi9OnTYty4ccLV1VVahmDEiBHizTfflNofOHBA2NjYiI8//licOXNGzJw502C5k7y8PPH666+L2NhYkZycLH7//XfRuXNn0aJFC1FcXFxv+1VSUiKOHTsmjh07Jnx8fMTrr78ujh07JhITE6U2r732mtizZ49ITk4WBw4cEBEREcLDw0Okp6ffs34Z07cPP/xQKJVKsW7dOoMp7nl5eUIIy/3OPvjgA7F9+3aRlJQkTp8+LT7++GNhY2Mjvv32W4vu17/9+1Kspfbr3XffFdu2bRNJSUkiLi5ODBs2TNjZ2YlTp05ZdL9SUlKEs7OzePnll0VCQoLYuHGj8PT0FO+//77UxlJ/d+h1795dDB06tMJ2S/3OZs6cKZydncWPP/4oLly4ILZv3y6CgoLEkCFDpDb14Turab/+/PNP8dNPP4mkpCSxb98+8cgjj4hmzZqJmzdvmqVfDHZm9Pnnn4umTZsKpVIpQkNDxZ9//int69mzp4iOjjZov2bNGhESEiKUSqVo27at2LRpk7SvsLBQ9O7dWzRu3FjY2tqKgIAAMXbs2ArrVd0LNelXcnKyAFDhp2fPnlKboUOHCh8fH6FUKkWTJk3E0KFDxfnz5+9hj/5Rk74FBARU2reZM2cKISz3O3vrrbdEcHCwsLOzE40aNRLh4eFi1apV0n5L7de//TvYWWq/Jk2aJLX18vIS/fr1M1hfy1L7JYQQBw8eFGFhYUKlUonmzZuL//73vwb33Fnq7w4hhDh79qwAILZv317hWJb6nZWWlopZs2aJoKAgYWdnJ/z9/cX48eMNAlB9+c5q0q89e/aI1q1bC5VKJdzd3cWIESPE1atXDY53L/slE6KK8U8iIiIisii8x46IiIjISjDYEREREVkJBjsiIiIiK8FgR0RERGQlGOyIiIiIrASDHREREZGVYLAjIiIishIMdkRERERWgsGOiMgMZDIZ1q9fb+4yiMjKMNgREdXQqFGjMGDAAHOXQURUAYMdERERkZVgsCMiqoVevXrhlVdewdSpU+Hm5gZvb2/MmjXLoE1iYiIeeugh2NnZoU2bNtixY0eF41y+fBlDhgyBq6sr3Nzc0L9/f1y8eBEAcPbsWTg4OGDlypVS+zVr1sDe3h6nT5+uy+4RkYVhsCMiqqVly5bB0dERhw4dwty5czF79mwpvOl0OgwaNAhKpRKHDh3CV199hWnTphm8v7S0FJGRkXB2dsb+/ftx4MABODk5oU+fPtBoNGjVqhU+/vhjjB8/HikpKbhy5QpefPFFzJkzB23atDFHl4monpIJIYS5iyAisiSjRo1CdnY21q9fj169ekGr1WL//v3S/tDQUDzyyCP48MMPsX37dkRFReHSpUvw9fUFAGzduhV9+/bFL7/8ggEDBuCHH37A+++/jzNnzkAmkwEANBoNXF1dsX79evTu3RsA8PjjjyM3NxdKpRIKhQJbt26V2hMRAYCNuQsgIrJ0HTp0MHjt4+OD9PR0AMCZM2fg7+8vhToACA8PN2h//PhxnD9/Hs7Ozgbbi4uLkZSUJL1evHgxQkJCIJfLcerUKYY6IqqAwY6IqJZsbW0NXstkMuh0umq/Pz8/H126dMGKFSsq7GvcuLH078ePH0dBQQHkcjmuX78OHx8f44smIqvEYEdEVIdat26Ny5cvGwSxP//806BN586dsXr1anh6esLFxaXS42RlZWHUqFF46623cP36dQwfPhxHjx6Fvb19nfeBiCwHJ08QEdWhiIgIhISEIDo6GsePH8f+/fvx1ltvGbQZPnw4PDw80L9/f+zfvx/JycnYs2cPXnnlFVy5cgUA8OKLL8Lf3x9vv/02/ve//0Gr1eL11183R5eIqB5jsCMiqkNyuRy//PILioqKEBoaiueffx7//e9/Ddo4ODhg3759aNq0KQYNGoTWrVtjzJgxKC4uhouLC5YvX47Nmzfj+++/h42NDRwdHfHDDz/g22+/xZYtW8zUMyKqjzgrloiIiMhKcMSOiIiIyEow2BERERFZCQY7IiIiIivBYEdERERkJRjsiIiIiKwEgx0RERGRlWCwIyIiIrISDHZEREREVoLBjoiIiMhKMNgRERERWQkGOyIiIiIrwWBHREREZCX+H8TcbMIWdIatAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":13},{"cell_type":"code","source":"tv_agg = show_aggregate_distribution(fc_df, return_agg=True)\ntv_agg","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:31.894146Z","iopub.execute_input":"2025-01-24T05:50:31.894389Z","iopub.status.idle":"2025-01-24T05:50:32.252859Z","shell.execute_reply.started":"2025-01-24T05:50:31.894361Z","shell.execute_reply":"2025-01-24T05:50:32.251883Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAnUAAAHWCAYAAAARl3+JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABw5UlEQVR4nO3deViU5eI+8HtmYIZ1QFRABBF3ccHEJFo1STSOadpJy2NoVkfDTDmpeTJzqSxb1HLLY6l9zVL7pZWWRi5YiUsquZMphhu4MsM+MPP8/sD3hRFkmYUZ8P5c11zOvO8zzzwzstw826sQQggQERERUb2mdHQDiIiIiMh6DHVEREREDQBDHREREVEDwFBHRERE1AAw1BERERE1AAx1RERERA0AQx0RERFRA8BQR0RERNQAMNQRERERNQAMdURUr5w9exYKhQIrV650dFMcYsaMGVAoFLh69aqjm1JrUtuJyD4Y6oioxnbv3o0ZM2YgOzvb4joWL15c7wPZxYsXMWPGDKSmpjq6KXbTq1cvdO7c2dHNIKJaYKgjohrbvXs3Zs6cyVB38SJmzpzZoEMdEdU/DHVEREREDQBDHRHVyIwZMzBp0iQAQFhYGBQKBRQKBc6ePQsAKCkpwezZs9G6dWtoNBq0bNkS//3vf1FUVCTX0bJlSxw7dgzJycny83v16gUAuH79Ol555RV06dIFXl5e0Gq16N+/P/744w+r2p2VlQUXFxfMnDmzwrm0tDQoFAosXLhQPnbmzBn885//hJ+fHzw8PHDPPfdg8+bN8vmdO3fi7rvvBgCMGjVKfh/lex/37t2Lfv36wcfHBx4eHnjooYfw22+/mb12Tk4OJkyYgJYtW0Kj0cDf3x+PPPIIDh48WKP3dfXqVTz55JPQarVo3LgxXn75ZRQWFsrnH3roIURERFT63Pbt2yM2NrZGr1OeQqHAuHHjsHHjRnTu3BkajQadOnXCli1bKpT99ddfcffdd8PNzQ2tW7fGJ598ctt6V69ejcjISLi7u8PPzw/Dhg3DuXPn5PMrVqyAQqHAZ599Zva8t99+GwqFAj/88EOt3wtRgySIiGrgjz/+EE899ZQAIObNmyf+7//+T/zf//2fyM3NFUIIER8fLwCIJ554QixatEg888wzAoAYNGiQXMeGDRtEcHCw6NChg/z8n376SQghxP79+0Xr1q3Fq6++Kj755BMxa9Ys0bx5c+Hj4yMuXLgg15Geni4AiBUrVtS47Q8//LAIDw+vcHzmzJlCpVKJzMxMIYQQmZmZIiAgQHh7e4vXXntNfPjhhyIiIkIolUrxzTffyGVmzZolAIgXXnhBfh+nT58WQgixbds2oVarRXR0tPjggw/EvHnzRNeuXYVarRZ79+6VX/vpp58WarVaJCYmiuXLl4t3331XDBgwQKxevbrK9/LGG28IAKJLly5iwIABYuHCheJf//qXACBGjBghl/vf//4nAIgjR46YPX/fvn0CgPj888+rfJ2HHnpIdOrUyewYABERESGaNWsmZs+eLebPny9atWolPDw8xNWrV+Vyhw8fFu7u7qJFixZizpw5Yvbs2SIgIEB07dpV3Ppr58033xQKhUIMHTpULF68WMycOVM0adJEtGzZUty4cUMu949//EP4+PiIjIwM+TXUarUYPXp0le+D6E7CUEdENfbee+8JACI9Pd3seGpqqgAgnnvuObPjr7zyigAgtm/fLh/r1KmTeOihhyrUXVhYKIxGo9mx9PR0odFoxKxZs8yO1TbUffLJJ5UGnPDwcPHwww/LjydMmCAAiF9++UU+lpOTI8LCwkTLli3l9u3fv7/SNphMJtG2bVsRGxsrTCaTfDw/P1+EhYWJRx55RD7m4+MjEhISavweJFKoe+yxx8yOv/jiiwKA+OOPP4QQQmRnZws3NzcxZcoUs3Ljx48Xnp6echi/nduFOrVaLf766y/52B9//CEAiI8//lg+NmjQIOHm5ib+/vtv+djx48eFSqUyC3Vnz54VKpVKvPXWW2avc+TIEeHi4mJ2/NKlS8LPz0888sgjoqioSNx1112iRYsWQqfTVfk+iO4kHH4lIqtJw1+JiYlmx//zn/8AgNnw5e1oNBoolaU/koxGI65duwYvLy+0b9++xkOStzN48GC4uLhg7dq18rGjR4/i+PHjGDp0qNn76NmzJ+6//375mJeXF1544QWcPXsWx48fr/J1UlNTcerUKTz99NO4du0arl69iqtXryIvLw99+vTBrl27YDKZAAC+vr7Yu3cvLl68aNF7SkhIMHv80ksvye8BAHx8fDBw4EB8+eWXEEIAKP1c165di0GDBsHT09Oi142JiUHr1q3lx127doVWq8WZM2fk19i6dSsGDRqEFi1ayOU6duxYYcj3m2++gclk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\n"},"metadata":{}},{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"             total_votes\ntotal_votes             \n1                   4360\n2                   1700\n3                  39794\n4                    698\n5                    868\n6                     95\n7                      3\n10                    54\n11                    98\n12                   253\n13                   549\n14                   465\n15                   864\n16                   269\n17                   302\n18                   330\n19                    21\n20                   241\n21                    57\n22                     4\n23                     4\n24                     8","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>total_votes</th>\n    </tr>\n    <tr>\n      <th>total_votes</th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>1</th>\n      <td>4360</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1700</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>39794</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>698</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>868</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>95</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>54</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>98</td>\n    </tr>\n    <tr>\n      <th>12</th>\n      <td>253</td>\n    </tr>\n    <tr>\n      <th>13</th>\n      <td>549</td>\n    </tr>\n    <tr>\n      <th>14</th>\n      <td>465</td>\n    </tr>\n    <tr>\n      <th>15</th>\n      <td>864</td>\n    </tr>\n    <tr>\n      <th>16</th>\n      <td>269</td>\n    </tr>\n    <tr>\n      <th>17</th>\n      <td>302</td>\n    </tr>\n    <tr>\n      <th>18</th>\n      <td>330</td>\n    </tr>\n    <tr>\n      <th>19</th>\n      <td>21</td>\n    </tr>\n    <tr>\n      <th>20</th>\n      <td>241</td>\n    </tr>\n    <tr>\n      <th>21</th>\n      <td>57</td>\n    </tr>\n    <tr>\n      <th>22</th>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>23</th>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>24</th>\n      <td>8</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":14},{"cell_type":"code","source":"fc_df.to_csv('fc_df.csv')\nfc_df.head()","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:32.253959Z","iopub.execute_input":"2025-01-24T05:50:32.25426Z","iopub.status.idle":"2025-01-24T05:50:32.599629Z","shell.execute_reply.started":"2025-01-24T05:50:32.254239Z","shell.execute_reply":"2025-01-24T05:50:32.598825Z"},"trusted":true},"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"       eeg_id  eeg_sub_id  eeg_label_offset_seconds  spectrogram_id  \\\n0  1628180742           0                       0.0          353733   \n1  1628180742           1                       6.0          353733   \n2  1628180742           2                       8.0          353733   \n3  1628180742           3                      18.0          353733   \n4  1628180742           4                      24.0          353733   \n\n   spectrogram_sub_id  spectrogram_label_offset_seconds    label_id  \\\n0                   0                               0.0   127492639   \n1                   1                               6.0  3887563113   \n2                   2                               8.0  1142670488   \n3                   3                              18.0  2718991173   \n4                   4                              24.0  3080632009   \n\n   patient_id expert_consensus  seizure_vote  ...  grda_vote  other_vote  \\\n0       42516          Seizure             3  ...          0           0   \n1       42516          Seizure             3  ...          0           0   \n2       42516          Seizure             3  ...          0           0   \n3       42516          Seizure             3  ...          0           0   \n4       42516          Seizure             3  ...          0           0   \n\n   total_votes  seizure_vote_normed  lpd_vote_normed  gpd_vote_normed  \\\n0            3                  1.0              0.0              0.0   \n1            3                  1.0              0.0              0.0   \n2            3                  1.0              0.0              0.0   \n3            3                  1.0              0.0              0.0   \n4            3                  1.0              0.0              0.0   \n\n   lrda_vote_normed  grda_vote_normed  other_vote_normed  confidence  \n0               0.0               0.0                0.0         1.0  \n1               0.0               0.0                0.0         1.0  \n2               0.0               0.0                0.0         1.0  \n3               0.0               0.0                0.0         1.0  \n4               0.0               0.0                0.0         1.0  \n\n[5 rows x 23 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>eeg_id</th>\n      <th>eeg_sub_id</th>\n      <th>eeg_label_offset_seconds</th>\n      <th>spectrogram_id</th>\n      <th>spectrogram_sub_id</th>\n      <th>spectrogram_label_offset_seconds</th>\n      <th>label_id</th>\n      <th>patient_id</th>\n      <th>expert_consensus</th>\n      <th>seizure_vote</th>\n      <th>...</th>\n      <th>grda_vote</th>\n      <th>other_vote</th>\n      <th>total_votes</th>\n      <th>seizure_vote_normed</th>\n      <th>lpd_vote_normed</th>\n      <th>gpd_vote_normed</th>\n      <th>lrda_vote_normed</th>\n      <th>grda_vote_normed</th>\n      <th>other_vote_normed</th>\n      <th>confidence</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1628180742</td>\n      <td>0</td>\n      <td>0.0</td>\n      <td>353733</td>\n      <td>0</td>\n      <td>0.0</td>\n      <td>127492639</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1628180742</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>353733</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>3887563113</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1628180742</td>\n      <td>2</td>\n      <td>8.0</td>\n      <td>353733</td>\n      <td>2</td>\n      <td>8.0</td>\n      <td>1142670488</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>1628180742</td>\n      <td>3</td>\n      <td>18.0</td>\n      <td>353733</td>\n      <td>3</td>\n      <td>18.0</td>\n      <td>2718991173</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1628180742</td>\n      <td>4</td>\n      <td>24.0</td>\n      <td>353733</td>\n      <td>4</td>\n      <td>24.0</td>\n      <td>3080632009</td>\n      <td>42516</td>\n      <td>Seizure</td>\n      <td>3</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 23 columns</p>\n</div>"},"metadata":{}}],"execution_count":15},{"cell_type":"code","source":"votes=['seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote', 'grda_vote', 'other_vote']\nnormed_votes_columns=[col+\"_normed\" for col in votes]\nvotes_map={k.split('_')[0]:i for i,k in enumerate(votes)}\nvotes_map.update({i:k.split('_')[0] for i,k in enumerate(votes)})\nall_class_dfs=[]\nselect_full_confidence_only=False\nfor vote in votes:\n    if select_full_confidence_only:\n        all_class_dfs.append(fc_df[fc_df[vote]>0.01])\n    else:\n        all_class_dfs.append(df[df[vote]>0.01])\n\ncounts=[class_df.shape[0] for class_df in all_class_dfs]\nclass_id=[0, 1, 2, 3, 4, 5]\nplt.plot(class_id, counts)","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:32.600422Z","iopub.execute_input":"2025-01-24T05:50:32.600639Z","iopub.status.idle":"2025-01-24T05:50:32.849915Z","shell.execute_reply.started":"2025-01-24T05:50:32.600619Z","shell.execute_reply":"2025-01-24T05:50:32.849116Z"},"trusted":true},"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"[<matplotlib.lines.Line2D at 0x79d1f3f273a0>]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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\n"},"metadata":{}}],"execution_count":16},{"cell_type":"code","source":"eeg_cols=['Fp1', 'F3', 'C3', 'P3', 'F7', 'T3', 'T5', 'O1', 'Fz', 'Cz', 'Pz', 'Fp2', 'F4', 'C4', 'P4', 'F8', 'T4', 'T6', 'O2', 'EKG']","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:32.850651Z","iopub.execute_input":"2025-01-24T05:50:32.850926Z","iopub.status.idle":"2025-01-24T05:50:32.854849Z","shell.execute_reply.started":"2025-01-24T05:50:32.850904Z","shell.execute_reply":"2025-01-24T05:50:32.854076Z"},"trusted":true},"outputs":[],"execution_count":17},{"cell_type":"code","source":"def get_eeg_path(id):\n    eeg_path=eeg_path = f\"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/{id}.parquet\"\n    return eeg_path\n\ndef get_eeg(id):\n    eeg_path = f\"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/{id}.parquet\"\n    eeg = pd.read_parquet(eeg_path)\n    return eeg\n\ndef get_eeg_sample(ix, return_normalized_votes=False):\n    id=meta_df.loc[ix, 'eeg_id']\n    eeg=get_eeg(id)\n    start_frame=int(meta_df.loc[ix, 'eeg_label_offset_seconds']*200)\n    end_frame=start_frame+10000\n    eeg_sample=torch.from_numpy(eeg.iloc[start_frame: end_frame].to_numpy())\n    if not return_normalized_votes:\n        return eeg_sample\n    normalized_votes = torch.from_numpy(meta_df.loc[ix, normed_votes_columns].to_numpy(dtype=np.float32))\n    return normalized_votes, eeg_sample\n\ndef download_file(path, download_file_name):\n    os.chdir('./')\n    zip_name = f\"/kaggle/working/{download_file_name}.zip\"\n    command = f\"zip {zip_name} {path} -r\"\n    result = subprocess.run(command, shell=True, capture_output=True, text=True)\n    if result.returncode != 0:\n        print(\"Unable to run zip command!\")\n        print(result.stderr)\n        return \n    display(FileLink(f'{download_file_name}.zip'))\n\n# Define the function to be executed in parallel\ndef eeg_sample_isnan(ix):\n    eeg_sample = get_eeg_sample(ix).transpose(0, 1)\n    scaler = StandardScaler()\n    eeg_sample = scaler.fit_transform(eeg_sample.T).T\n    if np.isnan(eeg_sample).any():\n        return ix\n    return None\n    \ndef prune_nans(meta_df):\n    # Main code with concurrent futures\n    total_unpruned_rows = meta_df.shape[0]\n    nan_indices = set()\n    \n    # Using ThreadPoolExecutor for concurrent processing\n    with ThreadPoolExecutor(max_workers=4) as executor:\n        # Map the function to the indices, it will run in parallel\n        results = list(tqdm(executor.map(eeg_sample_isnan, range(total_unpruned_rows)), total=total_unpruned_rows))\n    \n    # Collect all the indices where NaNs were found\n    nan_indices = set(filter(None, results))\n    ans_df=meta_df.loc[meta_df.index[~meta_df.index.isin(nan_indices)]].reset_index()\n    return ans_df","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:32.855663Z","iopub.execute_input":"2025-01-24T05:50:32.855864Z","iopub.status.idle":"2025-01-24T05:50:32.874237Z","shell.execute_reply.started":"2025-01-24T05:50:32.855847Z","shell.execute_reply":"2025-01-24T05:50:32.873428Z"},"trusted":true},"outputs":[],"execution_count":18},{"cell_type":"code","source":"uniform_weights=False\npatient_agnostic = True\ntest_fraction=0.15\nvalidation_fraction=0.15\n\nif uniform_weights:\n    min_count=min(counts)\n    print(min_count)\n    frac=0.5\n    len_samples=int(min_count*frac)\n    all_samples=[sample_df.sample(n=len_samples, replace=True) for i,sample_df in enumerate(all_class_dfs)]\n    meta_df=pd.concat(all_samples, ignore_index=True)\n    total_count=sum(counts)\n    weights = [count/total_count for count in counts]\nelif select_full_confidence_only:\n    meta_df=df = fc_df.sample(frac=1).reset_index(drop=True)\n    total_count=sum(counts)\n    weights = [count/total_count for count in counts]\nelse:\n    sample_fraction=1\n    meta_df = df.sample(frac=sample_fraction).reset_index(drop=True)\n    total_count=sum(counts)\n    weights = [count/total_count for count in counts]\n\nmeta_df=prune_nans(meta_df)\n# meta_df=meta_df.sample(frac=0.1, ignore_index=True)\n\nif patient_agnostic:\n    patient_group=meta_df.groupby(\"patient_id\", as_index=False).agg({\"eeg_id\":\"count\"})\n    patient_group.sample(frac=1).reset_index(drop=True)\n    patient_group.rename(columns={\"eeg_id\":\"count\"}, inplace=True)\n    patient_group[\"cumulative_count\"]=patient_group[\"count\"].cumsum()\n    \n    len_meta_df=meta_df.shape[0]\n    train_samples=(1-test_fraction-validation_fraction)*len_meta_df\n    last_train_patient=patient_group['cumulative_count'].searchsorted(train_samples, side='right')\n    train_meta_df=meta_df[meta_df['patient_id'].isin(patient_group.loc[:last_train_patient, 'patient_id'])]\n    \n    validation_samples=validation_fraction*len_meta_df\n    last_validation_patient=patient_group['cumulative_count'].searchsorted(train_samples+validation_samples, side='right')\n    val_meta_df=meta_df[meta_df['patient_id'].isin(patient_group.loc[last_train_patient+1:last_validation_patient, 'patient_id'])]\n    \n    last_test_patient=patient_group['cumulative_count'].searchsorted(len_meta_df, side='right')\n    test_meta_df=meta_df[meta_df['patient_id'].isin(patient_group.loc[last_validation_patient+1:last_test_patient, 'patient_id'])]\n\nmeta_df.to_csv('meta_df.csv')\nprint(f\"meta_df.shape = \", meta_df.shape)","metadata":{"execution":{"iopub.status.busy":"2025-01-24T05:50:32.874994Z","iopub.execute_input":"2025-01-24T05:50:32.875204Z","iopub.status.idle":"2025-01-24T06:03:55.654641Z","shell.execute_reply.started":"2025-01-24T05:50:32.875185Z","shell.execute_reply":"2025-01-24T06:03:55.653858Z"},"trusted":true},"outputs":[{"name":"stderr","text":"100%|██████████| 106800/106800 [13:19<00:00, 133.62it/s]\n","output_type":"stream"},{"name":"stdout","text":"meta_df.shape =  (103258, 26)\n","output_type":"stream"}],"execution_count":19},{"cell_type":"code","source":"num_samples=meta_df.shape[0]\nnum_channels=len(eeg_cols)\nnum_classes=6\nsample_rate=200\nsample_duration=50\nbatch_size=16\nmax_pool_size=1000","metadata":{"execution":{"iopub.status.busy":"2025-01-24T06:03:55.655424Z","iopub.execute_input":"2025-01-24T06:03:55.655658Z","iopub.status.idle":"2025-01-24T06:03:55.659794Z","shell.execute_reply.started":"2025-01-24T06:03:55.655637Z","shell.execute_reply":"2025-01-24T06:03:55.658984Z"},"trusted":true},"outputs":[],"execution_count":20},{"cell_type":"code","source":"# modeling_wav2vec2.py variables and imports\nfrom transformers.modeling_outputs import SequenceClassifierOutput\n_HIDDEN_STATES_START_POSITION = 2\n\nclass ModelLoader(Wav2Vec2ForSequenceClassification):\n    loss_fct = None\n\n    @classmethod\n    def from_pretrained(\n        cls,\n        pretrained_model_name_or_path,\n        *model_args,\n        config = None,\n        cache_dir = None,\n        ignore_mismatched_sizes = False,\n        force_download = False,\n        local_files_only = False,\n        token = None,\n        revision = \"main\",\n        use_safetensors = None,\n        # weights_only = True,\n        criterion = None,\n        **kwargs,\n    ):\n        if criterion is None:\n            cls.loss_fct = CrossEntropyLoss()\n        else:\n            cls.loss_fct = criterion\n        return Wav2Vec2ForSequenceClassification.from_pretrained(\n            pretrained_model_name_or_path,\n            *model_args,\n            config = None,\n            cache_dir = None,\n            ignore_mismatched_sizes = False,\n            force_download = False,\n            local_files_only = False,\n            token = None,\n            revision = \"main\",\n            use_safetensors = None,\n            # weights_only = True,\n            **kwargs,\n        )\n\n    def forward(\n        self,\n        input_values,\n        attention_mask = None,\n        output_attentions = None,\n        output_hidden_states = None,\n        return_dict = None,\n        labels = None,\n    ):\n        r\"\"\"\n        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):\n            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,\n            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If\n            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).\n        \"\"\"\n\n        return_dict = return_dict if return_dict is not None else self.config.use_return_dict\n        output_hidden_states = True if self.config.use_weighted_layer_sum else output_hidden_states\n\n        outputs = self.wav2vec2(\n            input_values,\n            attention_mask=attention_mask,\n            output_attentions=output_attentions,\n            output_hidden_states=output_hidden_states,\n            return_dict=return_dict,\n        )\n\n        if self.config.use_weighted_layer_sum:\n            hidden_states = outputs[_HIDDEN_STATES_START_POSITION]\n            hidden_states = torch.stack(hidden_states, dim=1)\n            norm_weights = nn.functional.softmax(self.layer_weights, dim=-1)\n            hidden_states = (hidden_states * norm_weights.view(-1, 1, 1)).sum(dim=1)\n        else:\n            hidden_states = outputs[0]\n\n        hidden_states = self.projector(hidden_states)\n        if attention_mask is None:\n            pooled_output = hidden_states.mean(dim=1)\n        else:\n            padding_mask = self._get_feature_vector_attention_mask(hidden_states.shape[1], attention_mask)\n            expand_padding_mask = padding_mask.unsqueeze(-1).repeat(1, 1, hidden_states.shape[2])\n            hidden_states[~expand_padding_mask] = 0.0\n            pooled_output = hidden_states.sum(dim=1) / padding_mask.sum(dim=1).view(-1, 1)\n\n        logits = self.classifier(pooled_output)\n\n        loss = None\n        if labels is not None:\n            # loss_fct = CrossEntropyLoss()\n            loss = ModelLoader.loss_fct(logits.view(-1, self.config.num_labels), labels.view(-1))\n\n        if not return_dict:\n            output = (logits,) + outputs[_HIDDEN_STATES_START_POSITION:]\n            return ((loss,) + output) if loss is not None else output\n\n        return SequenceClassifierOutput(\n            loss=loss,\n            logits=logits,\n            hidden_states=outputs.hidden_states,\n            attentions=outputs.attentions,\n        )\n                ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:03:55.660596Z","iopub.execute_input":"2025-01-24T06:03:55.660873Z","iopub.status.idle":"2025-01-24T06:03:55.679591Z","shell.execute_reply.started":"2025-01-24T06:03:55.66084Z","shell.execute_reply":"2025-01-24T06:03:55.67885Z"}},"outputs":[],"execution_count":21},{"cell_type":"code","source":"# Model and Processor\nprocessor = Wav2Vec2Processor.from_pretrained(\"facebook/wav2vec2-base\")\nmodel = ModelLoader.from_pretrained(\n    pretrained_model_name_or_path = \"facebook/wav2vec2-base\",\n    # pretrained_model_name_or_path = \"facebook/hubert-large-ls960-ft\",\n    num_labels = num_classes,\n    criterion = CrossEntropyLoss(weight=torch.tensor(weights)),\n)\n\nif os.path.exists(model_folder_path):\n    print(\"Saved model loaded\")\n    model = ModelLoader.from_pretrained(\n    pretrained_model_name_or_path = model_path,\n    num_labels=num_classes\n    )    \n\n# Freeze feature extractor layers\nfor param in model.wav2vec2.feature_extractor.parameters():\n    param.requires_grad = False\n\n# Save the model\nprocessor.save_pretrained('kaggle/working/processor')\ntime.sleep(3)\ndownload_file(\"kaggle/working/processor\",\"processor\")","metadata":{"execution":{"iopub.status.busy":"2025-01-24T06:03:55.680301Z","iopub.execute_input":"2025-01-24T06:03:55.680537Z","iopub.status.idle":"2025-01-24T06:04:01.994588Z","shell.execute_reply.started":"2025-01-24T06:03:55.680518Z","shell.execute_reply":"2025-01-24T06:04:01.993703Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"preprocessor_config.json:   0%|          | 0.00/159 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e13ed52b51774d3bad445db3ed115c2b"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer_config.json:   0%|          | 0.00/163 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9e3a27bf55514952abb2784c3be5136c"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"config.json:   0%|          | 0.00/1.84k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"3bc537b7edaf41b0b91dc2aae3fd9a2b"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"vocab.json:   0%|          | 0.00/291 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9605f3c5641148bdbb2d0ff63b778504"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"special_tokens_map.json:   0%|          | 0.00/85.0 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"1c77bf1df8f5422d8b4962ab51bb2b8c"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"pytorch_model.bin:   0%|          | 0.00/380M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"0b310ec647614d75b7d5625c700e19f9"}},"metadata":{}},{"name":"stderr","text":"Some weights of Wav2Vec2ForSequenceClassification were not initialized from the model checkpoint at facebook/wav2vec2-base and are newly initialized: ['classifier.bias', 'classifier.weight', 'projector.bias', 'projector.weight', 'wav2vec2.encoder.pos_conv_embed.conv.parametrizations.weight.original0', 'wav2vec2.encoder.pos_conv_embed.conv.parametrizations.weight.original1']\nYou should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"/kaggle/working/processor.zip","text/html":"<a href='processor.zip' target='_blank'>processor.zip</a><br>"},"metadata":{}}],"execution_count":22},{"cell_type":"code","source":"class MetaPoolDataset(Dataset):\n    def __init__(self, meta_df, pool_size, name):\n        self.meta_df = meta_df\n        self.pool_size = pool_size  # Maximum number of samples to load at once\n        self.scaler = StandardScaler()\n        self.name=name\n        self.total_size=0\n        \n        self.current_pool=None\n        self.current_label=None\n        self.current_normalized_votes=None\n        \n        self.index_offset = {}\n        self.start_indices = []\n        self.start_of_file = {}\n        self.end_of_file = {}\n\n    def create_pools(self):\n        max_index=self.meta_df.shape[0]\n        start_index=0\n        file_id=0\n        \n        start_idx = 0\n        meta_start_idx = 0\n        while(meta_start_idx<max_index):\n            # Limit end index to the size of meta_df\n            meta_end_idx = min(meta_start_idx + self.pool_size, len(self.meta_df))\n            \n            file_name=f\"{self.name}_{file_id}\"\n            self.index_offset[file_name]=start_index\n            \n            print(f\"Creating {file_name}\")\n            t1=time.time()\n            pooled_data = np.zeros((meta_end_idx - meta_start_idx, num_channels, 10000))\n            labels = np.zeros((meta_end_idx - meta_start_idx,))\n            normalized_votes = np.zeros((meta_end_idx - meta_start_idx, num_classes))\n#             for i, ix in enumerate(tqdm(self.meta_df.index[meta_start_idx:meta_end_idx])):\n            for i, ix in enumerate(self.meta_df.index[meta_start_idx:meta_end_idx]):\n                eeg_normalized_vote, eeg_sample = get_eeg_sample(ix, return_normalized_votes=True)\n                eeg_sample = eeg_sample.transpose(0, 1)\n                \n                eeg_sample = self.scaler.fit_transform(eeg_sample.T).T\n                pooled_data[i] = eeg_sample\n                labels[i] = votes_map[self.meta_df.loc[ix, 'expert_consensus'].lower()]\n                normalized_votes[i] = eeg_normalized_vote\n            \n            # Filter out any samples with NaN values\n            mask = ~np.isnan(pooled_data).any(axis=(1, 2))\n            pooled_data = pooled_data[mask]\n            labels = labels[mask]\n            \n            self.start_indices.append(start_index)\n            self.start_of_file[file_name]=meta_start_idx\n            self.end_of_file[file_name]=meta_end_idx\n            \n            self.total_size+=pooled_data.shape[0]\n            start_index+=pooled_data.shape[0]\n            meta_start_idx+=self.pool_size\n            file_id+=1\n            print(f\"Time taken = {(time.time()-t1)/60:.2f} minutes\")\n            print(\"self.start_of_file = \", self.start_of_file)\n            print(\"self.total_size = \", self.total_size)\n            print()\n            \n            del mask, pooled_data, labels\n        \n    def get_file_name(self, idx):\n        assert(self.start_indices is not None)\n        pos=bisect_left(self.start_indices, idx)\n        file_id=pos\n        if pos==len(self.start_indices):\n            file_id-=1\n        elif self.start_indices[pos]>idx:\n            file_id-=1\n        return f\"{self.name}_{file_id}\"\n    \n    def get_current_pool(self, idx):\n        start=end=file_name=pooled_data=labels=eeg_sample=i=ix=None\n        file_name=self.get_file_name(idx)\n        start=self.start_of_file[file_name]\n        end=self.end_of_file[file_name]\n\n        pooled_data = np.zeros((end - start, num_channels, 10000))\n        labels = np.zeros((end - start,))\n        normalized_votes = np.zeros((end - start, num_classes))\n        \n        for i, ix in enumerate(self.meta_df.index[start:end]):\n            eeg_normalized_vote, eeg_sample = get_eeg_sample(ix, return_normalized_votes=True)\n            eeg_sample = eeg_sample.transpose(0,1)\n            eeg_sample = self.scaler.fit_transform(eeg_sample.T).T\n            pooled_data[i] = eeg_sample\n            labels[i] = votes_map[self.meta_df.loc[ix, 'expert_consensus'].lower()]\n            normalized_votes[i] = eeg_normalized_vote\n\n        # Filter out any samples with NaN values\n        mask = ~np.isnan(pooled_data).any(axis=(1, 2))\n        self.current_pool = pooled_data[mask]\n        self.current_label = labels[mask]\n        self.current_normalized_votes = normalized_votes[mask]","metadata":{"execution":{"iopub.status.busy":"2025-01-24T06:04:01.997905Z","iopub.execute_input":"2025-01-24T06:04:01.998155Z","iopub.status.idle":"2025-01-24T06:04:02.010382Z","shell.execute_reply.started":"2025-01-24T06:04:01.998132Z","shell.execute_reply":"2025-01-24T06:04:02.009599Z"},"trusted":true},"outputs":[],"execution_count":23},{"cell_type":"code","source":"# Custom Dataset Class\nclass EEGDataset(MetaPoolDataset):\n    def __init__(self, meta_df, pool_size, name, processor=processor, target_sampling_rate=16000, orig_sampling_rate=200):\n        super().__init__(meta_df, pool_size, name)\n        self.processor = processor\n        self.orig_sampling_rate = orig_sampling_rate\n        self.target_sampling_rate = target_sampling_rate\n        self.first_pool_made=False\n        \n        self.create_pools()\n        self.current_file = self.get_file_name(0)\n        self.get_current_pool(0)\n        print(f\"EEGDataset {name} initialized\\n\")\n        \n    def __len__(self):\n        return self.total_size\n    \n    def __getitem__(self, idx):\n        inputs=None\n        file_name=None\n        unchanged_idx=idx\n        try:\n            file_name = self.get_file_name(idx)\n            if file_name != self.current_file:\n                self.current_file = file_name\n                self.get_current_pool(idx)\n\n            idx=idx-self.index_offset[self.current_file]\n            data = self.current_pool[idx]\n            label = int(self.current_label[idx])\n\n            # Flatten to 1D\n            data = data.reshape(-1)\n\n            # Resample to self.target_sampling_rate\n            inputs = self.processor(data, sampling_rate=self.target_sampling_rate, return_tensors=\"pt\", padding=True)\n            inputs[\"labels\"] = torch.tensor(label, dtype=torch.long)\n            inputs[\"normalized_votes\"] = torch.tensor(self.current_normalized_votes[idx])\n            return inputs\n        except Exception as e:\n            print(\"Error: \", e)\n            print(\"unchanged_idx = \", unchanged_idx)\n            print(\"idx = \", idx)\n            print(\"file_name = \", file_name)\n            if self.current_pool is not None:\n                print(\"self.current_pool.shape = \", self.current_pool.shape)\n            else:\n                print(\"self.current_pool is None\")\n            print(self.index_offset)\n            traceback.print_exc()\n            print()\n\n# Loaders\nif (not os.path.isdir(dataset_folder_path)):\n    if not patient_agnostic:\n        len_meta_df=meta_df.shape[0]\n        test_frac=0.15\n        val_frac=0.15\n        train_meta_df=meta_df.iloc[:int((1-test_frac-val_frac)*len_meta_df),:]\n        val_meta_df=meta_df.iloc[int((1-test_frac-val_frac)*len_meta_df):int((1-test_frac)*len_meta_df),:]\n        test_meta_df=meta_df.iloc[int((1-test_frac)*len_meta_df):, :]\n        \n    pool_size = int((max_pool_size//batch_size)*batch_size)\n    train_meta_df.to_csv(\"train_meta_df.csv\")\n    test_meta_df.to_csv(\"test_meta_df.csv\")\n    val_meta_df.to_csv(\"val_meta_df.csv\")\n    \nelse:\n    train_meta_path=dataset_folder_path+\"/train_meta_df.csv\"\n    val_meta_path=dataset_folder_path+\"/val_meta_df.csv\"\n    test_meta_path=dataset_folder_path+\"/test_meta_df.csv\"\n\n    test_meta_df=pd.read_csv(test_meta_path)\n    train_meta_df=pd.read_csv(train_meta_path)\n    val_meta_df=pd.read_csv(val_meta_path)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:04:02.011796Z","iopub.execute_input":"2025-01-24T06:04:02.012004Z","iopub.status.idle":"2025-01-24T06:04:02.908211Z","shell.execute_reply.started":"2025-01-24T06:04:02.011986Z","shell.execute_reply":"2025-01-24T06:04:02.907316Z"}},"outputs":[],"execution_count":24},{"cell_type":"code","source":"pool_size=(max_pool_size//batch_size)*batch_size\nif (not os.path.isdir(dataset_folder_path)):\n    train_dataset = EEGDataset(train_meta_df, pool_size, \"train\")\n    val_dataset = EEGDataset(val_meta_df, pool_size, \"val\")\n    test_dataset = EEGDataset(test_meta_df, pool_size, \"test\")\n    all_datasets={\"train_dataset\":train_dataset, \"test_dataset\":test_dataset, \"val_dataset\":val_dataset,}\n    with open('all_datasets.pkl', 'wb') as f:\n        pickle.dump(all_datasets, f)\n    \nelse:\n    train_dataset=EEGDataset(train_meta_df, pool_size, \"train\")\n    test_dataset=EEGDataset(test_meta_df, pool_size, \"test\")\n    val_dataset=EEGDataset(val_meta_df, pool_size, \"val\")\n\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size)\nval_loader = DataLoader(val_dataset, batch_size=batch_size)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# download_file(\"./all_datasets.pkl\", \"all_datasets\")\ndownload_file(\"./train_meta_df.csv\", \"train_meta_df\")\ndownload_file(\"./test_meta_df.csv\", \"test_meta_df\")\ndownload_file(\"./val_meta_df.csv\", \"val_meta_df\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:22.470942Z","iopub.execute_input":"2025-01-24T06:27:22.471236Z","iopub.status.idle":"2025-01-24T06:27:22.475437Z","shell.execute_reply.started":"2025-01-24T06:27:22.471206Z","shell.execute_reply":"2025-01-24T06:27:22.474577Z"}},"outputs":[],"execution_count":26},{"cell_type":"code","source":"# Optimizer and Loss\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)\n\noptimizer = torch.optim.AdamW(model.parameters(), lr=3*1e-5)\n# criterion = nn.CrossEntropyLoss()\n\nnum_epochs=6","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:22.476232Z","iopub.execute_input":"2025-01-24T06:27:22.476534Z","iopub.status.idle":"2025-01-24T06:27:35.989422Z","shell.execute_reply.started":"2025-01-24T06:27:22.476505Z","shell.execute_reply":"2025-01-24T06:27:35.988747Z"}},"outputs":[],"execution_count":27},{"cell_type":"code","source":"# Done above","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:35.990143Z","iopub.execute_input":"2025-01-24T06:27:35.990389Z","iopub.status.idle":"2025-01-24T06:27:35.993883Z","shell.execute_reply.started":"2025-01-24T06:27:35.990362Z","shell.execute_reply":"2025-01-24T06:27:35.992997Z"}},"outputs":[],"execution_count":28},{"cell_type":"code","source":"def make_predictions(data_loader, name, data_preds=None, data_labels=None):\n    if (data_preds is None) and (data_labels is None):\n        data_preds, data_labels = [], []\n        with torch.no_grad():\n            for batch in tqdm(data_loader, desc=f\"Checking model on {name} dataset\"):\n                inputs={}\n                inputs['input_values'] = batch['input_values'].to(torch.float32).to(device)\n                if len(inputs['input_values'].shape)==1:\n                    inputs['input_values'] = torch.unsqueeze(inputs['input_values'], 0)\n                    inputs['input_values'].to(device)\n                inputs['input_values'] = torch.reshape(inputs['input_values'],(-1, 200000))\n                \n                inputs['labels'] = batch['labels'].to(torch.int64).to(device)\n                outputs = model(**inputs)\n\n                logits = outputs.logits\n                preds = torch.argmax(logits, dim=-1)\n                labels = inputs['labels']\n                \n                data_preds.extend(preds.tolist())\n                data_labels.extend(labels.tolist())\n\n    # Calculate metrics\n    data_accuracy = accuracy_score(data_labels, data_preds)\n    data_f1=f1_score(data_labels, data_preds, average='weighted')\n    data_precision = precision_score(data_labels, data_preds, average='weighted')\n    data_recall = recall_score(data_labels, data_preds, average='weighted')\n    print(f\"{name} Dataset - Accuracy: {data_accuracy:.4f} | Precision: {data_precision:.4f} | Recall: {data_recall:.4f} | F1: {data_f1:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:35.994842Z","iopub.execute_input":"2025-01-24T06:27:35.995147Z","iopub.status.idle":"2025-01-24T06:27:36.011194Z","shell.execute_reply.started":"2025-01-24T06:27:35.995115Z","shell.execute_reply":"2025-01-24T06:27:36.010402Z"}},"outputs":[],"execution_count":29},{"cell_type":"code","source":"epoch_offset=int(model_path[-5])\nepoch_offset=0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:36.011991Z","iopub.execute_input":"2025-01-24T06:27:36.012258Z","iopub.status.idle":"2025-01-24T06:27:36.032575Z","shell.execute_reply.started":"2025-01-24T06:27:36.012237Z","shell.execute_reply":"2025-01-24T06:27:36.031661Z"}},"outputs":[],"execution_count":30},{"cell_type":"code","source":"class EvaluatePartition:\n    def __init__(self, model, data_loader, name, device=device):\n        self.model=model\n        self.data_loader=data_loader\n        self.name=name\n        self.device=device\n\n        self.calc_softmax=torch.nn.Softmax(dim=-1)  \n        self.data_preds = []\n        self.data_labels = []\n        self.data_probs = []\n        self.total_loss = 0.0\n        self.total_kl_loss = 0.0\n        self.num_classes = None\n        self.final_metrics = {}\n        \n\n    def _reset_base_metrics(self, base_metrics=None):\n        self.data_preds = []\n        self.data_labels = []\n        self.data_probs = []\n        self.total_loss = 0.0\n        self.total_kl_loss = 0.0\n        if base_metrics is not None:\n            self.data_preds = base_metrics[\"data_preds\"]\n            self.data_labels = base_metrics[\"data_labels\"]\n            self.data_probs = base_metrics[\"data_probs\"]\n            self.total_loss = base_metrics[\"total_loss\"]\n            self.total_kl_loss = base_metrics[\"total_kl_loss\"]\n        self.final_metrics.clear()\n    \n    def _evaluate(self, base_metrics=None):\n        self._reset_base_metrics(base_metrics)\n        \n        if base_metrics is None:\n            with torch.no_grad():\n                for batch in tqdm(self.data_loader, desc=f\"Checking model on {self.name} dataset\", ncols=100, leave=True, dynamic_ncols=True):\n                    inputs=self._get_input_kwargs(batch)\n                    normalized_votes=inputs['normalized_votes']\n                    del inputs['normalized_votes']\n                    \n                    outputs = self.model(**inputs)\n                    \n                    inputs['normalized_votes']=normalized_votes\n                    loss=outputs.loss\n                    self.total_loss+=loss.item()\n                    logits, preds, probs, labels = self._process_model_outputs(inputs, outputs)\n                \n        return self._get_final_metrics()\n    \n    def _get_input_kwargs(self, batch):\n        inputs = {}\n        inputs['input_values'] = batch['input_values'].to(torch.float32).to(self.device)\n        if len(inputs['input_values'].shape) == 1:\n            inputs['input_values'] = torch.unsqueeze(inputs['input_values'], 0)\n            inputs['input_values'].to(self.device)\n        inputs['input_values'] = torch.reshape(inputs['input_values'], (-1, num_channels*10000))\n        inputs['labels'] = batch['labels'].to(torch.int64).to(self.device)\n        inputs['normalized_votes']=batch['normalized_votes'].to(self.device)\n        return inputs\n\n    def _process_model_outputs(self, inputs, outputs):\n        logits = outputs.logits \n        # Collect predictions and labels\n        preds = torch.argmax(logits, dim=-1)\n        self.data_preds.extend(preds.tolist())\n\n        labels = inputs['labels']\n        self.data_labels.extend(labels.tolist())\n        \n        probs = self.calc_softmax(logits)\n        self.data_probs.append(probs.detach().cpu().numpy())\n\n        # print(\"probabilities = \", F.log_softmax(logits, dim=-1))\n        # print(\"log probabilities = \", torch.log(F.log_softmax(logits, dim=-1)))\n        kl_loss = F.kl_div(F.log_softmax(logits, dim=-1), inputs['normalized_votes'], reduction='batchmean')\n        self.total_kl_loss += kl_loss.item()\n        \n        return logits, preds, probs, labels\n\n    def _get_final_metrics(self, base_metrics=None):\n        self._finalize_epoch_data()\n        self.num_classes = self.data_probs.shape[1]\n        self._add_regressive_scores()\n        self._add_evaluation_graphs()\n        return self.final_metrics\n        \n    def _finalize_epoch_data(self):\n        self.data_labels = torch.tensor(self.data_labels).cpu().numpy()\n        self.data_preds = torch.tensor(self.data_preds).cpu().numpy()\n        if isinstance(self.data_probs, list):\n            self.data_probs = np.concatenate(self.data_probs, axis=0)\n        self.data_probs = torch.tensor(self.data_probs).cpu().numpy()\n        \n    def _add_regressive_scores(self):\n        data_accuracy = accuracy_score(self.data_labels, self.data_preds)\n        data_f1 = f1_score(self.data_labels, self.data_preds, average='weighted')\n        data_precision = precision_score(self.data_labels, self.data_preds, average='weighted')\n        data_recall = recall_score(self.data_labels, self.data_preds, average='weighted')\n        cohen_kappa = cohen_kappa_score(self.data_labels, self.data_preds)\n        \n        regressive_scores={\n            \"accuracy\": data_accuracy,\n            \"f1_score\": data_f1,\n            \"precision\": data_precision,\n            \"recall\": data_recall,\n            \"cohen_kappa\": cohen_kappa,\n            \"total_loss\": self.total_loss,\n            \"total_kl_loss\": self.total_kl_loss,\n        }\n        print(f\"{self.name} Dataset - Accuracy: {data_accuracy:.4f} | Precision: {data_precision:.4f} | Recall: {data_recall:.4f} | F1: {data_f1:.4f}\")\n        print(f\"Total Loss: {self.total_loss:.4f} | Total KL Loss: {self.total_kl_loss:.4f} | cohen_kappa: {cohen_kappa:.4f}\")\n        self.final_metrics.update(regressive_scores)\n        \n    def _add_evaluation_graphs(self):\n        try:\n            auc_roc = roc_auc_score(self.data_labels, self.data_probs, multi_class='ovr', average='weighted')\n        except ValueError:\n            auc_roc = None\n    \n        pr_curves = {}\n        for i in range(self.num_classes):\n            precision, recall, _ = precision_recall_curve(self.data_labels == i, self.data_probs[:, i])\n            pr_curves[f\"class_{i}\"] = {\"precision\": precision.tolist(), \"recall\": recall.tolist()}\n        class_report = classification_report(self.data_labels, self.data_preds, output_dict=True)\n        \n        evaluation_curves={\n            \"auc_roc\": auc_roc,\n            \"support\": class_report[\"weighted avg\"][\"support\"],\n            \"pr_curves\": pr_curves\n        }\n        self.final_metrics.update(evaluation_curves)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:36.033344Z","iopub.execute_input":"2025-01-24T06:27:36.033684Z","iopub.status.idle":"2025-01-24T06:27:36.050713Z","shell.execute_reply.started":"2025-01-24T06:27:36.033651Z","shell.execute_reply":"2025-01-24T06:27:36.049878Z"}},"outputs":[],"execution_count":31},{"cell_type":"code","source":"# # Training Loop - EvaluatePartition based\nexperiment_data={}\n\ntraining = EvaluatePartition(model = model, data_loader = train_loader, name=\"train\", device=device)\nvalidation = EvaluatePartition(model = model, data_loader = val_loader, name=\"val\", device=device)\ntesting = EvaluatePartition(model = model, data_loader = test_loader, name=\"test\", device=device)\n\nfor epoch in range(num_epochs):\n    model.train()\n    total_loss = 0.0\n    total_kl_loss = 0.0\n    train_preds, train_labels, train_probs = [], [], []\n\n    training._reset_base_metrics()\n    print(f\"For Epoch: {epoch}\")\n    epoch_data={}\n    for i, batch in enumerate(tqdm(train_loader)):\n        inputs = training._get_input_kwargs(batch)\n        normalized_votes=inputs['normalized_votes']\n        del inputs['normalized_votes']\n        \n        outputs = model(**inputs)\n        inputs['normalized_votes']=normalized_votes\n        \n        loss = outputs.loss\n        training.total_loss += loss.item()\n        loss.backward()\n        optimizer.step()\n        optimizer.zero_grad()        \n\n        training._process_model_outputs(inputs, outputs)\n        \n\n    train_metrics = training._get_final_metrics()\n    val_metrics = validation._evaluate()\n    test_metrics = testing._evaluate()\n\n    epoch_data.update(train_metrics)\n    epoch_data.update(val_metrics)\n    epoch_data.update(test_metrics)\n    experiment_data.update(epoch_data)\n    \n    model.save_pretrained(f\"model_{epoch}.pkl\")\n    download_file(f\"./model_{epoch}.pkl\", f\"model_{epoch}.pkl\")\n    print(\"Model saved\")\n    \n    print()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T06:27:36.051506Z","iopub.execute_input":"2025-01-24T06:27:36.051772Z","execution_failed":"2025-01-24T17:49:48.564Z"}},"outputs":[{"name":"stdout","text":"For Epoch: 0\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 4519/4519 [2:48:22<00:00,  2.24s/it]  \n","output_type":"stream"},{"name":"stdout","text":"train Dataset - Accuracy: 0.7003 | Precision: 0.6989 | Recall: 0.7003 | F1: 0.6992\nTotal Loss: 3720.6373 | Total KL Loss: 3326.0100 | cohen_kappa: 0.6391\n","output_type":"stream"},{"name":"stderr","text":"Checking model on val dataset: 100%|██████████| 983/983 [12:40<00:00,  1.29it/s]  \n","output_type":"stream"},{"name":"stdout","text":"val Dataset - Accuracy: 0.5345 | Precision: 0.5384 | Recall: 0.5345 | F1: 0.5149\nTotal Loss: 1469.7069 | Total KL Loss: 1190.3977 | cohen_kappa: 0.4402\n","output_type":"stream"},{"name":"stderr","text":"Checking model on test dataset: 100%|██████████| 954/954 [12:40<00:00,  1.25it/s]  \n","output_type":"stream"},{"name":"stdout","text":"test Dataset - Accuracy: 0.5019 | Precision: 0.4787 | Recall: 0.5019 | F1: 0.4805\nTotal Loss: 1500.7639 | Total KL Loss: 1232.9180 | cohen_kappa: 0.3890\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"/kaggle/working/model_0.pkl.zip","text/html":"<a href='model_0.pkl.zip' target='_blank'>model_0.pkl.zip</a><br>"},"metadata":{}},{"name":"stdout","text":"Model saved\n\nFor Epoch: 1\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 4519/4519 [2:47:29<00:00,  2.22s/it]  \n","output_type":"stream"},{"name":"stdout","text":"train Dataset - Accuracy: 0.8534 | Precision: 0.8527 | Recall: 0.8534 | F1: 0.8529\nTotal Loss: 1913.0699 | Total KL Loss: 2768.7904 | cohen_kappa: 0.8236\n","output_type":"stream"},{"name":"stderr","text":"Checking model on val dataset: 100%|██████████| 983/983 [11:20<00:00,  1.44it/s] \n","output_type":"stream"},{"name":"stdout","text":"val Dataset - Accuracy: 0.5345 | Precision: 0.5310 | Recall: 0.5345 | F1: 0.5132\nTotal Loss: 1678.6960 | Total KL Loss: 1421.8336 | cohen_kappa: 0.4382\n","output_type":"stream"},{"name":"stderr","text":"Checking model on test dataset: 100%|██████████| 954/954 [11:39<00:00,  1.36it/s]  \n","output_type":"stream"},{"name":"stdout","text":"test Dataset - Accuracy: 0.4790 | Precision: 0.4461 | Recall: 0.4790 | F1: 0.4529\nTotal Loss: 1829.2768 | Total KL Loss: 1543.2071 | cohen_kappa: 0.3621\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"/kaggle/working/model_1.pkl.zip","text/html":"<a href='model_1.pkl.zip' target='_blank'>model_1.pkl.zip</a><br>"},"metadata":{}},{"name":"stdout","text":"Model saved\n\nFor Epoch: 2\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 4519/4519 [2:47:44<00:00,  2.23s/it]  \n","output_type":"stream"},{"name":"stdout","text":"train Dataset - Accuracy: 0.8998 | Precision: 0.8997 | Recall: 0.8998 | F1: 0.8996\nTotal Loss: 1310.4962 | Total KL Loss: 2957.4221 | cohen_kappa: 0.8795\n","output_type":"stream"},{"name":"stderr","text":"Checking model on val dataset: 100%|██████████| 983/983 [11:16<00:00,  1.45it/s] \n","output_type":"stream"},{"name":"stdout","text":"val Dataset - Accuracy: 0.5074 | Precision: 0.5142 | Recall: 0.5074 | F1: 0.4977\nTotal Loss: 1910.5591 | Total KL Loss: 1642.0638 | cohen_kappa: 0.4046\n","output_type":"stream"},{"name":"stderr","text":"Checking model on test dataset: 100%|██████████| 954/954 [11:35<00:00,  1.37it/s]  \n","output_type":"stream"},{"name":"stdout","text":"test Dataset - Accuracy: 0.4763 | Precision: 0.4565 | Recall: 0.4763 | F1: 0.4533\nTotal Loss: 2018.4584 | Total KL Loss: 1734.9755 | cohen_kappa: 0.3580\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"/kaggle/working/model_2.pkl.zip","text/html":"<a href='model_2.pkl.zip' target='_blank'>model_2.pkl.zip</a><br>"},"metadata":{}},{"name":"stdout","text":"Model saved\n\nFor Epoch: 3\n","output_type":"stream"},{"name":"stderr","text":" 64%|██████▎   | 2878/4519 [1:46:07<54:18,  1.99s/it]  ","output_type":"stream"}],"execution_count":null},{"cell_type":"code","source":"# # Training Loop - default\n# for epoch in range(num_epochs):\n#     model.train()\n#     total_loss = 0.0\n#     train_preds, train_labels = [], []\n#     print(f\"For Epoch: {epoch}\")\n#     debug=False\n#     for i, batch in enumerate(tqdm(train_loader)):\n#         inputs={}\n#         inputs['input_values'] = batch['input_values'].to(torch.float32).to(device)\n#         if len(inputs['input_values'].shape)==1:\n#             inputs['input_values'] = torch.unsqueeze(inputs['input_values'], 0)\n#             inputs['input_values'].to(device)\n#         inputs['input_values'] = torch.reshape(inputs['input_values'],(-1, 200000))\n        \n#         inputs['labels'] = batch['labels'].to(torch.int64).to(device)\n#         # print(inputs['input_values'].device)\n#         # print(inputs['input_values'].shape)\n        \n#         if debug:\n#             break\n#         outputs = model(**inputs)\n#         logits = outputs.logits\n#         preds = torch.argmax(logits, dim=-1)\n#         labels=batch[\"labels\"].to(device)\n#         train_preds.extend(preds.tolist())\n#         train_labels.extend(labels.tolist())\n        \n#         loss = outputs.loss\n#         total_loss += loss.item()\n#         loss.backward()\n#         optimizer.step()\n#         optimizer.zero_grad()\n    \n#     if debug:\n#         break\n#     make_predictions(train_loader, \"train\", train_preds, train_labels)\n#     make_predictions(val_loader, \"val\")\n#     make_predictions(test_loader, \"test\")\n#     model.save_pretrained(f\"model_{epoch+epoch_offset}.pkl\")\n#     download_file(f\"./model_{epoch+epoch_offset}.pkl\", f\"model_{epoch+epoch_offset}.pkl\")\n#     print(\"Model saved\")\n    \n#     print()\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-01-24T17:49:48.565Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}