{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"},{"sourceId":6774602,"sourceType":"datasetVersion","datasetId":3898045},{"sourceId":6928158,"sourceType":"datasetVersion","datasetId":3954762},{"sourceId":149567053,"sourceType":"kernelVersion"}],"dockerImageVersionId":30558,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# turn on GPU\n\nimport pandas as pd\nimport polars as pl\nimport gc\nimport numpy as np\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\n\nfrom sklearn.utils import class_weight\nfrom sklearn.utils.class_weight import compute_class_weight\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import LSTM, Dense, Dropout\nfrom tensorflow.keras.utils import to_categorical","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-12T08:08:36.566939Z","iopub.execute_input":"2023-11-12T08:08:36.567438Z","iopub.status.idle":"2023-11-12T08:08:53.231001Z","shell.execute_reply.started":"2023-11-12T08:08:36.567378Z","shell.execute_reply":"2023-11-12T08:08:53.229963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Upload datasets","metadata":{}},{"cell_type":"code","source":"def adjust_timestamp(df):\n    df = df.join(first_time_zone_for_ids, on='id', how='left')\n    mask = pl.col('id').is_in(ids_with_multiple_time_zones) & pl.col('timestamp').is_not_null()\n    \n    delta = (pl.col('first_time_zone') - pl.col('time_zone')) * 3600000000\n    timestamp_in_milliseconds = pl.col('timestamp').cast(pl.Int64)\n    \n    adjusted_timestamp_in_milliseconds = timestamp_in_milliseconds + delta\n    \n    adjusted_datetime = adjusted_timestamp_in_milliseconds.cast(pl.Datetime)\n    \n    return df.with_columns(pl.when(mask).then(adjusted_datetime).otherwise(pl.col('timestamp')).alias('adjusted_timestamp'))\n\n\ndef extract_and_convert_time_zone(col_name):\n    sign_col = (\n        pl.when(pl.col(col_name).str.slice(offset=0, length=1) == \"-\")\n        .then(-1)\n        .otherwise(1)\n        .alias(\"sign\")\n    )\n    \n    hours_col = (\n        pl.col(col_name).str.slice(offset=1, length=2)\n        .cast(pl.Int8())\n        .alias(\"hours\")\n    )\n\n    return (sign_col * hours_col)\n\ntrain_events = (\n    pl.read_csv('/kaggle/input/child-mind-institute-detect-sleep-states/train_events.csv')\n    .with_columns(pl.col(\"timestamp\").str.slice(offset=-5, length=5).alias(\"time_zone_str\"))\n    .with_columns(extract_and_convert_time_zone(\"time_zone_str\").alias(\"time_zone\"))\n    .with_columns(pl.col(\"timestamp\").str.slice(offset=0, length=19).str.strptime(format=\"%Y-%m-%dT%H:%M:%S\", dtype = pl.Datetime).alias(\"timestamp\"))\n    .join(pl.read_csv('/kaggle/input/sleep-mapping/sleep_mapping', separator='\\t', dtypes={\"id\": pl.UInt16}), on=\"series_id\", how=\"left\")\n    .drop(\"series_id\")\n    .drop(\"time_zone_str\")\n    .drop_nulls()\n    .with_columns(pl.col('step').cast(pl.UInt32))\n    .with_columns(\n        pl.when(pl.col('event') == 'onset').then(1).otherwise(2).alias('event_coded').cast(pl.UInt8)\n    )\n    .drop('event')\n)\n\nunique_ids = train_events['id'].unique()\n\n\ntrain_series = (\n    pl.read_parquet('/kaggle/input/child-mind-institute-detect-sleep-states/train_series.parquet')\n    .with_columns(pl.col(\"timestamp\").str.slice(offset=-5, length=5).alias(\"time_zone_str\"))\n    .with_columns(extract_and_convert_time_zone(\"time_zone_str\").alias(\"time_zone\"))\n    .with_columns(pl.col(\"timestamp\").str.slice(offset=0, length=19).str.strptime(format=\"%Y-%m-%dT%H:%M:%S\", dtype = pl.Datetime).alias(\"timestamp\"))\n    .join(pl.read_csv('/kaggle/input/sleep-mapping/sleep_mapping', separator='\\t', dtypes={\"id\": pl.UInt16}), on=\"series_id\", how=\"left\")\n    .drop(\"series_id\")\n    .drop(\"time_zone_str\")\n    .filter(pl.col(\"id\").is_in(unique_ids))\n)\n\n\nids_with_multiple_time_zones = (\n    train_series.group_by('id')\n    .agg(pl.col('time_zone').n_unique().alias('unique_time_zones_count'))\n    .filter(pl.col('unique_time_zones_count') > 1)\n    .select('id')\n    .to_pandas()['id'].tolist())\n\nfirst_time_zone_for_ids = (\n    train_series.filter(pl.col('id').is_in(ids_with_multiple_time_zones))\n    .sort(['id', 'timestamp'])\n    .group_by('id')\n    .agg(pl.first('time_zone').alias('first_time_zone')))\n\ntrain_series = adjust_timestamp(train_series).drop([\"time_zone\", \"first_time_zone\", \"timestamp\"])\ntrain_events = adjust_timestamp(train_events).drop([\"time_zone\", \"first_time_zone\", \"timestamp\"])","metadata":{"execution":{"iopub.status.busy":"2023-11-12T08:08:53.233071Z","iopub.execute_input":"2023-11-12T08:08:53.233615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"grouped = train_events.group_by(['id', 'night']).agg(pl.col('event_coded').count())\ngrouped = grouped.filter(pl.col(\"event_coded\") != 2)\n\ntrain_events = train_events.join(\n    grouped,\n    on=['id', 'night'],\n    how='anti')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"merged_train = (\n    train_series\n    .join(train_events, on=['id', 'step'], how='left')\n    .drop(['adjusted_timestamp_right'])\n    .fill_null(0))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train_series, train_events, grouped, unique_ids, \ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Assumption:\n+ We consider only those series that have both 1 and 2.\n+ Removing series that do not have an assigned event or have an event with gaps.\n+ Standardizing timestamps to the first value.\n\n\n\n\n\n","metadata":{}},{"cell_type":"markdown","source":"# Create 'asleep' column to have 2 classes\n\nonly code to do it, but not used it","metadata":{}},{"cell_type":"code","source":"# merged_train = (\n#     merged_train\n#     .with_columns(\n#         pl.when(pl.col('event_coded') == 1).then(1)\n#         .when(pl.col('event_coded') == 2).then(-1)\n#         .otherwise(0)\n#         .cumsum()\n#         .alias('asleep_cumsum')\n#     )\n#     .with_columns(\n#         (pl.col('asleep_cumsum') > 0).alias('asleep')\n#     )\n#     .drop('asleep_cumsum'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Extraction:","metadata":{}},{"cell_type":"code","source":"def transform_data(df):\n    return df\\\n        .with_columns(pl.col('adjusted_timestamp').alias('timestamp'))\\\n        .with_columns(pl.col('timestamp').dt.month().cast(pl.UInt8).alias('month'))\\\n        .with_columns(pl.col('timestamp').dt.day().cast(pl.UInt8).alias('day'))\\\n        .with_columns(pl.col('timestamp').dt.weekday().cast(pl.UInt8).alias('weekday'))\\\n        .with_columns(pl.col('timestamp').dt.hour().cast(pl.UInt8).alias('hour'))\nmerged_train =  transform_data(merged_train)","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:10:36.540603Z","iopub.execute_input":"2023-11-09T10:10:36.541102Z","iopub.status.idle":"2023-11-09T10:10:46.551187Z","shell.execute_reply.started":"2023-11-09T10:10:36.541079Z","shell.execute_reply":"2023-11-09T10:10:46.550395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_difference(df, id_column, columns):\n    \"\"\"\n    Calculate the difference between the current value (n) and the previous value (n-1) for specified columns.\n\n    Parameters:\n    - df: The Polars DataFrame.\n    - columns: A list of column names to calculate differences for.\n\n    Returns:\n    A new DataFrame with calculated differences.\n    \"\"\"\n\n    for column in columns:\n        df = df.with_columns((pl.col(column) - pl.col(column).shift(1)).over(id_column).alias(f'{column}_diff'))\n        \n    return df\n\n\nmerged_train = calculate_difference(merged_train, 'id', ['anglez', 'enmo'])\\\n.fill_null(0)","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:10:46.552202Z","iopub.execute_input":"2023-11-09T10:10:46.552462Z","iopub.status.idle":"2023-11-09T10:10:58.883644Z","shell.execute_reply.started":"2023-11-09T10:10:46.552440Z","shell.execute_reply":"2023-11-09T10:10:58.882851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_statistics2(df, id_column, columns, lags, window_spans):\n    \n    for column in columns:\n        for lag in lags:\n            for window_span in window_spans:\n                \n                feature_name_mean = f'{column}_lag{lag}_{window_span}m_mean'\n                new_column_mean = pl.col(column).rolling_mean(window_span, min_periods=1).shift(lag).over(id_column).cast(pl.Float32).alias(feature_name_mean)\n                \n                feature_name_min = f'{column}_lag{lag}_{window_span}m_min'\n                new_column_min = pl.col(column).rolling_min(window_span, min_periods=1).shift(lag).over(id_column).cast(pl.Float32).alias(feature_name_min)\n                \n                feature_name_max = f'{column}_lag{lag}_{window_span}m_max'\n                new_column_max = pl.col(column).rolling_max(window_span, min_periods=1).shift(lag).over(id_column).cast(pl.Float32).alias(feature_name_max)\n                \n                new_columns = [new_column_mean,  new_column_max]\n                df = df.with_columns(new_columns)\n\n    return df\n\n\n\nmerged_train = calculate_statistics2(merged_train, 'id',\n                                      ['anglez', 'enmo', 'anglez_diff', 'enmo_diff'], \n                                      [1], \n                                      [5*12])","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:10:58.884626Z","iopub.execute_input":"2023-11-09T10:10:58.884892Z","iopub.status.idle":"2023-11-09T10:11:35.963296Z","shell.execute_reply.started":"2023-11-09T10:10:58.884869Z","shell.execute_reply":"2023-11-09T10:11:35.962370Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"merged_train = merged_train[['id', 'step',\n                             'anglez',\n                             'enmo',\n                             'month',\n                             'day',\n                             'weekday',\n                             'hour',\n                             'anglez_diff',\n                             'enmo_diff',\n                             'anglez_lag1_60m_mean',\n                             'anglez_lag1_60m_max',\n                             'enmo_lag1_60m_mean',\n                             'enmo_lag1_60m_max',\n                             'anglez_diff_lag1_60m_mean',\n                             'anglez_diff_lag1_60m_max',\n                             'enmo_diff_lag1_60m_mean',\n                             'enmo_diff_lag1_60m_max',\n                             \n                             'event_coded']]","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:35.966935Z","iopub.execute_input":"2023-11-09T10:11:35.967206Z","iopub.status.idle":"2023-11-09T10:11:36.099030Z","shell.execute_reply.started":"2023-11-09T10:11:35.967184Z","shell.execute_reply":"2023-11-09T10:11:36.098067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"merged_train['event_coded'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:36.100179Z","iopub.execute_input":"2023-11-09T10:11:36.100466Z","iopub.status.idle":"2023-11-09T10:11:38.751165Z","shell.execute_reply.started":"2023-11-09T10:11:36.100442Z","shell.execute_reply":"2023-11-09T10:11:38.750235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_val_ids = 20\nnum_test_ids = 10\n\nunique_ids = merged_train.select('id').unique()\n\ntest_ids = unique_ids.sample(n=num_test_ids, seed=42).to_numpy().flatten()\ntrain_val_ids = unique_ids.filter(~pl.col('id').is_in(test_ids))\nval_ids = train_val_ids.sample(n=num_val_ids, seed=42).to_numpy().flatten()\ntrain_ids = train_val_ids.filter(~pl.col('id').is_in(val_ids)).to_numpy().flatten()\n\ntrain_data = merged_train.filter(pl.col('id').is_in(train_ids))\nval_data = merged_train.filter(pl.col('id').is_in(val_ids))\ntest_data = merged_train.filter(pl.col('id').is_in(test_ids))\n\ntrain_data = train_data.fill_null(strategy='backward')\nval_data = val_data.fill_null(strategy='backward')\ntest_data = test_data.fill_null(strategy='backward')","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:38.752281Z","iopub.execute_input":"2023-11-09T10:11:38.752582Z","iopub.status.idle":"2023-11-09T10:11:48.193972Z","shell.execute_reply.started":"2023-11-09T10:11:38.752557Z","shell.execute_reply":"2023-11-09T10:11:48.193168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del merged_train, unique_ids, first_time_zone_for_ids, ids_with_multiple_time_zones, train_val_ids\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:48.195137Z","iopub.execute_input":"2023-11-09T10:11:48.195779Z","iopub.status.idle":"2023-11-09T10:11:48.798885Z","shell.execute_reply.started":"2023-11-09T10:11:48.195742Z","shell.execute_reply":"2023-11-09T10:11:48.797822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model NN","metadata":{}},{"cell_type":"code","source":"grouped= train_data.group_by('id')\ndef batch_generator(grouped, num_classes):\n    while True:\n        for name, group in grouped:\n            X = group.drop(['id', 'step', 'event_coded'], axis=1).values.astype('float32')\n            y = to_categorical(group['event_coded'], num_classes=num_classes).astype('float32')\n            yield X, y","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:48.800211Z","iopub.execute_input":"2023-11-09T10:11:48.800507Z","iopub.status.idle":"2023-11-09T10:11:48.806583Z","shell.execute_reply.started":"2023-11-09T10:11:48.800484Z","shell.execute_reply":"2023-11-09T10:11:48.805670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"grouped_val = val_data.group_by('id')\ndef val_batch_generator(grouped_val, num_classes):\n    while True:\n        for name, group in grouped_val:\n            X = group.drop(['id', 'step', 'event_coded'], axis=1).values.astype('float32')\n            y = to_categorical(group['event_coded'], num_classes=num_classes).astype('float32')\n            yield X, y","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:48.807831Z","iopub.execute_input":"2023-11-09T10:11:48.808335Z","iopub.status.idle":"2023-11-09T10:11:48.821438Z","shell.execute_reply.started":"2023-11-09T10:11:48.808310Z","shell.execute_reply":"2023-11-09T10:11:48.820577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_class_weights(y):\n\n    class_totals = np.sum(y, axis=0)\n    class_weights = {i: (1.0 / class_totals[i]) * y.shape[0] / 2.0 for i in range(y.shape[1])}\n    return class_weights\n\ny_train = to_categorical(train_data['event_coded'], num_classes=3)\nclass_weights = calculate_class_weights(y_train)","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:11:48.822513Z","iopub.execute_input":"2023-11-09T10:11:48.822824Z","iopub.status.idle":"2023-11-09T10:11:53.504262Z","shell.execute_reply.started":"2023-11-09T10:11:48.822789Z","shell.execute_reply":"2023-11-09T10:11:53.503462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.utils.class_weight import compute_class_weight\nfrom tensorflow.keras.metrics import Precision, Recall\n\nnum_classes = 3\n\nstrategy = tf.distribute.MirroredStrategy()\nprint('DEVICES AVAILABLE: {}'.format(strategy.num_replicas_in_sync))\n\nwith strategy.scope(): \n    model = Sequential([\n        Dense(64, activation='relu', input_shape=(16,)),\n        Dropout(0.2),\n        Dense(32, activation='relu'),\n        Dropout(0.2),\n        Dense(num_classes, activation='softmax')\n    ])\n\n# compile\n    model.compile(optimizer=Adam(learning_rate=0.001),\n              loss='categorical_crossentropy',\n              metrics=['accuracy', Precision(), Recall()])","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:13:41.079087Z","iopub.execute_input":"2023-11-09T10:13:41.079737Z","iopub.status.idle":"2023-11-09T10:13:41.164018Z","shell.execute_reply.started":"2023-11-09T10:13:41.079704Z","shell.execute_reply":"2023-11-09T10:13:41.163133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_data is polars dataframe\n\nunique_ids = train_data.select('id').unique().to_series().to_list()\n\ndef process_group(df: pl.DataFrame, group_id: int, num_classes: int) -> tuple:\n    group = df.filter(pl.col('id') == group_id)\n    X = group.drop(['id', 'step', 'event_coded']).to_numpy().astype(np.float32)\n    y = to_categorical(group['event_coded'].to_numpy().astype(int), num_classes=num_classes)\n    return X, y\n\ndef batch_generator(df: pl.DataFrame, unique_ids: list, num_classes: int):\n    while True:\n        for group_id in unique_ids:\n            X, y = process_group(df, group_id, num_classes)\n            yield X, y\n\ngenerator = batch_generator(train_data, unique_ids, 3)\n\n\nunique_ids = val_data.select('id').unique().to_series().to_list()\n\nval_generator = batch_generator(val_data, unique_ids, 3)","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:13:43.474423Z","iopub.execute_input":"2023-11-09T10:13:43.475305Z","iopub.status.idle":"2023-11-09T10:13:44.240827Z","shell.execute_reply.started":"2023-11-09T10:13:43.475269Z","shell.execute_reply":"2023-11-09T10:13:44.239822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(\n    x=generator,\n    steps_per_epoch=len(grouped.agg(pl.count())),\n    epochs=10,  \n    class_weight=class_weights,\n    validation_data=val_generator,\n    validation_steps=len(grouped_val.agg(pl.count())) \n    )","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:13:46.207570Z","iopub.execute_input":"2023-11-09T10:13:46.207918Z","iopub.status.idle":"2023-11-09T10:21:52.513541Z","shell.execute_reply.started":"2023-11-09T10:13:46.207891Z","shell.execute_reply":"2023-11-09T10:21:52.512754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"model_ver1.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:12:01.960616Z","iopub.status.idle":"2023-11-09T10:12:01.960960Z","shell.execute_reply.started":"2023-11-09T10:12:01.960791Z","shell.execute_reply":"2023-11-09T10:12:01.960808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import FileLink\nFileLink(r'./model_ver1.h5')","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:12:01.962377Z","iopub.status.idle":"2023-11-09T10:12:01.962827Z","shell.execute_reply.started":"2023-11-09T10:12:01.962597Z","shell.execute_reply":"2023-11-09T10:12:01.962618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del grouped_val, grouped, train_data, val_data\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:21:58.030057Z","iopub.execute_input":"2023-11-09T10:21:58.030762Z","iopub.status.idle":"2023-11-09T10:21:58.255281Z","shell.execute_reply.started":"2023-11-09T10:21:58.030725Z","shell.execute_reply":"2023-11-09T10:21:58.254418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Simply testing","metadata":{}},{"cell_type":"markdown","source":"## Competition's metric and confusion matrix","metadata":{}},{"cell_type":"code","source":"# # upload model if you have any\n\n# from tensorflow.keras.models import load_model\n\n# # wczytanie modelu\n# model = load_model('/kaggle/input/sleep-models/model_ver1.h5')\n# model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:12:01.966345Z","iopub.status.idle":"2023-11-09T10:12:01.966698Z","shell.execute_reply.started":"2023-11-09T10:12:01.966509Z","shell.execute_reply":"2023-11-09T10:12:01.966525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"column_names = {\n    'series_id_column_name': 'series_id',\n    'time_column_name': 'step',\n    'event_column_name': 'event',\n    'score_column_name': 'score',\n}\n\ntolerances = {\n    'onset': [12, 36, 60, 90, 120, 150, 180, 240, 300, 360], \n    'wakeup': [12, 36, 60, 90, 120, 150, 180, 240, 300, 360]\n}\n\nfrom metric import score","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:22:09.052235Z","iopub.execute_input":"2023-11-09T10:22:09.052825Z","iopub.status.idle":"2023-11-09T10:22:09.067327Z","shell.execute_reply.started":"2023-11-09T10:22:09.052793Z","shell.execute_reply":"2023-11-09T10:22:09.066328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\n\ntest_data = test_data.to_pandas()\nX_test = test_data.drop(['id', 'step', 'event_coded'], axis=1).values.astype('float32')\ny_test = to_categorical(test_data['event_coded'], num_classes=3).astype('float32')\n\nX_test = X_test.astype('float32')\ny_test = y_test.astype('float32')\n\n# del test_data\n# gc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:22:11.958567Z","iopub.execute_input":"2023-11-09T10:22:11.958931Z","iopub.status.idle":"2023-11-09T10:22:12.610336Z","shell.execute_reply.started":"2023-11-09T10:22:11.958903Z","shell.execute_reply":"2023-11-09T10:22:12.609506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = model.predict(X_test)\n\nconfusion_matrix(np.argmax(y_test, axis=1),np.argmax(y_pred, axis=1))","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:22:15.310755Z","iopub.execute_input":"2023-11-09T10:22:15.311101Z","iopub.status.idle":"2023-11-09T10:31:42.039624Z","shell.execute_reply.started":"2023-11-09T10:22:15.311074Z","shell.execute_reply":"2023-11-09T10:31:42.038624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preparing dataset for calculating metric","metadata":{}},{"cell_type":"code","source":"test_gt = test_data[['id', 'step', 'event_coded']]\ntest_gt = test_gt.rename(columns={'id': 'series_id', 'event_coded': 'event'})\ntest_gt['score'] = 1\ntest_gt = test_gt[test_gt['event'] != 0]\ntest_gt['event'] = test_gt['event'].replace({1: 'onset', 2: 'wakeup'})\ntest_gt","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:31:42.041725Z","iopub.execute_input":"2023-11-09T10:31:42.042107Z","iopub.status.idle":"2023-11-09T10:31:42.165694Z","shell.execute_reply.started":"2023-11-09T10:31:42.042071Z","shell.execute_reply":"2023-11-09T10:31:42.164839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_pred = test_data[['id', 'step', 'event_coded']]\ntest_pred = test_pred.rename(columns={'id': 'series_id', 'event_coded': 'event'})\n\ntest_pred['event'] = np.argmax(y_pred, axis=1)\ntest_pred['score'] = np.max(y_pred, axis=1)\n\ntest_pred = test_pred[test_pred['event'] != 0]\ntest_pred['event'] = test_pred['event'].replace({1: 'onset', 2: 'wakeup'})\ntest_pred","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:31:42.166852Z","iopub.execute_input":"2023-11-09T10:31:42.167125Z","iopub.status.idle":"2023-11-09T10:31:42.711680Z","shell.execute_reply.started":"2023-11-09T10:31:42.167101Z","shell.execute_reply":"2023-11-09T10:31:42.710576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metric:\n\nprint(f\"Model score: {score(test_gt, test_pred, tolerances, **column_names)}\")","metadata":{"execution":{"iopub.status.busy":"2023-11-09T10:31:42.713972Z","iopub.execute_input":"2023-11-09T10:31:42.714413Z","iopub.status.idle":"2023-11-09T10:48:56.372045Z","shell.execute_reply.started":"2023-11-09T10:31:42.714379Z","shell.execute_reply":"2023-11-09T10:48:56.371050Z"},"trusted":true},"execution_count":null,"outputs":[]}]}