scikit-learn:目标扩展的估算器的动态继承

时间:2017-03-22 11:04:33

标签: python inheritance machine-learning scikit-learn

我正在努力实现以下目标: 给定一个任意的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,从而产生一个空的参数字典。

之前有没有遇到过这样的人,或者想过如何动态装饰任意估算器?

0 个答案:

没有答案