Может ли конвейер линейной регрессии sklearn установить максимальный потолок для выходной переменной? - PullRequest
1 голос
/ 11 ноября 2019

Мой конвейер обучения scikit - это линейная регрессия, но моя проблемная область никогда не должна позволять выводу быть выше определенного значения, поэтому я хочу ограничить вывод. Я знаю, что мог сначала запустить мою модель, а затем выполнить y = np.where(y > MAX_VALUE, MAX_VALUE, y), но у меня может быть еще несколько шагов подобной пользовательской логики, поэтому я хочу включить это в конвейер. Может ли sklearn сделать это?

Я попытался написать свой собственный оценщик, как показано ниже, это выдает ошибку All intermediate steps should be transformers and implement fit and transform or be the string 'passthrough', поэтому конвейер не позволяет поставить шаг после шага LinearRegression. Есть ли способ сделать это?

import sklearn.base

class ClipOutputToMaxValue(sklearn.base.BaseEstimator, sklearn.base.RegressorMixin):
    '''custom step to put a ceiling on the output 'y' value```
    def fit(self, X, y):
        self.max_y = y.max()
        return self

    def predict(self, X, y):
        y = np.where(y > self.max_y, self.max_y, y)
        return y

model =  sklearn.pipeline.Pipeline(
        [('scaler', sklearn.preprocessing.StandardScaler()),
         ('model', sklearn.linear_model.LinearRegression()),
         ('clipper', ClipOutputToMaxValue()) #THIS IS WHAT I WANT BUT
         #SKLEARN DOESN'T ALLOW ME TO DO THIS
        ])

x = np.arange(10).reshape(10,-1)
y = x
model.fit(x, y)
model.predict(x)

Но это не с этой ошибкой: TypeError: All intermediate steps should be transformers and implement fit and transform or be the string 'passthrough' 'LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)' (type <class 'sklearn.linear_model.base.LinearRegression'>) doesn't

Есть ли другой способ?

...