Spaces:
Sleeping
Sleeping
File size: 1,656 Bytes
4c8f740 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
from sklearn.ensemble import GradientBoostingClassifier
import optuna
from models.base_model import BaseModel
from numpy import ndarray
import numpy as np
# === GradientBoosting Implementation ===
class GradientBoostingModel(BaseModel):
def __init__(self) -> None:
super().__init__()
def objective(
self,
trial: optuna.trial.Trial,
X_train: ndarray,
y_train: ndarray,
X_val: ndarray,
y_val: ndarray
) -> float:
params = {
"learning_rate": trial.suggest_float("learning_rate", 1e-3, 0.3, log=True),
"max_depth": trial.suggest_int("max_depth", 3, 10),
"n_estimators": trial.suggest_int("n_estimators", 100, 1000),
"subsample": trial.suggest_float("subsample", 0.5, 1.0),
}
model = GradientBoostingClassifier(**params)
model.fit(X_train, y_train)
return model.score(X_val, y_val)
def train(
self,
X_train: ndarray,
y_train: ndarray,
X_val: ndarray,
y_val: ndarray,
use_optuna: bool = False,
n_trials: int = 20
) -> None:
if use_optuna:
study = optuna.create_study(direction="maximize")
study.optimize(lambda trial: self.objective(trial, X_train, y_train, X_val, y_val), n_trials=n_trials, n_jobs=-1)
self.best_params = study.best_params
self.model = GradientBoostingClassifier(**self.best_params)
else:
self.model = GradientBoostingClassifier()
X, y = np.vstack([X_train, X_val]), np.hstack([y_train, y_val])
self.model.fit(X, y)
|