{"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"}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<div style=\"display: flex; justify-content: space-between; align-items: flex-start;\">\n    <div style=\"text-align: left;\">\n        <p style=\"color:#FFD700; font-size: 15px; font-weight: bold; margin-bottom: 1px; text-align: left;\">Published on  June 1, 2025</p>\n        <h4 style=\"color:#4B0082; font-weight: bold; text-align: left; margin-top: 6px;\">Author: Jocelyn C. Dumlao</h4>\n        <p style=\"font-size: 17px; line-height: 1.7; color: #333; text-align: center; margin-top: 20px;\"></p>\n        <a href=\"https://www.linkedin.com/in/jocelyn-dumlao-168921a8/\" target=\"_blank\" style=\"display: inline-block; background-color: #003f88; color: #fff; text-decoration: none; padding: 5px 10px; border-radius: 10px; margin: 15px;\">LinkedIn</a>\n        <a href=\"https://github.com/jcdumlao14\" target=\"_blank\" style=\"display: inline-block; background-color: transparent; color: #059c99; text-decoration: none; padding: 5px 10px; border-radius: 10px; margin: 15px; border: 2px solid #007bff;\">GitHub</a>\n        <a href=\"https://www.youtube.com/@CogniCraftedMinds\" target=\"_blank\" style=\"display: inline-block; background-color: #ff0054; color: #fff; text-decoration: none; padding: 5px 10px; border-radius: 10px; margin: 15px;\">YouTube</a>\n        <a href=\"https://www.kaggle.com/jocelyndumlao\" target=\"_blank\" style=\"display: inline-block; background-color: #3a86ff; color: #fff; text-decoration: none; padding: 5px 10px; border-radius: 10px; margin: 15px;\">Kaggle</a>\n    </div>\n</div>","metadata":{}},{"cell_type":"markdown","source":"<center>\n  <img src=\"https://www.kaggle.com/competitions/102335/images/header\" alt=\"image\" width=\"40%\">\n</center>","metadata":{}},{"cell_type":"markdown","source":"# <div style=\"color:white;display:inline-block;border-radius:5px;background-color:#1a87c2 ;font-family:Nexa;overflow:hidden\"><p style=\"padding:10px;color:white;overflow:hidden;font-size:85%;letter-spacing:0.5px;margin:0;border: 6px groove #8be9fe;\"><b> </b>🔍🧾📤 Prediction and Submission</p></div>","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.preprocessing import LabelEncoder\nimport os\nimport polars as pl  # Import Polars\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import f1_score\nimport kaggle_evaluation.cmi_inference_server  # Import the inference server\nimport pyarrow.parquet as pq  # Import parquet writing library\nimport pyarrow as pa\n\n# --- 1. Load and Train Model---\n# Load training data\ntrain_path = '/kaggle/input/cmi-detect-behavior-with-sensor-data/train.csv'\ntrain_demo_path = '/kaggle/input/cmi-detect-behavior-with-sensor-data/train_demographics.csv'\ntrain = pd.read_csv(train_path, nrows=10000)  # Limiting the rows to 10000 for testing\ntrain_demo = pd.read_csv(train_demo_path)\ntrain = train.merge(train_demo, on=\"subject\", how=\"left\")\n\n# Encode gesture labels\nle = LabelEncoder()\ntrain['gesture_encoded'] = le.fit_transform(train['gesture'])\n\n# Features and target\nfeatures = ['acc_x', 'acc_y', 'acc_z', 'rot_w', 'rot_x', 'rot_y', 'rot_z']\nX = train[features]\ny = train['gesture_encoded']\n\n# Train model\nclf = RandomForestClassifier(n_estimators=100, random_state=42)\n\n# Split data\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n\nclf.fit(X_train, y_train)\n\n\n# --- 2. Define the `predict` function ---\ndef predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n    \"\"\"\n    Predicts the gesture for a given sequence of sensor data.\n    \"\"\"\n    try:\n        # Convert Polars DataFrames to Pandas for easier processing\n        sequence = sequence.to_pandas()\n        demographics = demographics.to_pandas()\n\n        # Merge demographic info \n        sequence = sequence.merge(demographics, on=\"subject\", how=\"left\")\n\n        # Extract features\n        X_test = sequence[features]\n\n        # Predict gesture (encoded)\n        gesture_encoded = clf.predict(X_test)[0]  \n\n        # Decode gesture\n        gesture = le.inverse_transform([gesture_encoded])[0]\n\n        return gesture\n    except Exception as e:\n        print(f\"Error in predict function: {e}\")  # Log the error\n        return \"Unknown\"  # Or a default gesture\n\n# --- 3. Start the Inference Server ---\ninference_server = kaggle_evaluation.cmi_inference_server.CMIInferenceServer(predict)\n\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    # Create an empty Pandas DataFrame with the required columns, DO NOT write to file.\n    submission = pd.DataFrame(columns=['sequence_id', 'gesture']) #Dummy Dataframe\n\n    # Serve the Inference Server (The server manages the submission creation).\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-02T04:31:01.066923Z","iopub.execute_input":"2025-06-02T04:31:01.067280Z","iopub.status.idle":"2025-06-02T04:31:06.599105Z","shell.execute_reply.started":"2025-06-02T04:31:01.067255Z","shell.execute_reply":"2025-06-02T04:31:06.598048Z"}},"outputs":[],"execution_count":null}]}