<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def estimate(self, X, **params):
 """ Estimates the model given the data X Parameters X : object A reference to the data from which the model will be estimated params : dict New estimation parameter values. The parameters must that have been announced in the __init__ method of this estimator. The present settings will overwrite the settings of parameters given in the __init__ method, i.e. the parameter values after this call will be those that have been used for this estimation. Use this option if only one or a few parameters change with respect to the __init__ settings for this run, and if you don't need to remember the original settings of these changed parameters. Returns ------- estimator : object The estimated estimator with the model being available. """

        # set params
        if params:
            self.set_params(**params)
        self._model = self._estimate(X)
        # ensure _estimate returned something
        assert self._model is not None
        self._estimated = True
        return self