КерасРегрессор в трубопроводе sklearn с одним датчиком

#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 это трудно признать, но это работает… это так просто, что я даже не пробовал этого! Спасибо