{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":7439758,"sourceType":"datasetVersion","datasetId":4330115}],"dockerImageVersionId":30636,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd, numpy as np, os\nimport torch\nimport torch.nn as nn","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-01-24T13:12:19.726106Z","iopub.execute_input":"2024-01-24T13:12:19.726539Z","iopub.status.idle":"2024-01-24T13:12:22.764516Z","shell.execute_reply.started":"2024-01-24T13:12:19.726508Z","shell.execute_reply":"2024-01-24T13:12:22.763528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_path = \"/kaggle/input/hms-harmful-brain-activity-classification/\"\ntrain_csv = pd.read_csv(base_path+\"train.csv\")\ntrain_eeg1 = pd.read_parquet(base_path+\"train_eegs/1628180742.parquet\")\ntrain_spectrogram1 = pd.read_parquet(base_path+\"train_spectrograms/2147388374.parquet\")\ntargets = train_csv.columns[-6:]\ntars = {'Seizure':0, 'LPD':1, 'GPD':2, 'LRDA':3, 'GRDA':4, 'Other':5}","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:22.766664Z","iopub.execute_input":"2024-01-24T13:12:22.767287Z","iopub.status.idle":"2024-01-24T13:12:23.245913Z","shell.execute_reply.started":"2024-01-24T13:12:22.767255Z","shell.execute_reply":"2024-01-24T13:12:23.244624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train_csv.groupby('eeg_id')[['spectrogram_id', \n                                     'spectrogram_label_offset_seconds']].agg({\n    'spectrogram_id':'first', 'spectrogram_label_offset_seconds' : 'min'\n})\n\ntrain.columns=['spec_id', 'min_time']\n\ntmp = train_csv.groupby('eeg_id')[['spectrogram_id', \n                                     'spectrogram_label_offset_seconds']].agg({\n    'spectrogram_label_offset_seconds':'max'    \n})\ntrain['max_time']=tmp\n\ntmp = train_csv.groupby('eeg_id')[['patient_id']].agg({\n    'patient_id':'first'\n})\ntrain['patient_id']=tmp\n\ntmp = train_csv.groupby('eeg_id')[targets].agg('sum')\nfor t in targets:\n    train[t]=tmp[t].values\n    \ny_train = train[targets].values\ny_train = y_train/y_train.sum(axis=1, keepdims=True)\n\ntrain[targets]=y_train\ntmp = train_csv.groupby('eeg_id')[['expert_consensus']].agg('first')\ntrain['target']=tmp\ntrain = train.reset_index()","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:23.249001Z","iopub.execute_input":"2024-01-24T13:12:23.249391Z","iopub.status.idle":"2024-01-24T13:12:23.324962Z","shell.execute_reply.started":"2024-01-24T13:12:23.249362Z","shell.execute_reply":"2024-01-24T13:12:23.324167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:23.326043Z","iopub.execute_input":"2024-01-24T13:12:23.326344Z","iopub.status.idle":"2024-01-24T13:12:23.346246Z","shell.execute_reply.started":"2024-01-24T13:12:23.326320Z","shell.execute_reply":"2024-01-24T13:12:23.345403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nGEN_FEATS=False\nfrom tqdm.notebook import trange\nPATH = \"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms/\"\nprint(\"Loading Features....\")\nif GEN_FEATS:\n    data = np.zeros((len(train), train_spectrogram1.shape[1]-1))\n    for i in trange(len(train), desc=\"Generating features\"):\n        spec_id = str(train.iloc[i,:]['spec_id'])\n        spec = pd.read_parquet(PATH+spec_id+\".parquet\")\n        spec = spec.drop(['time'], axis=1).values\n        mean = np.nanmean(spec, axis=0)\n        data[i, :] = mean\n    cols = train_spectrogram1.columns[1:]\n    train_data = pd.DataFrame(data)\n    train_data.columns = cols\n    train_data.to_parquet(\"./traindata.parquet\", compression=\"gzip\")\nelse:\n    data = pd.read_parquet(\"/kaggle/input/spectogram-data/traindata.parquet\")\n    feats = data.columns.values\n    data = data.values\n    \n    \n    \nprint(\"Loaded all the features\")","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:23.348582Z","iopub.execute_input":"2024-01-24T13:12:23.348860Z","iopub.status.idle":"2024-01-24T13:12:23.959087Z","shell.execute_reply.started":"2024-01-24T13:12:23.348836Z","shell.execute_reply":"2024-01-24T13:12:23.958174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y = train['target'].map(tars).values","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:23.960305Z","iopub.execute_input":"2024-01-24T13:12:23.960607Z","iopub.status.idle":"2024-01-24T13:12:23.968492Z","shell.execute_reply.started":"2024-01-24T13:12:23.960580Z","shell.execute_reply":"2024-01-24T13:12:23.967515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\nfrom catboost import CatBoostClassifier, Pool\nfrom xgboost import XGBClassifier\nimport gc","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:23.969654Z","iopub.execute_input":"2024-01-24T13:12:23.969986Z","iopub.status.idle":"2024-01-24T13:12:24.399405Z","shell.execute_reply.started":"2024-01-24T13:12:23.969952Z","shell.execute_reply":"2024-01-24T13:12:24.398579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom tqdm.auto import tqdm\nfrom sklearn.model_selection import GroupKFold\nprint(\"Training CatBoost model\")\nn_splits=5\ngkf = GroupKFold(n_splits=5)\ndevice = 'GPU' if torch.cuda.is_available() else 'CPU'\nprobs=[]\ntrue=[]\nprint(f\"Running on {device}\")\nfor i, (train_index, valid_index) in enumerate(tqdm(gkf.split(data, Y, train.patient_id))):\n    cat_model = CatBoostClassifier(task_type=device, loss_function=\"MultiClass\")\n    train_pool = Pool(data = data[train_index, :], label = Y[train_index])\n    valid_pool = Pool(data = data[valid_index, :], label = Y[valid_index])\n    \n    cat_model.fit(train_pool,\n             verbose=100,\n             eval_set=valid_pool)\n    #cat_model.save_model(\"./bestCATboost.cat\")\n    \n    prob = cat_model.predict_proba(valid_pool)\n    probs.append(prob)\n    true.append(y_train[valid_index,:])\n    \n    del train_pool, valid_pool, prob\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:12:24.400465Z","iopub.execute_input":"2024-01-24T13:12:24.400720Z","iopub.status.idle":"2024-01-24T13:13:50.293769Z","shell.execute_reply.started":"2024-01-24T13:12:24.400698Z","shell.execute_reply":"2024-01-24T13:13:50.292787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gen_valid_pool(X, y):\n    pool = []\n    for i in range(len(X)):\n        tup = (X[i,:], y[i])\n        pool.append(tup)\n    return np.array(pool)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:13:50.295062Z","iopub.execute_input":"2024-01-24T13:13:50.295438Z","iopub.status.idle":"2024-01-24T13:13:50.301073Z","shell.execute_reply.started":"2024-01-24T13:13:50.295405Z","shell.execute_reply":"2024-01-24T13:13:50.300164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Training XGBoost\")\n#probs=[]\n#true=[]\nn_splits=5\ngkf = GroupKFold(n_splits=n_splits)\ntree_method = 'gpu_hist' if torch.cuda.is_available() else 'hist'\nprint(f\"Running on {tree_method}\")\nfor i, (train_index, valid_index) in enumerate(tqdm(gkf.split(data, Y, train.patient_id))):\n    xgb_model = XGBClassifier(tree_method=tree_method)\n    #train_pool = Pool(data = data[train_index, :], label = Y[train_index])\n    #valid_pool = gen_valid_pool(X = data[valid_index, :], y = Y[valid_index])\n    train_X = data[train_index, :]\n    train_Y = Y[train_index]\n    val_X = data[valid_index, :]\n    val_Y = Y[valid_index]\n    \n    xgb_model.fit(X = train_X, y = train_Y,\n                 verbose=100)\n    \n    prob = xgb_model.predict_proba(val_X)\n    probs.append(prob)\n    true.append(y_train[valid_index, :])\n    \n    del train_X, train_Y, val_X, val_Y\n    gc.collect()\n    ","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:13:50.302248Z","iopub.execute_input":"2024-01-24T13:13:50.303155Z","iopub.status.idle":"2024-01-24T13:14:05.807527Z","shell.execute_reply.started":"2024-01-24T13:13:50.303108Z","shell.execute_reply":"2024-01-24T13:14:05.806612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def KL_loss(p,q):\n    epsilon=10**(-15)\n    p=torch.clip(p,epsilon,1-epsilon)\n    q = nn.functional.log_softmax(q,dim=1)\n    return torch.mean(torch.sum(p*(torch.log(p)-q),dim=1))\n\ndef AOS(total_error):\n    return 1/total_error","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:05.808678Z","iopub.execute_input":"2024-01-24T13:14:05.808946Z","iopub.status.idle":"2024-01-24T13:14:05.814442Z","shell.execute_reply.started":"2024-01-24T13:14:05.808921Z","shell.execute_reply":"2024-01-24T13:14:05.813530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"s=0\nfor i in range(n_splits):\n    err = KL_loss(torch.tensor(probs[i]), torch.tensor(true[i]))\n    err = float(err)\n    s += err\n    \ncat_err = s/5\ns=0\nfor i in range(n_splits, len(probs)):\n    err = KL_loss(torch.tensor(probs[i]), torch.tensor(true[i]))\n    err = float(err)\n    s += err\n    \nxgb_err = s/5\n\ncat_AOS, xgb_AOS = AOS(cat_err), AOS(xgb_err)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:05.815845Z","iopub.execute_input":"2024-01-24T13:14:05.816102Z","iopub.status.idle":"2024-01-24T13:14:05.926544Z","shell.execute_reply.started":"2024-01-24T13:14:05.816079Z","shell.execute_reply":"2024-01-24T13:14:05.925681Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path = \"/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/\"\ntest_csv = pd.read_csv(base_path+\"test.csv\")\ntest_data = np.zeros((len(test_csv), len(feats)))\nfor k in range(len(test_csv)):\n    spec_id = str(test_csv.iloc[k]['spectrogram_id'])\n    spec = pd.read_parquet(test_path+spec_id+\".parquet\")\n    spec = spec.drop(['time'], axis=1).values\n    mean = np.nanmean(spec, axis=0)\n    test_data[k,:]=mean\n    \nsample_sub = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/sample_submission.csv\", index_col=False)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:05.927692Z","iopub.execute_input":"2024-01-24T13:14:05.927970Z","iopub.status.idle":"2024-01-24T13:14:05.986968Z","shell.execute_reply.started":"2024-01-24T13:14:05.927947Z","shell.execute_reply":"2024-01-24T13:14:05.986167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data.shape","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:05.990023Z","iopub.execute_input":"2024-01-24T13:14:05.990372Z","iopub.status.idle":"2024-01-24T13:14:05.996221Z","shell.execute_reply.started":"2024-01-24T13:14:05.990344Z","shell.execute_reply":"2024-01-24T13:14:05.995294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat_preds=[]\nfor i in trange(n_splits):\n    #model = CatBoostClassifier(task_type=device)\n    #model.load_model(\"./bestCATboost.cat\")\n    \n    test_pool = Pool(data = test_data)\n    \n    cat_pred = cat_model.predict_proba(test_pool)\n    cat_preds.append(cat_pred)\n    \ncat_pred = np.mean(np.array(cat_preds), axis=0)\n\nprint(cat_pred)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:05.997478Z","iopub.execute_input":"2024-01-24T13:14:05.997813Z","iopub.status.idle":"2024-01-24T13:14:06.048094Z","shell.execute_reply.started":"2024-01-24T13:14:05.997780Z","shell.execute_reply":"2024-01-24T13:14:06.047155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgb_preds=[]\nfor i in trange(n_splits):\n    xgb_pred = xgb_model.predict_proba(test_data)\n    xgb_preds.append(xgb_pred)\n    \nxgb_pred = np.mean(np.array(xgb_preds), axis=0)\nprint(xgb_pred)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:14:06.049324Z","iopub.execute_input":"2024-01-24T13:14:06.049608Z","iopub.status.idle":"2024-01-24T13:14:06.124756Z","shell.execute_reply.started":"2024-01-24T13:14:06.049583Z","shell.execute_reply":"2024-01-24T13:14:06.123755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_pred = (cat_pred*cat_AOS + xgb_pred*xgb_AOS)/(cat_AOS+xgb_AOS)\neps = final_pred.sum(axis=1) - 1.\nfinal_pred[:,5] -= eps\nprint(final_pred)\nfinal_pred.sum(axis=1)==1.","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:30:01.318935Z","iopub.execute_input":"2024-01-24T13:30:01.319242Z","iopub.status.idle":"2024-01-24T13:30:01.693377Z","shell.execute_reply.started":"2024-01-24T13:30:01.319212Z","shell.execute_reply":"2024-01-24T13:30:01.692037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nshutil.rmtree('/kaggle/working/catboost_info')\nsample_sub[targets]=final_pred\nprint(final_pred)\nsample_sub.to_csv(\"./submission.csv\", index=False)\nprint(\"Shape: \", sample_sub.shape)\nsample_sub.head()","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:20:23.372260Z","iopub.execute_input":"2024-01-24T13:20:23.372999Z","iopub.status.idle":"2024-01-24T13:20:24.111963Z","shell.execute_reply.started":"2024-01-24T13:20:23.372959Z","shell.execute_reply":"2024-01-24T13:20:24.110097Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\ny = np.array([[6.0681242e-01,2.6168203e-02,1.0140451e-04,1.7395137e-02,1.6642738e-02,\n  3.3288011e-01],[0.2016465, 0.05178665,0.00447842,0.05837928,0.13620283,0.54750632]])","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:39:01.077823Z","iopub.execute_input":"2024-01-24T13:39:01.078251Z","iopub.status.idle":"2024-01-24T13:39:01.084410Z","shell.execute_reply.started":"2024-01-24T13:39:01.078219Z","shell.execute_reply":"2024-01-24T13:39:01.083184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"eps = y.sum(axis=1)-1.","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:40:23.813037Z","iopub.execute_input":"2024-01-24T13:40:23.813445Z","iopub.status.idle":"2024-01-24T13:40:23.818919Z","shell.execute_reply.started":"2024-01-24T13:40:23.813413Z","shell.execute_reply":"2024-01-24T13:40:23.817882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y[:,5] -= eps","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:41:19.179352Z","iopub.execute_input":"2024-01-24T13:41:19.180075Z","iopub.status.idle":"2024-01-24T13:41:19.184838Z","shell.execute_reply.started":"2024-01-24T13:41:19.180036Z","shell.execute_reply":"2024-01-24T13:41:19.183834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y.sum(axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T13:41:33.567802Z","iopub.execute_input":"2024-01-24T13:41:33.568220Z","iopub.status.idle":"2024-01-24T13:41:33.575362Z","shell.execute_reply.started":"2024-01-24T13:41:33.568185Z","shell.execute_reply":"2024-01-24T13:41:33.574183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}