FB Prophet超参调优:如何在参数网格中引用add_seasonality配置参数
解决方法
你无法直接通过Monthly.fourier_order这类写法把自定义季节性参数放到基础参数网格里,原因是add_seasonality是Prophet实例的调用方法,其入参不属于模型初始化时的参数类别,需要单独封装逻辑实现参数遍历。
步骤1:调整参数网格结构
将自定义季节性的参数作为独立分组加入参数网格:
param_grid = { # 原有基础模型参数 'changepoint_prior_scale': [0.005, 0.01, 0.05, 0.5, 1, 5, 10, 20, 30, 40, 50, 60, 70, 80 ,90, 100], 'changepoint_range': [0.8, 0.9], 'holidays_prior_scale': [0.005, 0.01, 0.05, 0.5, 1, 5, 10, 20, 30, 40, 50, 60, 70, 80 ,90, 100], 'seasonality_mode': ['multiplicative', 'additive'], 'growth': ['linear', 'logistic'], # 自定义季节性参数组 'custom_seasonality': { 'monthly': { 'fourier_order': [20, 30, 50, 70], 'prior_scale': [10, 20, 40] }, 'daily': { 'fourier_order': [30, 50, 70, 90], 'prior_scale': [10, 20, 40] }, 'weekly': { 'fourier_order': [30, 50, 70], 'prior_scale': [20, 40, 60] }, 'yearly': { 'fourier_order': [15, 30, 45], 'prior_scale': [10, 20, 30] } } }
注:你原代码里基础参数的列表外层多套了一层中括号,会导致参数遍历异常,上面的代码已经修正了该问题。
步骤2:封装模型构建方法
写一个独立的模型生成函数,接收参数组合后动态初始化模型、添加自定义季节性:
def build_prophet_model(params, Holidays): # 初始化基础Prophet实例 model = Prophet( growth=params['growth'], seasonality_mode=params['seasonality_mode'], changepoint_prior_scale=params['changepoint_prior_scale'], changepoint_range=params['changepoint_range'], holidays_prior_scale=params['holidays_prior_scale'], daily_seasonality=False, weekly_seasonality=False, yearly_seasonality=False, holidays=Holidays ) season_params = params['custom_seasonality'] # 批量添加自定义季节性 model.add_seasonality( name='monthly', period=30.5, fourier_order=season_params['monthly']['fourier_order'], prior_scale=season_params['monthly']['prior_scale'] ) model.add_seasonality( name='daily', period=1, fourier_order=season_params['daily']['fourier_order'], prior_scale=season_params['daily']['prior_scale'] ) model.add_seasonality( name='weekly', period=7, fourier_order=season_params['weekly']['fourier_order'], prior_scale=season_params['weekly']['prior_scale'] ) model.add_seasonality( name='yearly', period=365.25, fourier_order=season_params['yearly']['fourier_order'], prior_scale=season_params['yearly']['prior_scale'] ) return model
步骤3:遍历参数组合调优
你可以通过itertools.product生成所有参数的笛卡尔积,逐个调用上面的方法生成模型,再执行拟合、交叉验证计算误差即可。如果是配合sklearn的网格搜索工具使用,把上述逻辑封装为自定义评估器的fit方法即可正常调用。
内容的提问来源于stack exchange,提问作者t25
相关产品推荐
相关产品推荐

