{"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":"gpu","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"},{"sourceId":12216201,"sourceType":"datasetVersion","datasetId":7696109}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# ===============================================================\n# ===         Step 0: Zaruri Libraries Import Karna           ===\n# ===============================================================\nprint(\"Shuruaat: Final Submission Notebook\")\n\nimport os\nimport pandas as pd\nimport polars as pl\nimport numpy as np\nimport xgboost as xgb\nimport lightgbm as lgb\nimport gc\nimport joblib\nfrom kaggle_evaluation.cmi_inference_server import CMIInferenceServer\n\n# Sahi path set karna\nMODEL_PATH = '/kaggle/input/cmi-data/'\nprint(f\"Models ka path mil gaya hai: {MODEL_PATH}\")\n\n# Models ko load karna\nXGB_MODELS = []\nLGB_MODELS = []\nfor fold in range(5):\n    # XGBoost\n    xgb_model = xgb.XGBClassifier()\n    xgb_model.load_model(os.path.join(MODEL_PATH, f'xgb_model_fold_{fold}.json'))\n    XGB_MODELS.append(xgb_model)\n\n    # LightGBM\n    lgb_model = lgb.Booster(model_file=os.path.join(MODEL_PATH, f'lgb_model_fold_{fold}.txt'))\n    LGB_MODELS.append(lgb_model)\n\n# Baki files ko load karna\nLABEL_ENCODER = joblib.load(os.path.join(MODEL_PATH, 'label_encoder.pkl'))\nTRAIN_COLS = joblib.load(os.path.join(MODEL_PATH, 'train_cols.pkl'))\n\nprint(\"✅ Saare models aur files safaltapoorvak load ho gaye hain.\")\n\n# ===============================================================\n# ===       Step 2: Inference ke liye Feature Function        ===\n# ===============================================================\ndef create_features_for_inference(df):\n    try: df['acc_mag'] = np.sqrt(df['acc_x']**2 + df['acc_y']**2 + df['acc_z']**2)\n    except: df['acc_mag'] = 0\n    for col in ['acc_x', 'acc_y', 'acc_z', 'acc_mag']:\n        try: df[f'{col}_jerk'] = df[col].diff().fillna(0)\n        except: df[f'{col}_jerk'] = 0\n    features = {}\n    numeric_cols = df.select_dtypes(include=np.number).columns.tolist()\n    cols_to_exclude = ['subject']\n    for col in cols_to_exclude:\n        if col in numeric_cols: numeric_cols.remove(col)\n    for col in numeric_cols:\n        data = df[col].dropna()\n        if not data.empty:\n            features[f'{col}_mean'], features[f'{col}_std'], features[f'{col}_min'], features[f'{col}_max'], features[f'{col}_median'], features[f'{col}_skew'] = data.mean(), data.std(), data.min(), data.max(), data.median(), data.skew()\n        else:\n            features[f'{col}_mean'], features[f'{col}_std'], features[f'{col}_min'], features[f'{col}_max'], features[f'{col}_median'], features[f'{col}_skew'] = 0,0,0,0,0,0\n    demo_cols = ['age', 'sex', 'handedness']\n    for col in demo_cols:\n        if col in df.columns and not df[col].empty: features[col] = df[col].iloc[0]\n        else: features[col] = -1\n    return pd.DataFrame([features])\n\n\n# ===============================================================\n# ===     Step 3: Prediction Function (XGB + LGB Ensemble)    ===\n# ===============================================================\ndef predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n    try:\n        test_df = pd.merge(sequence.to_pandas(), demographics.to_pandas(), on='subject', how='left')\n        if test_df.empty: return 'Text on phone'\n\n        X_test_single = create_features_for_inference(test_df).fillna(0)\n        X_test_single = X_test_single.reindex(columns=TRAIN_COLS, fill_value=0)\n        \n        # --- ENSEMBLING ---\n        all_probas = []\n        # XGBoost models se probabilities\n        for model in XGB_MODELS:\n            all_probas.append(model.predict_proba(X_test_single)[0])\n        # LightGBM models se probabilities\n        for model in LGB_MODELS:\n            all_probas.append(model.predict(X_test_single)[0])\n            \n        # Saari probabilities ka average lena\n        avg_probas = np.mean(all_probas, axis=0)\n        \n        # Antim faisla\n        final_prediction_encoded = np.argmax(avg_probas)\n        prediction_text = LABEL_ENCODER.inverse_transform([final_prediction_encoded])\n        \n        return prediction_text[0]\n    except Exception as e:\n        print(f\"Error on a sequence: {e}. Returning default.\")\n        return 'Text on phone'\n\n# ===============================================================\n# ===             Step 4: Server ko Chalu Karna               ===\n# ===============================================================\nprint(\"Server ko chalu kiya ja raha hai...\")\ninference_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    )\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T11:40:31.006759Z","iopub.execute_input":"2025-06-19T11:40:31.007010Z","iopub.status.idle":"2025-06-19T11:40:44.698998Z","shell.execute_reply.started":"2025-06-19T11:40:31.006991Z","shell.execute_reply":"2025-06-19T11:40:44.698199Z"}},"outputs":[],"execution_count":null}]}