使用scikit-learn对模型进行比较

来源:互联网 发布:未格式化数据恢复 编辑:程序博客网 时间:2024/06/09 12:23

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 sklearnfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.wrappers.scikit_learn import KerasClassifierfrom sklearn.model_selection import GridSearchCVimport numpy# Function to create model, required for KerasClassifierdef create_model(optimizer='rmsprop', init='glorot_uniform'):# create modelmodel = 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 modelmodel.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])return model# fix random seed for reproducibilityseed = 7numpy.random.seed(seed)# load pima indians datasetdataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")# split into input (X) and output (Y) variablesX = dataset[:,0:8]Y = dataset[:,8]# create modelmodel = KerasClassifier(build_fn=create_model, verbose=0)# grid search epochs, batch size and optimizeroptimizers = ['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 resultsprint("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/

原创粉丝点击