如何遍历Python字典按键取值并赋值给Facebook Prophet模型参数
核心问题
你在循环中已经将all_params列表里的单组参数字典赋值给了params变量,但后续取值时错误地使用了列表对象all_params来读取字典键值,列表不支持这种键索引操作,直接将所有取值时的all_params替换为params即可正常运行。
正确实现代码
import itertools from prophet import Prophet # 参数网格定义 param_grid = { 'changepoint_prior_scale': [.01, 0.05], 'changepoint_range': [0.8, 0.9], 'monthly_fourier': [5, 10], 'monthly_prior_scale': [.01, 0.05], 'daily_fourier': [5, 10], 'daily_prior_scale': [.01, 0.05], 'weekly_fourier': [5, 10], 'weekly_prior_scale': [.01, 0.05], 'yearly_fourier': [5], 'yearly_prior_scale': [.01, 0.05] } # 生成所有参数组合 all_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())] mape = [] # 存储每组参数对应的MAPE指标 for params in all_params: m = Prophet( changepoint_prior_scale = params['changepoint_prior_scale'], changepoint_range = params['changepoint_range'], seasonality_mode = 'multiplicative', growth = 'logistic', holidays=Holidays, ).add_seasonality( name='monthly', period=30.5, fourier_order = params['monthly_fourier'], prior_scale = params['monthly_prior_scale'] ).add_seasonality( name='daily', period=1, fourier_order = params['daily_fourier'], prior_scale = params['daily_prior_scale'] ).add_seasonality( name='weekly', period=7, fourier_order = params['weekly_fourier'], prior_scale = params['weekly_prior_scale'] ).add_seasonality( name='yearly', period=365.25, fourier_order = params['yearly_fourier'], prior_scale = params['yearly_prior_scale'] ) # 在此处补充模型训练、预测、指标计算逻辑,将得到的MAPE值追加到mape列表即可
简化写法参考
如果后续需要调整参数或新增季节性规则,可通过参数解包、循环批量添加的方式简化代码,减少重复冗余:
for params in all_params: # 提取Prophet初始化所需参数,通过**解包传入 prophet_init_params = {k:v for k,v in params.items() if k in ['changepoint_prior_scale', 'changepoint_range']} m = Prophet( **prophet_init_params, seasonality_mode = 'multiplicative', growth = 'logistic', holidays=Holidays, ) # 循环批量添加所有自定义季节性 season_config = { 'monthly': 30.5, 'daily': 1, 'weekly':7, 'yearly':365.25 } for season_name, period in season_config.items(): m.add_seasonality( name=season_name, period=period, fourier_order=params[f'{season_name}_fourier'], prior_scale=params[f'{season_name}_prior_scale'] )
内容的提问来源于stack exchange,提问作者t25
相关产品推荐
相关产品推荐

