我正在使用scikit-learn自定义管道(sklearn.pipeline.Pipeline
)结合RandomizedSearchCV
进行超参数优化。这效果很好。
现在我想将一个keras模型作为管道的第一步插入。模型的参数需要进行优化。计算出的(拟合的)keras模型随后应在管道的其他步骤中使用,因此我想我需要将模型存储为全局变量,以便其他管道步骤可以使用它。这样做对吗?
我知道keras为scikit-learn API提供了一些包装器,但问题是这些包装器已经执行了分类/回归,而我只想计算keras模型而不做其他操作。
这该如何实现呢?
例如,我有一个方法可以返回模型:
def create_model(file_path, argument2,...): ... return model
该方法需要一些固定的参数,如file_path
等,但不需要X
和y
(或者可以忽略)。模型的参数需要进行优化(如层数等)。
回答:
你需要将你的Keras模型包装成Scikit learn模型,然后像往常一样进行操作。
这里有一个快速示例(为了简洁,我省略了导入语句)
这里有一篇完整的博客文章,包含这个以及许多其他示例:Scikit-learn Pipeline Examples
# 创建一个返回模型的函数,参数是你想使用交叉验证和模型选择来验证的def create_model(optimizer='adagrad', kernel_initializer='glorot_uniform', dropout=0.2): model = Sequential() model.add(Dense(64,activation='relu',kernel_initializer=kernel_initializer)) model.add(Dropout(dropout)) model.add(Dense(1,activation='sigmoid',kernel_initializer=kernel_initializer)) model.compile(loss='binary_crossentropy',optimizer=optimizer, metrics=['accuracy']) return model# 使用你创建的函数包装模型clf = KerasRegressor(build_fn=create_model,verbose=0)# 只需创建管道pipeline = Pipeline([ ('clf',clf)])pipeline.fit(X_train, y_train)