{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.11"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"},{"sourceId":12069984,"sourceType":"datasetVersion","datasetId":7597535}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.model_selection import train_test_split, GroupKFold,StratifiedKFold, cross_val_score\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import f1_score, classification_report\nimport os\nimport optuna\nimport sys\nfrom xgboost import XGBClassifier\nimport numpy as np\n# import joblib\nfrom joblib import Memory,dump,load","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model = load('/kaggle/working/models/xgb_tunned.pkl')\nmodel = load('/kaggle/input/brbf-model-features-cols/xgb_model.pkl')\nmodel_features = load('/kaggle/input/brbf-model-features-cols/model_features.pkl')\nle = load('/kaggle/input/brbf-model-features-cols/label_encoder.pkl')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#labels","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df = pd.read_csv('/kaggle/input/cmi-detect-behavior-with-sensor-data/train.csv')\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def drop_not_used_columns(df):\n#     # df.drop('sequence_id', axis=1, inplace=True)\n#     df.drop('row_id', axis=1, inplace=True)\n#     df.drop('subject', axis=1, inplace=True)\n#     # df.drop('gesture', axis=1)\n#     # df.drop('sequence_type', axis=1, inplace=True)\n#     df.drop('orientation', axis=1, inplace=True)\n#     df.drop('behavior', axis=1, inplace=True)\n#     df.drop('phase', axis=1, inplace=True)\n#     df.drop('sequence_counter', axis=1, inplace=True)\n    \n#     return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df = drop_not_used_columns(df)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# labels = df[['sequence_id', 'gesture']].drop_duplicates().set_index('sequence_id')\n\n\n# le = LabelEncoder()\n# labels['gesture_enc'] = le.fit_transform(labels['gesture'])\n\n# seq_type = df[['sequence_id', 'sequence_type']].drop_duplicates().set_index('sequence_id')\n# labels['binary_target'] = (seq_type['sequence_type'] =='target').astype(int)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**(3) Group Sensor Data by Sequence**","metadata":{}},{"cell_type":"code","source":"# # df.columns.drop()\n# df.drop(columns=['gesture', 'sequence_type'], inplace=True, errors='ignore')\n\n# # fill NAs (can also be done post-aggregation if preferred )\n# df.fillna(-1, inplace=True)\n\n# # Aggregate features: mean, std, min, max\n# agg_df = df.groupby('sequence_id').agg(['mean', 'std', 'min', 'max'])\n\n# # fill multi-index column \n# agg_df.columns = ['_'.join(col) for col in agg_df.columns]\n\n# # merge features and target\n# data = agg_df.join(labels)\n\n# # define features and target\n# X = data.drop(columns=['gesture', 'gesture_enc', 'binary_target'])\n# # or binary_target for binary classification\n# y = data['gesture_enc']\n\n# X_train, X_test, y_train, y_test= train_test_split(X,y, stratify=y, random_state=42)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# X_train.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**(4) join with Labels**\n","metadata":{}},{"cell_type":"markdown","source":"**(5) Train and test split & Model**","metadata":{}},{"cell_type":"code","source":"# def objective(trial):  # Fixed typo: 'trail' → 'trial'\n\n#     params = {\n#         \"verbosity\": 0,\n#         \"n_estimators\": trial.suggest_int(\"n_estimators\", 100, 500),\n#         \"max_depth\": trial.suggest_int(\"max_depth\", 3, 15),\n#         \"learning_rate\": trial.suggest_float(\"learning_rate\", 0.01, 0.03),\n#         \"subsample\": trial.suggest_float(\"subsample\", 0.5, 1),  # Fixed: 'sub_sample' → 'subsample'\n#         \"colsample_bytree\": trial.suggest_float(\"colsample_bytree\", 0.5, 1.0),\n#         \"gamma\": trial.suggest_float(\"gamma\", 0, 5),\n#         \"reg_alpha\": trial.suggest_float(\"reg_alpha\", 0.0, 5.0),\n#         \"reg_lambda\": trial.suggest_float(\"reg_lambda\", 0.0, 5.0),\n#         \"tree_method\": \"gpu_hist\",\n#         \"predictor\": \"gpu_predictor\"\n#     }\n\n#     model2 = XGBClassifier(**params, random_state=42)\n\n#     kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n#     scores = cross_val_score(model2, X_train, y_train, cv=kf, scoring=\"accuracy\")  # Added: cv and scoring\n\n#     return scores.mean()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#create optuna study case\n# study = optuna.create_study(direction='maximize')\n# study.optimize(objective, n_trials=15, n_jobs=4)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# study.trials","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Trial 9 finished with value: 0.5470311929159201 and parameters: {, 'reg_alpha': 3}. Best is trial 9 with value: 0.5470311929159201.\n# best_params = {\n#     'n_estimators':448,\n#     'colsample_bytree':0.8822469416325298,\n#     'max_depth':9,\n#     'learning_rate':0.016971012315798777,\n#     'subsample': 0.6135077384585775,\n#     'gamma': 1.40405200661559,\n#     'reg_alpha': 3.1308879360965576,\n#     'reg_lambda':1.7932354087613405,\n# }\n# model_best = XGBClassifier(**best_params, tree_method='hist', device='cuda')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model_best.fit(X_train, y_train)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# y_predict_tunned = model_best.predict(X_test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# dump(model_best, '/kaggle/working/models/xgb_tunned.pkl')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# os.makedirs('/kaggle/working/models/',exist_ok=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Preprocessing function\n\ndef preprocess_function(sequence_df):\n    \n    if not isinstance(sequence_df, pd.DataFrame):\n        sequence_df = sequence_df.to_pandas()\n\n    sequence_df = sequence_df.reset_index(drop=True)\n\n    # Drop unused columns\n    sequence_df.drop(columns=[\n        'sequence_id', 'row_id', 'subject', 'sequence_type',\n        'orientation', 'behavior', 'phase', 'sequence_counter'\n    ], inplace=True, errors='ignore')\n\n    sequence_df.fillna(-1, inplace=True)\n\n    # Calculate all stats\n    stats = ['mean', 'std', 'min', 'max']\n    stat_dfs = {\n        stat: getattr(sequence_df, stat)(numeric_only=True).to_frame().T\n        for stat in stats\n    }\n\n    # Rename columns with suffix\n    for stat in stats:\n        stat_dfs[stat].columns = [f\"{col}_{stat}\" for col in stat_dfs[stat].columns]\n\n    # Interleave columns: col1_mean, col1_std, col1_min, col1_max, col2_mean, ...\n    all_columns = sequence_df.select_dtypes(include='number').columns\n    combined = pd.DataFrame()\n    for col in all_columns:\n        row = {\n            f\"{col}_mean\": stat_dfs['mean'][f\"{col}_mean\"].iloc[0],\n            f\"{col}_std\": stat_dfs['std'][f\"{col}_std\"].iloc[0],\n            f\"{col}_min\": stat_dfs['min'][f\"{col}_min\"].iloc[0],\n            f\"{col}_max\": stat_dfs['max'][f\"{col}_max\"].iloc[0],\n        }\n        combined = pd.concat([combined, pd.DataFrame([row])], axis=1)\n\n    return combined\n\n# predict function \ndef predict(sequence_df, sequence_demos_df):\n# def predict(sequence_df, sequence_demos_df):\n    # print(\"sequence_df shape:\", sequence_df.shape)\n    # print(\"sequence_demos_df shape:\", sequence_demos_df.shape)\n    # print(\"sequence_id:\", sequence_df['sequence_id'][0] if 'sequence_id' in sequence_df.columns else \"N/A\")\n    # \n    try:\n        features = preprocess_function(sequence_df)\n        # features = preprocess_function(sequence_df, sequence_demos_df)\n        print(\"Preprocessing successful. Feature shape:\", features.shape)\n    except Exception as e:\n        print(\"Error during preprocessing:\", e)\n        raise\n\n    try:\n        features = features.reindex(columns=model_features, fill_value=0.0)\n        y_pred = model.predict(features)\n        \n        gesture = le.inverse_transform([y_pred[0]])[0]\n        print(\"Predicted gesture:\", gesture)\n    except Exception as e:\n        print(\"Error during prediction:\", e)\n        raise\n\n    return gesture","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# features\n# features.shape\n\n# model_features = X_test.columns.to_list()\n# features3 = features.reindex(columns=model_features, fill_value=0.0)\n# y_predict_test2 = model.predict(features)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# === Run Evaluation Server ===\nimport kaggle_evaluation.cmi_inference_server\nimport os\ninference_server = kaggle_evaluation.cmi_inference_server.CMIInferenceServer(predict)\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},"outputs":[],"execution_count":null}]}