首页 > 解决方案 > 使用 PCA sklearn 和 TensorFlow 实现管道

问题描述

它给出了另一个错误。

Layer.call必须始终传递第一个参数。

我无法解决问题。input_dim 不能设置为常量。PCA 和 SelectKBest 将减少输入量。

如果您可以帮助输出管道的结果,我将非常感激

附上数据链接:https ://1drv.ms/u/s!AlHgQsqCKEIPiIxzdyWE0BfBHNocTQ?e=cxuSuo

def modelReg(inpt, opt = 'adam', kInitializer = 'glorot_uniform', dropout = 0.05):
    model = Sequential()
    model.add(Dense(1024, activation='relu', input_dim = inpt, kernel_initializer=kInitializer))
    model.add(Dense(1024, activation='relu', kernel_initializer=kInitializer))
    model.add(Dense(512, activation='relu', kernel_initializer=kInitializer))
    model.add(layers.Dropout(dropout))
    model.add(Dense(1, activation='sigmoid', kernel_initializer=kInitializer))
    model.compile(loss='mse',optimizer=opt, metrics=["mse", "mae"])
    return model

features = []
features.append(('pca', PCA(n_components=10)))
features.append(('select_best', SelectKBest(k=10)))
feature_union = FeatureUnion(features)

regressor = KerasRegressor(build_fn = modelReg(inpt), epochs = 3, batch_size = 500, verbose = 1)

estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('feature_union', feature_union))
estimators.append(('regressor' regressor))
model = Pipeline(estimators)

model.fit(allData.drop(['VancouverH'], axis = 1), allData['VancouverH'])

在此处输入图像描述

标签: pythontensorflowscikit-learn

解决方案


在 KerasRegressor 中使用函数将参数传递给模型函数,它们被写入 KerasRegressor 参数。

kearsEstimator = ('kR', KerasRegressor(createModel, inpt = trainDataX.shape[1], 
                                                 epochs = 5, batch_size = 180, verbose = 1))

像这样,不是这样:

kearsEstimator = ('kR', KerasRegressor(createModel(inpt), 
                                                 epochs = 5, batch_size = 180, verbose = 1))

好吧,并将管道转移到网格。并且网格的参数名称是用前缀写的。

estimators = []
estimators.append((kearsEstimator))
param_grid = { 
    'kR__optimizer':['adam'] #'RMSprop', 'Adam', 'Adamax', 'sgd'
}
grid = GridSearchCV(Pipeline(estimators), param_grid, cv = 5)
grid.fit(trainDataX, trainDataY)

推荐阅读