Source code for cursus.steps.hyperparams.hyperparameters_xgboost_mt
"""
Hyperparameters for XGBoost Multi-Task (one_output_per_tree) model training.
Extends ModelHyperparameters with XGBoost-specific and multi-task parameters.
"""
from pydantic import Field, model_validator, PrivateAttr
from typing import Optional, Literal
from ...core.base.hyperparameters_base import ModelHyperparameters
[docs]
class XgboostMtModelHyperparameters(ModelHyperparameters):
"""
Hyperparameters for XGBoost Multi-Task model (one_output_per_tree via XGBClassifier).
Uses XGBoost native multi-output tree where each tree produces output
for exactly one task in round-robin fashion.
"""
# ========================================================================
# TIER 1: ESSENTIAL USER INPUTS
# ========================================================================
task_label_names: list[str] = Field(
description="List of task/label column names for multi-task learning (REQUIRED)."
)
main_task_index: int = Field(
ge=0,
description="Index of the main task in the task list.",
)
# ========================================================================
# TIER 2: SYSTEM INPUTS WITH DEFAULTS
# ========================================================================
model_class: str = Field(
default="xgboost_mt",
description="Model class identifier for XGBoost multi-task",
)
# XGBoost parameters
n_estimators: int = Field(
default=600, ge=1, description="Number of boosting rounds"
)
max_depth: int = Field(default=8, ge=1, description="Maximum tree depth")
learning_rate: float = Field(
default=0.05, description="Boosting learning rate (eta)"
)
subsample: float = Field(
default=0.9, gt=0.0, le=1.0, description="Row subsampling ratio"
)
colsample_bytree: float = Field(
default=0.9, gt=0.0, le=1.0, description="Column subsampling ratio"
)
reg_alpha: float = Field(default=0.5, ge=0.0, description="L1 regularization")
reg_lambda: float = Field(default=0.05, ge=0.0, description="L2 regularization")
min_child_weight: float = Field(
default=0.1, ge=0.0, description="Minimum child weight"
)
early_stopping_rounds: Optional[int] = Field(
default=10, ge=1, description="Early stopping patience"
)
seed: int = Field(default=17, description="Random seed")
# ========================================================================
# DERIVED FIELDS
# ========================================================================
_num_tasks: Optional[int] = PrivateAttr(default=None)
@property
def num_tasks(self) -> int:
"""Get number of tasks derived from task_label_names."""
if self._num_tasks is None:
self._num_tasks = len(self.task_label_names)
return self._num_tasks
[docs]
@model_validator(mode="after")
def validate_xgboost_mt_hyperparameters(self) -> "XgboostMtModelHyperparameters":
"""Validate XGBoost MT specific hyperparameters."""
super().validate_dimensions()
self._num_tasks = len(self.task_label_names)
if self._num_tasks < 2:
raise ValueError(f"num_tasks must be >= 2, got {self._num_tasks}")
if self.main_task_index >= self._num_tasks:
raise ValueError(
f"main_task_index ({self.main_task_index}) must be < num_tasks ({self._num_tasks})"
)
return self
[docs]
def get_public_init_fields(self) -> dict:
"""Override to include XGBoost MT-specific derived fields."""
base_fields = super().get_public_init_fields()
return {**base_fields, "num_tasks": self.num_tasks}