为了账号安全,请及时绑定邮箱和手机立即绑定

GridSearchCV在平均绝对误差上的得分

GridSearchCV在平均绝对误差上的得分

慕后森 2021-04-29 19:19:38
我正在尝试设置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的大小),如果它正在评估平均绝对误差,为什么不从一开始就选择此选项呢?
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

基本的网格搜索和模型拟合取决于用于不同目的的随机数生成器。在scikit-learn中,这是由param控制的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)

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


查看完整回答
反对 回复 2021-05-11
  • 1 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号