#python #keras #scikit-learn #pipeline
Вопрос:
Я пытаюсь построить полный конвейер sklearn, где в конце находится модель Keras в оболочке KerasRegressor.
preprocessor = ColumnTransformer(
transformers=[
("numerical", num_pipeline, num_columns),
("categorical", cat_pipeline, cat_columns)
],
n_jobs=-1
)
# final pipeline for entire process
pipe = Pipeline(
steps=[
("preprocessing", preprocessor),
("model", None)
])
Затем модель обновляется с помощью pipe.set_params().
param = {"model": KerasRegressor(build_fn=build_model, epochs=100)}
pipe.set_params(**param)
Функция build_model выглядит следующим образом:
def build_model():
model = Sequential()
model.add(layers.Dense(20, input_dim=..., activation="relu"))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(1))
model.compile(loss="mse", optimizer="adam")
return model
Проблема в том, что для первого слоя в последовательной модели требуется атрибут input_dim, который в начале неизвестен (не может быть жестко закодирован).
Одним из этапов конвейера является OneHotEncoder, который изменяет форму данных X.
Даже если бы я каким-либо образом жестко закодировал форму X, она все равно не работает в cross_val_score, где эти формы будут каждый раз отличаться в зависимости от того, сколько уникальных значений каждой категориальной функции попадет туда.
Есть идеи, как это решить? Есть ли способ передать KerasRegressor информацию о форме данных с предыдущего шага конвейера?
Комментарии:
1. если вы не укажете input_dim в своей последовательной модели?
2. @MarcoCerliani это трудно признать, но это работает… это так просто, что я даже не пробовал этого! Спасибо