我正在尝试设置GridSearchCV实例,以确定哪组超参数会产生最低的平均绝对误差。这个scikit文档指出,在创建GridSearchCV时可以将分数度量传递到网格中(如下所示)。
然而,网格搜索并没有选择在平均绝对误差方面表现最佳的模型。
param_grid = {
'hidden_layer_sizes' : [(20,),(21,),(22,),(23,),(24,),(25,),(26,),(27,),(28,),(29,),(30,),(31,),(32,),(33,),(34,),(35,),(36,),(37,),(38,),(39,),(40,)],
'activation' : ['relu'],
'random_state' : [0]
}
gs = GridSearchCV(model, param_grid, scoring='neg_mean_absolute_error')
gs.fit(X_train, y_train)
print(gs.scorer_)
[1] make_scorer(mean_absolute_error, greater_is_better=False)
然而,网格搜索并没有选择在平均绝对误差方面表现最佳的模型。
model = gs.best_estimator_.fit(X_train, y_train)
print(metrics.mean_squared_error(y_test, model.predict(X_test)))
print(gs.best_params_)
[2] 125.0
[3] Best parameters found by grid search are: {'hidden_layer_sizes': (28,), 'learning_rate': 'constant', 'learning_rate_init': 0.01, 'random_state': 0, 'solver': 'lbfgs'}
运行上述代码并确定所谓的“最佳参数”后,我删除了gs.best_params_中找到的一个值,并发现重新运行程序时均方误差有时会减少。
param_grid = {
'hidden_layer_sizes' : [(20,),(21,),(22,),(23,),(24,),(25,),(26,),(31,),(32,),(33,),(34,),(35,),(36,),(37,),(38,),(39,),(40,)],
'activation' : ['relu'],
'random_state' : [0]
}
[4] 122.0
[5] Best parameters found by grid search are: {'hidden_layer_sizes': (23,), 'learning_rate': 'constant', 'learning_rate_init': 0.01, 'random_state': 0, 'solver': 'lbfgs'}
为了澄清,我更改了输入到网格搜索中的集合,使其不包含选择隐藏层大小为28的选项。当进行此更改时,我再次运行了代码,这一次它选择了一个隐藏层大小为23,并且平均绝对误差减小了(即使大小23从一开始就可用),为什么它没有从一开始就选择这个选项,如果它正在评估平均绝对误差呢?