Я тренирую модель Keras, которая находится в конвейере Scikit с некоторой предварительной обработкой. Модель Кераса определяется как
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input, Dropout
from tensorflow.keras import optimizers
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
from sklearn.pipeline import make_pipeline
def create_model(X_train):
inp = Input(shape=(X_train.shape[1],))
x = Dense(150, activation = "relu")(inp)
x = Dropout(0.4)(x)
mean = Dense(1, activation = "linear")(x)
train_model_1 = Model(inp, mean)
adam = optimizers.Adam(lr=0.01)
train_model_1.compile(loss=my_loss_function, optimizer=adam)
return train_model_1
clf = KerasRegressor(build_fn=create_model, epochs=250, batch_size=64)
Который затем используется в Pipeline с
pipeline = make_pipeline(
other_steps,
clf(X_train)
)
pipeline.fit(X_train, y_train)
Я хочу использовать EarlyStopping, где тестовые данные (X_test, y_test) используются для проверки. Обычно это было бы просто с
callbacks=[EarlyStopping(monitor='val_loss', patience=5)]
train_model_1.fit(X_train, y_train,
validation_data=(X_test, y_test),
callbacks=callbacks,
)
Но я не могу понять, куда это пойдет в конвейере. Как это правильно структурировать?






Pipeline.fit имеет параметр ключевое слово-аргумент:
**fit_params : словарь строки -> объект
Параметры, передаваемые методу подгонки каждого шага, где каждое имя параметра имеет префикс, так что параметр
pдля шагаsимеет ключs__p.
Так что что-то вроде pipeline.fit(x_train, y_train, kerasregressor__callbacks=callbacks) должно работать. (Проверьте название шагов вашего конвейера, например, с помощью pipeline.steps; make_pipeline генерирует имена, используя имя класса в нижнем регистре, но я не уверен, что это будет правильно работать с keras.)
См. также Как передать параметр только одной части объекта пайплайна в scikitlearn?