我正在努力实现以下目标: 给定一个任意的sklearn估计器,我想要一个包装功能 其中:
已保存的缩放系数。
我因此创建了以下结构:
class ZScaler(Scaler):
def __init__(self):
self.__mean = None
self.__std = None
def fit(self, vector, **kwargs):
self.__mean = np.mean(vector)
self.__std = np.std(vector)
return self
def transform(self, vector):
return (vector - self.__mean) / self.__std
def fit_transform(self, vector, **kwargs):
self.fit(vector)
return self.transform(vector)
def inverse_transform(self, vector):
return (vector * self.__std) + self.__mean
在以下类工厂中使用:
def TargetScalingEstimatorDecorator(EstimatorClass, ScalerInstance):
class TargetScalingEstimator(EstimatorClass):
def __init__(self, **kwargs):
super(TargetScalingEstimator, self).__init__(**kwargs)
self.scaler = deepcopy(ScalerInstance)
def fit(self, x, y, **fit_params):
self.scaler.fit(y)
scaled_y = self.scaler.transform(y)
super(TargetScalingEstimator, self).fit(x, scaled_y, **fit_params)
return self
def predict(self, x):
scaled_y_hat = super(TargetScalingEstimator, self).predict(x)
y_hat = self.scaler.inverse_transform(scaled_y_hat)
return y_hat
return TargetScalingEstimator
现在我可以做以下事情:
scaler = ZScaler()
model = sklearn.linear_model.Ridge
params = {'alpha':0.1}
decorated_model = TargetScalingEstimatorDecorator(model, scaler)(**params)
到目前为止,非常好,一切正常,直到我尝试使用feature_selection.SelectFromModel或任何其他依赖sklearn.base.clone的方法。 clone查看估算器init关键字以确定要复制的参数。 我的结构覆盖 init 并使用** kwargs调用super,从而产生一个空的参数字典。
之前有没有遇到过这样的人,或者想过如何动态装饰任意估算器?