{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"},{"sourceId":425979,"sourceType":"modelInstanceVersion","modelInstanceId":345103,"modelId":366393}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:10.230678Z","iopub.execute_input":"2025-06-08T13:48:10.231191Z","iopub.status.idle":"2025-06-08T13:48:10.766868Z","shell.execute_reply.started":"2025-06-08T13:48:10.231132Z","shell.execute_reply":"2025-06-08T13:48:10.764532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport polars as pl\nimport joblib\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:10.768554Z","iopub.execute_input":"2025-06-08T13:48:10.769085Z","iopub.status.idle":"2025-06-08T13:48:10.924685Z","shell.execute_reply.started":"2025-06-08T13:48:10.769053Z","shell.execute_reply":"2025-06-08T13:48:10.923337Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_names = ['acc_x_mean',\t'acc_x_std',\t'acc_y_mean',\t'acc_y_std',\t'acc_z_mean',\t'acc_z_std',\t'rot_w_mean',\t'rot_w_std',\t'rot_x_mean',\t'rot_x_std',\t'rot_y_mean',\t'rot_y_std',\t'rot_z_mean',\t'rot_z_std',\t'behavior_freq_Hand at target location',\t'behavior_freq_Moves hand to target location',\t'behavior_freq_Performs gesture',\t'behavior_freq_Relaxes and moves hand to target location',\t'phase_freq_Gesture',\t'phase_freq_Transition']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:10.926256Z","iopub.execute_input":"2025-06-08T13:48:10.926782Z","iopub.status.idle":"2025-06-08T13:48:10.933816Z","shell.execute_reply.started":"2025-06-08T13:48:10.926745Z","shell.execute_reply":"2025-06-08T13:48:10.932145Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = joblib.load('/kaggle/input/gbc/scikitlearn/default/4/gbc.joblib')\nlabel_encoder = joblib.load(\"/kaggle/input/gbc/scikitlearn/default/4/label_encoder.joblib\")\n\n\n# Your feature extraction function — must match what you used during training\ndef extract_features(df: pd.DataFrame) -> pd.DataFrame:\n    feature_dict = {\n        'acc_x_mean': df['acc_x'].mean(),\n        'acc_y_mean': df['acc_y'].mean(),\n        'acc_z_mean': df['acc_z'].mean(),\n        'rot_x_mean': df['rot_x'].mean(),\n        'rot_y_mean': df['rot_y'].mean(),\n        'rot_z_mean': df['rot_z'].mean(),\n        'acc_x_std': df['acc_x'].std(),\n        'acc_y_std': df['acc_y'].std(),\n        'acc_z_std': df['acc_z'].std(),\n        'rot_x_std': df['rot_x'].std(),\n        'rot_y_std': df['rot_y'].std(),\n        'rot_z_std': df['rot_z'].std(),\n        'rot_w_mean': df['rot_w'].mean(),\n        'rot_w_std': df['rot_w'].std(),\n        # Add other features you used in training...\n    }\n    return pd.DataFrame([feature_dict])\n\n\ndef frequency_encode_categoricals(df, categorical_cols):\n    freq_features = []\n    for col in categorical_cols:\n        counts = pd.crosstab(df['sequence_id'], df[col], normalize='index')\n        counts.columns = [f'{col}_freq_{c}' for c in counts.columns]\n        freq_features.append(counts)\n    return pd.concat(freq_features, axis=1).reset_index()\n\n\n# The main function called for each test sequence\n# def predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n#     df = sequence.to_pandas()\n    \n#     # Extract sequence_id for merging later\n#     seq_id = df['sequence_id'].iloc[0]\n\n#     # Statistical features\n#     stat_features = extract_features(df)\n#     stat_features['sequence_id'] = seq_id\n\n#     # Frequency-encoded features\n#     #freq_features = frequency_encode_categoricals(df, ['phase'])\n    \n#     # Merge statistical + frequency features\n#     #features = pd.merge(stat_features, freq_features, on='sequence_id', how='left')\n#     features = stat_features\n#     features = features.drop(columns=['sequence_id'])  # Drop seq_id before predict\n#     print(features.head())\n#     # Fill missing columns if needed (due to unseen categories)\n#     for col in model.feature_names_in_:\n#         if col not in features.columns:\n#             features[col] = 0.0\n#     features = features[model.feature_names_in_]  # Ensure same column order\n#     print('2nd Feature Head:\\n', features.head())\n#     # Predict\n\n#     pred_int = model.predict(features)              # returns [7]\n#     print(\"Prediction\\n\", pred_int)\n#     pred_labels = label_encoder.inverse_transform(pred_int)  # returns ['n']    \n#     print('print Labels:\\n', pred_labels)\n#     return pred_labels[0]\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:10.935032Z","iopub.execute_input":"2025-06-08T13:48:10.935434Z","iopub.status.idle":"2025-06-08T13:48:11.945996Z","shell.execute_reply.started":"2025-06-08T13:48:10.935406Z","shell.execute_reply":"2025-06-08T13:48:11.944673Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n#     try:\n#         df = sequence.to_pandas()\n#         seq_id = df[\"sequence_id\"].iloc[0]\n        \n#         # Check for missing IMU data\n#         imu_cols = [\"acc_x\", \"acc_y\", \"acc_z\", \"rot_w\", \"rot_x\", \"rot_y\", \"rot_z\"]\n#         imu_all_missing = df[imu_cols].isnull().all().all()\n\n#         if imu_all_missing:\n#             print(f\"Sequence {seq_id}: IMU missing — using fallback label.\")\n#             return \"Other\"  # Use the most common class or a neutral fallback\n\n#         features = extract_features(df)\n#         # Replace with your model prediction code\n#         pred = gbc.predict([features])[0]\n#         label = label_encoder.inverse_transform([pred])[0]\n\n#         print(f\"Sequence {seq_id}: Predicted - {label}\")\n#         return label\n\n#     except Exception as e:\n#         print(f\"Error in sequence {seq_id}: {e}\")\n#         return \"Other\"\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:11.948928Z","iopub.execute_input":"2025-06-08T13:48:11.949413Z","iopub.status.idle":"2025-06-08T13:48:11.954900Z","shell.execute_reply.started":"2025-06-08T13:48:11.949388Z","shell.execute_reply":"2025-06-08T13:48:11.953558Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n    try:\n        df = sequence.to_pandas()\n        seq_id = df['sequence_id'].iloc[0]\n\n        stat_features = extract_features(df)\n        stat_features['sequence_id'] = seq_id\n\n        features = stat_features.drop(columns=['sequence_id'])\n\n        # Ensure all expected columns are present\n        for col in feature_names:\n            if col not in features.columns:\n                features[col] = 0.0\n\n        features = features[feature_names]\n        features.fillna(0.0, inplace=True)\n\n        pred = model.predict(features)[0]\n        print(pred)\n        label = label_encoder.inverse_transform([pred])[0]\n        print(label)\n        return label\n\n    except Exception as e:\n        print(f\"Sequence {seq_id}: Exception during prediction - {e}\")\n        return \"Other\"\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:49.924419Z","iopub.execute_input":"2025-06-08T13:48:49.924794Z","iopub.status.idle":"2025-06-08T13:48:49.934011Z","shell.execute_reply.started":"2025-06-08T13:48:49.924764Z","shell.execute_reply":"2025-06-08T13:48:49.932497Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Start the inference server\nimport kaggle_evaluation.cmi_inference_server\ninference_server = kaggle_evaluation.cmi_inference_server.CMIInferenceServer(predict)\n\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway(\n        data_paths=(\n            '/kaggle/input/cmi-detect-behavior-with-sensor-data/test.csv',\n            '/kaggle/input/cmi-detect-behavior-with-sensor-data/test_demographics.csv',\n        )\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-08T13:48:51.424643Z","iopub.execute_input":"2025-06-08T13:48:51.425107Z","iopub.status.idle":"2025-06-08T13:48:52.545385Z","shell.execute_reply.started":"2025-06-08T13:48:51.425076Z","shell.execute_reply":"2025-06-08T13:48:52.543566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}