Мой конвейер обучения 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
Есть ли другой способ?