Я создаю последовательную модель 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