{"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":12484037,"sourceType":"datasetVersion","datasetId":7877294}],"dockerImageVersionId":31041,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# # NOTEBOOK #1: THE SUPERCHARGED BLUEPRINT TRAINING (FINAL FIX)\n# print(\"Shuruaat: The Supercharged Blueprint Training Factory\")\n\n# import pandas as pd\n# import numpy as np\n# import xgboost as xgb\n# import lightgbm as lgb\n# import catboost as cb\n# from sklearn.model_selection import GroupKFold\n# from sklearn.preprocessing import LabelEncoder\n# from scipy.signal import welch\n# from scipy.spatial.transform import Rotation as R\n# import gc\n# import joblib\n\n# # === Part 1: The Ultimate Feature Engineering Function (FIXED) ===\n# print(\"Ultimate feature function taiyar kiya ja raha hai...\")\n# def extract_ultimate_features(df):\n#     s = df.reset_index(drop=True)\n#     feat = {}\n    \n#     # Time-Domain & Magnitude/Jerk\n#     s['acc_mag'] = np.linalg.norm(s[['acc_x','acc_y','acc_z']].values, axis=1)\n#     s['acc_jerk'] = np.gradient(s['acc_mag'])\n    \n#     # === YEH HISSA UPDATE KIYA GAYA HAI: Bulletproof Quaternion to Euler ===\n#     quat_df = s[['rot_w', 'rot_x', 'rot_y', 'rot_z']].values\n#     # Pehle non-zero norm waale quaternions ko hi process karein\n#     valid_quat_indices = np.linalg.norm(quat_df, axis=1) > 1e-6\n#     euler_angles = np.zeros((len(s), 3)) # Pehle sabko zero se bhar dein\n#     if np.any(valid_quat_indices):\n#         valid_quats = quat_df[valid_quat_indices]\n#         euler_angles[valid_quat_indices] = R.from_quat(valid_quats).as_euler('xyz', degrees=True)\n#     # =======================================================================\n    \n#     s['euler_x'], s['euler_y'], s['euler_z'] = euler_angles[:,0], euler_angles[:,1], euler_angles[:,2]\n#     s['angular_jerk'] = np.gradient(np.linalg.norm(euler_angles, axis=1))\n    \n#     # Statistical Features\n#     stat_cols = ['acc_x','acc_y','acc_z','acc_mag','acc_jerk', 'euler_x', 'euler_y', 'euler_z', 'angular_jerk']\n#     for col in stat_cols:\n#         arr = s[col].values\n#         feat[f'{col}_mean'], feat[f'{col}_std'], feat[f'{col}_max'], feat[f'{col}_min'], feat[f'{col}_skew'] = arr.mean(), arr.std(), arr.max(), arr.min(), pd.Series(arr).skew()\n    \n#     # Phase-Aware Features\n#     for phase in ['Transition', 'Pause', 'Gesture']:\n#         phase_df = s[s.behavior == phase]\n#         if not phase_df.empty:\n#             for col in ['acc_mag', 'acc_jerk']:\n#                 arr = phase_df[col].values\n#                 feat[f'{phase}_{col}_mean'], feat[f'{phase}_{col}_std'] = arr.mean(), arr.std()\n                \n#     # Frequency Power Bands\n#     for col in ['acc_x','acc_y','acc_z','acc_mag']:\n#         arr = s[col].values\n#         f, Pxx = welch(arr, fs=50, nperseg=min(256, len(arr)))\n#         feat[f'{col}_bp0_5'], feat[f'{col}_bp5_15'] = Pxx[(f>=0)&(f<5)].sum(), Pxx[(f>=5)&(f<15)].sum()\n    \n#     # Sensor-Specific Features\n#     for col in [c for c in s if c.startswith('thm_')]:\n#         arr = s[col].replace(-1, np.nan)\n#         if not arr.dropna().empty:\n#             feat[f'{col}_mean'], feat[f'{col}_delta'] = arr.mean(), arr.iloc[-1] - arr.iloc[0]\n#         else: feat[f'{col}_mean'], feat[f'{col}_delta'] = 0, 0\n            \n#     # Demographics\n#     demo = df.iloc[0]\n#     feat['age'], feat['sex'], feat['handedness'] = demo.get('age',-1), demo.get('sex',-1), demo.get('handedness',-1)\n\n#     return pd.Series(feat)\n\n# # === Part 2: Data Preparation ===\n# print(\"Data Preparation...\")\n# DATA_DIR = '/kaggle/input/cmi-detect-behavior-with-sensor-data/'\n# train = pd.read_csv(DATA_DIR+'train.csv')\n# demo  = pd.read_csv(DATA_DIR+'train_demographics.csv')\n# df    = train.merge(demo, on='subject', how='left')\n# feats = df.groupby('sequence_id').apply(extract_ultimate_features).fillna(0)\n# labels = df.groupby('sequence_id')['gesture'].first()\n# le = LabelEncoder().fit(labels)\n# y = le.transform(labels)\n# joblib.dump(le, 'label_encoder.pkl')\n# joblib.dump(feats.columns.tolist(), 'train_cols.pkl')\n\n# # === Part 3: Training The Ultimate Tree Ensemble ===\n# print(\"\\nTraining The Ultimate Tree Ensemble...\")\n# X = feats.values\n# groups = df.groupby('sequence_id')['subject'].first().loc[feats.index].values\n# kf = GroupKFold(n_splits=5)\n\n# for fold, (tr, va) in enumerate(kf.split(X, y, groups)):\n#     print(f\"--- FOLD {fold+1}/5 ---\")\n#     X_tr, y_tr = X[tr], y[tr]\n#     X_va, y_va = X[va], y[va]\n\n#     # LightGBM\n#     m_lgb = lgb.LGBMClassifier(n_estimators=1500, learning_rate=0.02, num_leaves=80, max_depth=10, random_state=42+fold)\n#     m_lgb.fit(X_tr, y_tr, eval_set=[(X_va, y_va)], callbacks=[lgb.early_stopping(50, verbose=False)])\n#     joblib.dump(m_lgb, f'lgb_fold_{fold}.pkl')\n\n#     # XGBoost\n#     m_xgb = xgb.XGBClassifier(n_estimators=1500, learning_rate=0.02, max_depth=8, subsample=0.8, colsample_bytree=0.8, use_label_encoder=False, eval_metric='mlogloss', random_state=42+fold)\n#     m_xgb.fit(X_tr, y_tr, eval_set=[(X_va, y_va)], early_stopping_rounds=50, verbose=False)\n#     m_xgb.save_model(f'xgb_fold_{fold}.json')\n\n#     # CatBoost\n#     m_cb = cb.CatBoostClassifier(iterations=1500, learning_rate=0.02, depth=8, verbose=False, random_seed=42+fold)\n#     m_cb.fit(X_tr, y_tr, eval_set=[(X_va, y_va)], early_stopping_rounds=50)\n#     joblib.dump(m_cb, f'cb_fold_{fold}.pkl')\n    \n#     print(f\"  - Fold {fold+1} ke models save ho gaye.\")\n#     gc.collect()\n\n# print(\"\\nSupercharged Training poori hui.\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# NOTEBOOK #2: CMI - SUPERCHARGED SUBMISSION (FINAL FIX)\nprint(\"Shuruaat: The Supercharged Submission (Final Fix)\")\n\nimport os\nimport pandas as pd\nimport polars as pl\nimport numpy as np\nimport xgboost as xgb\nimport lightgbm as lgb\nimport catboost as cb\nimport gc\nimport joblib\nfrom scipy.signal import welch\nfrom scipy.spatial.transform import Rotation as R\nfrom kaggle_evaluation.cmi_inference_server import CMIInferenceServer\n\n# === 1. Load Pre-Trained Models and Files ===\nprint(\"Saare 15 Supercharged models aur files load kiye ja rahe hain...\")\nMODEL_PATH = '/kaggle/input/all-in-one-model'\nprint(f\"Models ka path mil gaya hai: {MODEL_PATH}\")\n\nLGB_MODELS = [joblib.load(os.path.join(MODEL_PATH , f'lgb_fold_{i}.pkl')) for i in range(5)]\nXGB_MODELS = [xgb.XGBClassifier() for _ in range(5)]\nfor i, model in enumerate(XGB_MODELS): \n    model.load_model(os.path.join(MODEL_PATH , f'xgb_fold_{i}.json'))\nCB_MODELS = [joblib.load(os.path.join(MODEL_PATH , f'cb_fold_{i}.pkl')) for i in range(5)]\nLABEL_ENCODER = joblib.load(os.path.join(MODEL_PATH ,'label_encoder.pkl'))\nTRAIN_COLS = joblib.load(os.path.join(MODEL_PATH , 'train_cols.pkl'))\nprint(\"Saare models aur files safaltapoorvak load ho gaye hain.\")\n\n\n# === 2. Inference Feature Function (UNBREAKABLE VERSION) ===\n# === YEH HISSA POORI TARAH SE BADLA GAYA HAI ===\ndef extract_ultimate_features_inf(df):\n    s = df.reset_index(drop=True)\n    feat = {}\n    \n    s['acc_mag'] = np.linalg.norm(s[['acc_x','acc_y','acc_z']].values, axis=1)\n    s['acc_jerk'] = np.gradient(s['acc_mag'])\n    quat_df = s[['rot_w', 'rot_x', 'rot_y', 'rot_z']].values\n    valid_quat_indices = np.linalg.norm(quat_df, axis=1) > 1e-6\n    euler_angles = np.zeros((len(s), 3))\n    if np.any(valid_quat_indices):\n        valid_quats = quat_df[valid_quat_indices]\n        euler_angles[valid_quat_indices] = R.from_quat(valid_quats).as_euler('xyz', degrees=True)\n    s['euler_x'], s['euler_y'], s['euler_z'] = euler_angles[:,0], euler_angles[:,1], euler_angles[:,2]\n    s['angular_jerk'] = np.gradient(np.linalg.norm(euler_angles, axis=1))\n    \n    stat_cols = ['acc_x','acc_y','acc_z','acc_mag','acc_jerk', 'euler_x', 'euler_y', 'euler_z', 'angular_jerk']\n    for col in stat_cols:\n        arr = s[col].values\n        feat[f'{col}_mean'], feat[f'{col}_std'], feat[f'{col}_max'], feat[f'{col}_min'], feat[f'{col}_skew'] = arr.mean(), arr.std(), arr.max(), arr.min(), pd.Series(arr).skew()\n    \n    # --- SAHI TareeKA: Check karo ki 'behavior' column hai ya nahi ---\n    if 'behavior' in s.columns:\n        for phase in ['Transition', 'Pause', 'Gesture']:\n            phase_df = s[s.behavior == phase]\n            if not phase_df.empty:\n                for col in ['acc_mag', 'acc_jerk']:\n                    arr = phase_df[col].values\n                    feat[f'{phase}_{col}_mean'] = arr.mean()\n                    feat[f'{phase}_{col}_std'] = arr.std()\n\n    for col in ['acc_x','acc_y','acc_z','acc_mag']:\n        arr = s[col].values\n        f, Pxx = welch(arr, fs=50, nperseg=min(256, len(arr)))\n        feat[f'{col}_bp0_5'], feat[f'{col}_bp5_15'] = Pxx[(f>=0)&(f<5)].sum(), Pxx[(f>=5)&(f<15)].sum()\n        \n    for col in [c for c in s if c.startswith('thm_')]:\n        arr = s[col].replace(-1, np.nan)\n        if not arr.dropna().empty:\n            feat[f'{col}_mean'], feat[f'{col}_delta'] = arr.mean(), arr.iloc[-1] - arr.iloc[0]\n        else: feat[f'{col}_mean'], feat[f'{col}_delta'] = 0, 0\n            \n    demo = df.iloc[0]\n    feat['age'], feat['sex'], feat['handedness'] = demo.get('age',-1), demo.get('sex',-1), demo.get('handedness',-1)\n    \n    return pd.Series(feat)\n\n# =========================================================\n\n# === 3. Prediction Function ===\ndef predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n    try:\n        sequence_pd = sequence.to_pandas()\n        if sequence_pd.empty: return 'Text on phone'\n        \n        test_df = pd.merge(sequence_pd.copy(), demographics.to_pandas(), on='subject', how='left')\n        X_test_single_series = extract_ultimate_features_inf(test_df).fillna(0)\n        X_test_single = pd.DataFrame(X_test_single_series).T\n        X_test_single = X_test_single.reindex(columns=TRAIN_COLS, fill_value=0)\n        \n        all_probas = []\n        for model in XGB_MODELS: all_probas.append(model.predict_proba(X_test_single)[0])\n        for model in LGB_MODELS: all_probas.append(model.predict_proba(X_test_single)[0])\n        for model in CB_MODELS: all_probas.append(model.predict_proba(X_test_single)[0])\n        \n        avg_probas = np.mean(all_probas, axis=0)\n        final_prediction_encoded = np.argmax(avg_probas)\n        prediction_text = LABEL_ENCODER.inverse_transform([final_prediction_encoded])[0]\n        \n        return prediction_text\n    except Exception as e:\n        print(f\"Error on a sequence: {e}. Returning default.\")\n        return 'Text on phone'\n\n# === 4. Server Start ===\nprint(\"Server ko chalu kiya ja raha hai...\")\ninference_server = CMIInferenceServer(predict)\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway(\n        data_paths=('/kaggle/input/cmi-detect-behavior-with-sensor-data/test.csv', '/kaggle/input/cmi-detect-behavior-with-sensor-data/test_demographics.csv')\n    )\nprint(\"Script safaltapoorvak poora hua.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-16T09:21:30.347629Z","iopub.execute_input":"2025-07-16T09:21:30.348301Z","iopub.status.idle":"2025-07-16T09:21:46.346513Z","shell.execute_reply.started":"2025-07-16T09:21:30.348270Z","shell.execute_reply":"2025-07-16T09:21:46.345566Z"}},"outputs":[],"execution_count":null}]}