{"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":96164,"databundleVersionId":11418275,"sourceType":"competition"},{"sourceId":11955382,"sourceType":"datasetVersion","datasetId":7516050}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport xgboost as xgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error, r2_score\n\n# === Data Type Optimization ===\ndef optimize_dataframe(df):\n    for col in df.columns:\n        col_type = df[col].dtype\n        if pd.api.types.is_numeric_dtype(col_type):\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if pd.api.types.is_integer_dtype(col_type):\n                if c_min >= np.iinfo(np.int8).min and c_max <= np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min >= np.iinfo(np.int16).min and c_max <= np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min >= np.iinfo(np.int32).min and c_max <= np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n            else:\n                if c_min >= np.finfo(np.float16).min and c_max <= np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min >= np.finfo(np.float32).min and c_max <= np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n    return df\n\n# === Load datasets ===\ntrain = pd.read_parquet(\"/kaggle/input/drw-crypto-market-prediction/train.parquet\")\ntest = pd.read_parquet(\"/kaggle/input/drw-crypto-market-prediction/test.parquet\")\nsubmission = pd.read_csv(\"/kaggle/input/drw-crypto-market-prediction/sample_submission.csv\")\n\ntrain.drop(columns=[\"timestamp\"], inplace=True, errors=\"ignore\")\ntest.drop(columns=[\"timestamp\"], inplace=True, errors=\"ignore\")\n\n# === Load top features only\ntop_features = pd.read_csv(\"/kaggle/input/shapfeature/shap_selected_features.csv\")[\"feature\"].tolist()\n\n# Subset\nX = train[top_features]\ny = train[\"label\"]\ntest = test[top_features]\n\n# Optimize types\nX = optimize_dataframe(X)\ntest = optimize_dataframe(test)\n\n# === Train-val split\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n\n# === XGBoost training with L1 and L2 regularization\nmodel = xgb.XGBRegressor(\n    tree_method=\"hist\",\n    device=\"cuda\",\n    n_estimators=500,\n    max_depth=8,\n    learning_rate=0.05,\n    subsample=0.6,\n    colsample_bytree=0.8,\n    reg_alpha=0.1,  # L1 regularization\n    reg_lambda=1.0,  # L2 regularization\n    random_state=42\n)\n\nmodel.fit(X_train, y_train,\n          eval_set=[(X_val, y_val)],\n          early_stopping_rounds=20,\n          verbose=True)\n\n# === Evaluate\ny_pred_val = model.predict(X_val)\nrmse = mean_squared_error(y_val, y_pred_val, squared=False)\nr2 = r2_score(y_val, y_pred_val)\nprint(f\"\\n📊 Final Top-Only Model Evaluation\")\nprint(f\"✅ Validation RMSE: {rmse:.5f}\")\nprint(f\"✅ Validation R²:   {r2:.5f}\")\n\n# === Predict and Save submission\ny_test_pred = model.predict(test)\nsubmission[\"prediction\"] = y_test_pred\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"📦 Saved: submission_top_only_l1l2.csv\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-28T05:23:27.426974Z","iopub.execute_input":"2025-05-28T05:23:27.427256Z","iopub.status.idle":"2025-05-28T05:23:51.347374Z","shell.execute_reply.started":"2025-05-28T05:23:27.427232Z","shell.execute_reply":"2025-05-28T05:23:51.346412Z"}},"outputs":[],"execution_count":null}]}