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)