GridSearchCV 对平均绝对误差的评分

Posted

技术标签:

【中文标题】GridSearchCV 对平均绝对误差的评分【英文标题】:GridSearchCV scoring on mean absolute error 【发布时间】:2019-01-02 19:03:25 【问题描述】:

我正在尝试设置一个 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)

但是网格搜索并没有选择平均绝对误差方面表现最好的模型

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 的大小从一开始就可用),如果它正在评估平均绝对误差,为什么不从一开始就选择这个选项?

【问题讨论】:

【参考方案1】:

网格搜索和模型拟合本质上取决于用于不同目的的随机数生成器。在 scikit-learn 中,这由参数 random_state 控制。请参阅我的其他答案以了解它:

https://***.com/a/42477052/3374996 https://***.com/a/42197534/3374996

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

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)

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

【讨论】:

我正在使用来自 sklearn.neural_network 的 MLPRegressor。我从您的解决方案中添加了 kf 变量。我的结果确实发生了变化,但是当我删除网格参数时,平均绝对误差仍然上下波动。我还意识到 GridSearchCV 是在我的训练数据上执行的,而不是我的测试数据,所以我也改变了我的输出来反映这一点。

以上是关于GridSearchCV 对平均绝对误差的评分的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到高 MAE(平均绝对误差)和 MSE(均方误差)与 MAPE(平均绝对百分比误差)相比?

随机森林中每棵树的平均绝对误差

均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)

sklearn 度量单位的准确性,平均绝对误差,回归问题的均方误差?

在 Gridsearchcv 中评分

[人工智能-深度学习-9]:神经网络基础 - 常见loss损失函数之均分误差MSE绝对值误差MAE平滑平均绝对误差Huber