Source code for esmvaltool.diag_scripts.mlr.models.gbr_sklearn

"""Gradient Boosting Regression model (using :mod:`sklearn`).

Use ``mlr_model_type: gbr_sklearn`` to use this MLR model in the recipe.

"""

import logging
import os

import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error

from esmvaltool.diag_scripts.mlr.models import MLRModel
from esmvaltool.diag_scripts.mlr.models.gbr_base import GBRModel

logger = logging.getLogger(os.path.basename(__file__))


[docs]@MLRModel.register_mlr_model('gbr_sklearn') class SklearnGBRModel(GBRModel): """Gradient Boosting Regression model (:mod:`sklearn` implementation).""" _CLF_TYPE = GradientBoostingRegressor
[docs] def plot_training_progress(self, filename=None): """Plot training progress for training and (if possible) test data. Parameters ---------- filename : str, optional (default: 'training_progress') Name of the plot file. """ clf = self._clf.steps[-1][1].regressor_ train_score = clf.train_score_ test_score = None if 'test' in self.data: test_score = np.zeros((len(clf.train_score_), ), dtype=np.float64) x_test = self._clf.transform_only(self.data['test'].x) y_test = self._clf.transform_target_only(self.get_y_array('test')) sample_weights = self._get_sample_weights('test') for (idx, y_pred) in enumerate(clf.staged_predict(x_test)): test_score[idx] = np.sqrt(mean_squared_error( y_test, y_pred, sample_weight=sample_weights, )) self._plot_training_progress(train_score, test_score=test_score, filename=filename)