scikit-learn封装(wrapper)两种库来对进行分类
一种为KerasClassifier ,一种为KerasRegress
本例使用第一种分类器模型
通过使用build_in函数,为其传递一个训练模型,然后对结果进行评估
在这里,可以将我们的模型定义为一个函数,然后返回一个编译后的模型,该模型将作为参数传递给build_in函数
和使用fit()函数一样,该函数还接受epochs和batch_size参数
最终使用cross_val_score()函数来对模型进行评估,并打印出平均值
对模型进行比较:
在create_model()函数创建时,可以为其提供两个参数,分别为optimizer和init,这两个参数分别指定了优化器和初始化核
然后通过字典的形式,分别对这两个参数进行选择,最终可以生成不同的模型,从而进行比较
这里的optimizer可以选择参数 :rmsprop和adam
init参数可以选择:glorot_uniform ,normal, uniform
epochs可以选择:50,100,150
batch_size可以选择5,10,20
这样,通过不同的搭配,可以生成2*3*3*3种模型
最终,每个模型再使用3层的交叉验证,这样,就可以进行最终的模型对比评估
不过,这种方法使用于数据集比较小,特征比较少的情况,不然时间开销会很大
# MLP for Pima Indians Dataset with grid search via sklearn
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
import numpy
# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
model.add(Dense(8, kernel_initializer=init, activation='relu'))
model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
init = ['glorot_uniform', 'normal', 'uniform']
epochs = [50, 100, 150]
batches = [5, 10, 20]
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid_result = grid.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
代码来源: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/