| """XGBoost model wrapper.""" | |
| from __future__ import annotations | |
| import xgboost as xgb | |
| import pandas as pd | |
| from sklearn.metrics import mean_squared_error | |
| def train_xgboost(train_df: pd.DataFrame, valid_df: pd.DataFrame, feature_cols: list[str], target_col: str = "target_rank"): | |
| dtrain = xgb.DMatrix(train_df[feature_cols], label=train_df[target_col]) | |
| dvalid = xgb.DMatrix(valid_df[feature_cols], label=valid_df[target_col]) | |
| params = { | |
| "objective": "reg:squarederror", | |
| "learning_rate": 0.05, | |
| "max_depth": 6, | |
| "subsample": 0.8, | |
| "colsample_bytree": 0.8, | |
| "seed": 42, | |
| } | |
| model = xgb.train( | |
| params, | |
| dtrain, | |
| num_boost_round=500, | |
| evals=[(dvalid, "valid")], | |
| early_stopping_rounds=50, | |
| verbose_eval=False, | |
| ) | |
| pred = model.predict(dvalid) | |
| rmse = mean_squared_error(valid_df[target_col], pred, squared=False) | |
| print(f"XGBoost valid RMSE: {rmse:.6f}") | |
| return model | |