如何用GridSearchCV为自定义GRU估计器结合自定义交叉验证调参?
GRU时间序列应用问题解答
1. **kwargs传递超参数候选集与模型初始化
- 超参数候选集传递方式:
若用GridSearchCV做超参数搜索,无需手动用kwargs传递候选集,直接将params字典传给GridSearchCV的param_grid参数即可。前提是params的键要与EncoderGRU初始化方法的参数名完全匹配。示例代码:
若手动实例化模型时用**kwargs传单个参数组合,直接解包字典即可:params = {'lr': [0.001, 0.01], 'dropout': [0.2, 0.4]} grid_search = GridSearchCV(estimator=EncoderGRU(), param_grid=params, cv=tscv)model = EncoderGRU(**params)。 - **不传入params初始化模型的可行性:
完全取决于EncoderGRU类的__init__方法定义。如果lr和dropout设置了默认值(比如def __init__(self, lr=0.001, dropout=0.1):),可直接model = EncoderGRU()初始化;若这两个参数无默认值,不传会触发参数缺失报错。
2. 自定义年度滚动窗口交叉验证与GridSearchCV,以及dropout报错
- **自定义tscv适配GridSearchCV:
可以直接使用,但自定义tscv必须符合sklearn交叉验证迭代器规范:需实现split方法,接收数据集后返回迭代的(训练索引, 测试索引)元组对。示例实现:
满足规范后,直接将class AnnualRollingCV: def __init__(self, start_year, end_year): self.start_year = start_year self.end_year = end_year def split(self, X, y=None, groups=None): for year in range(self.start_year, self.end_year): train_mask = X['year'] <= year test_mask = X['year'] == year + 1 yield train_mask.nonzero()[0], test_mask.nonzero()[0]tscv实例传给GridSearchCV的cv参数即可。 - **dropout参数报错解决:
该错误说明params字典中dropout的候选值超出了[0,1]范围。先检查params里的dropout列表,剔除1.1、-0.2这类不符合要求的值;若使用PyTorch的nn.GRU,其dropout参数要求为[0,1)(不可等于1),需把候选值中的1替换为0.99这类接近1的数值。同时确认EncoderGRU内部是否有额外的参数范围校验,确保传入值符合模型要求。
内容的提问来源于stack exchange,提问作者Charles Yan
相关产品推荐
相关产品推荐

