GridSearchCV 平均绝对误差评分

GridSearchCV scoring on mean absolute error

我正在尝试设置 GridSearchCV 的实例以确定哪一组超参数将产生最低的平均绝对误差。 This scikit documentation 表示可以在创建 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)

但是,就平均绝对误差而言,网格搜索并不是select表现最好的模型

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'}

在 运行 上述代码并确定所谓的 'best parameters' 之后,我删除了 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'}

为澄清起见,我更改了输入网格搜索的集合,使其不包含 select 隐藏层大小为 28 的选项,当进行更改时,我 运行 代码,这次它选择了一个隐藏层大小为 23 并且平均绝对误差减少了(即使 23 的大小从一开始就可用),为什么它不从一开始就选择这个选项,如果它正在评估平均绝对误差?

基本的网格搜索和模型拟合,取决于不同目的的随机数生成器。在 scikit-learn 中,这是由参数 random_state 控制的。看我的其他回答了解一下:

现在对于你的情况,我可以想到这些随机数生成影响训练的事情:

1) GridSearchCV 将默认使用具有 3 折的 KFold 进行回归任务,这可能会在不同的运行中以不同的方式拆分数据。可能发生在两个网格搜索过程中发生的分裂是不同的,因此得分不同。

2) 您正在使用单独的测试数据来计算 GridSearchCV 无法访问的 mse。因此它会找到适合所提供数据的参数,这些参数可能对单独的数据集完全有效,也可能不完全有效。

更新:

我现在看到您在模型的参数网格中使用了 random_state,所以第 3 点现在不适用。

3) 您没有显示您使用的 model。但是,如果训练期间的模型正在使用数据的子样本(例如选择较少数量的特征,或较少数量的迭代行,或不同的内部估计器),那么您也需要修复它以获得相同的分数。 您需要先修复该问题以检查结果。

推荐示例

您可以从这个例子中汲取灵感:

# Define a custom kfold
from sklearn.model_selection import KFold
kf = KFold(n_splits=3, random_state=0)

# Check if the model you chose support random_state
model = WhateEverYouChoseClassifier(..., random_state=0, ...)

# Pass these to grid-search
gs = GridSearchCV(model, param_grid, scoring='neg_mean_absolute_error', cv = kf)

然后通过更改参数网格再次执行您所做的两个实验。