Как указать input_shape (input_dim) в последовательной модели Keras динамически при использовании конвейера? - PullRequest
1 голос
/ 16 июня 2019

Я создаю последовательную модель Keras, передавая список экземпляров слоев конструктору. Для этого мне нужно передать аргумент input_shape первому слою в функцию create_model (). Как правило, я могу получить кортеж формы следующим образом:

input_shape=(len(X_train.keys()),)

Между тем, я использую конвейер, чтобы позаботиться о моих шагах предварительной обработки, таких как Импутация, Масштабирование, Кодирование, Выбор функций и т. Д. В результате число переменных / функций после предварительной обработки не такое, как раньше, и я не могу получить количество узлов, которые я хочу добавить в этот первый скрытый слой. Затем я получил ошибку, связанную с dens_1_input, и после этого я могу соответствующим образом обновить форму.

Теперь я хочу знать, есть ли способ динамически указывать input_shape при использовании конвейера.

Использование конвейеров для очистки кода моделирования

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.feature_selection import SelectFromModel, RFE
from sklearn.linear_model import LassoCV

numerical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('feature_selection', SelectFromModel(LassoCV(cv=5))),
    ('scaler', StandardScaler()),
])

categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore')),
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('feature_selection', SelectFromModel(LassoCV(cv=5))),
])

# Bundle preprocessing for numerical and categorical data
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

Инициализация модели ANN

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
from keras.callbacks import Callback, EarlyStopping


def create_model(optimizer='adagrad',
                 kernel_initializer='glorot_uniform',
                 dropout=0.2):

    model = Sequential()
    model.add(Dense(64, activation='relu', kernel_initializer=kernel_initializer,
                    input_shape=(len(X_train.keys()),)))  # len(X_train.keys()) is not correct here
    model.add(Dropout(dropout))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(1))

    model.compile(loss='mean_absolute_error', optimizer=optimizer,
                  metrics=['mean_absolute_error'])

    return model

Мой желаемый вывод - получить доступ к форме информационного кадра после предварительной обработки с конвейером.

Это, вероятно, похожий вопрос без ответа: Keras + DataFrameMapper + make_pipeline, дилемма input_dim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...