[scikit-learn] Delegating "get_params" and "set_params" to a wrapped estimator when parameter is not defined.

Andreas Mueller t3kcit at gmail.com
Fri Apr 13 12:50:04 EDT 2018


Please stay on the mailing list :)

I'm not sure if ValueError is the right error that would be raised (I 
think it's not).
And it's hard to say if this will break something in some edge cases. I 
would
probably rather explicitly encode the parameters of FancyEstimator 
instead of the try,
or get them using super.get_params. You also should rewrite get_params.

In principle something like that should work, but I wouldn't go as far 
as saying it's
"safe" and you should test it extensively.

On 04/13/2018 12:41 PM, Javier López wrote:
> Is something like this safe, or might I be breaking some important 
> functionality?
>
> ```
>     def set_params(self, **params):
>         try:
>             super(FancyEstimator, self).set_params(**params)
>         except ValueError:
>             self.wrapped_estimator_.set_params(**params)
> ```
>
>
> On Fri, Apr 13, 2018 at 5:05 PM Andreas Mueller <t3kcit at gmail.com 
> <mailto:t3kcit at gmail.com>> wrote:
>
>     You just need to implement get_params and set_params yourself to
>     delegate in this way, right?
>
>
>     On 04/13/2018 11:51 AM, Javier López wrote:
>>     I have a class
>>     `FancyEstimator(BaseEstimator, MetaEstimatorMixin): ...` that wraps
>>     around an arbitrary sklearn estimator to add some functionality I
>>     am interested about.
>>     This class contains an attribute `self.estimator` that contains
>>     the wrapped estimator.
>>     Delegation of the main methods, such as `fit`, `transform` works
>>     just fine, but I am
>>     having some issues with `get_params` and `set_params`.
>>
>>     The main idea is, I would like to use my wrapped class as a
>>     drop-in replacement for
>>     the original estimator, but this raises some issues with some
>>     functions
>>     that try using the `get_params` and `set_params` straight in my
>>     class, as the original
>>     parameters now have prefixed names (for instance
>>     `estimator__verbose` instead of `verbose`)
>>     I would like to delegate calls of set_params and get_params in a
>>     smart way so that if a
>>     parameter is unknown for my wrapper class, then it automatically
>>     goes looking for it in
>>     the wrapped estimator.
>>
>>      I am not concerned about my class parameter names as there are
>>     only a couple of very
>>     specific names on it, so it is safe to assume that any unknown
>>     parameter name should
>>     refer to the base estimator. Is there an easy way of doing that?
>>
>>     Cheers,
>>     J
>>
>>
>>     _______________________________________________
>>     scikit-learn mailing list
>>     scikit-learn at python.org <mailto:scikit-learn at python.org>
>>     https://mail.python.org/mailman/listinfo/scikit-learn
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-learn/attachments/20180413/28e73e24/attachment.html>


More information about the scikit-learn mailing list