code: def test_run_template_3():
      """Runs custom template with monthly data"""
      data = generate_df_with_reg_for_tests(
          freq="MS",
          periods=48,
          remove_extra_cols=True,
          mask_test_actuals=True,
      )
      reg_cols = ["regressor1", "regressor2", "regressor_categ"]
      keep_cols = [TIME_COL, VALUE_COL] + reg_cols
      df = data["df"][keep_cols]
      forecast_horizon = data["test_df"].shape[0]
  
      model_components = ModelComponentsParam(
          seasonality=None,
          events=None,
          changepoints=None,
          autoregression=None,
          uncertainty={"uncertainty_dict": None},
      )
      config = ForecastConfig(
          model_template=ModelTemplateEnum.SK.name,
          forecast_horizon=forecast_horizon,
          coverage=0.9,
          model_components_param=model_components,
      )
  
      with warnings.catch_warnings():
          warnings.simplefilter("ignore")
          result = Forecaster().run_forecast_config(
              df=df,
              config=config,
          )
          rmse = (
              EvaluationMetricEnum.RootMeanSquaredError.get_metric_name()
          )
          assert result.backtest.test_evaluation[rmse] == pytest.approx(
              4.08, rel=1e-1
          )
          check_forecast_pipeline_result(
              result,
              coverage=0.9,
              strategy=None,
              score_func=EvaluationMetricEnum.MeanAbsolutePercentError.name,
              greater_is_better=False,
          )
  
imports: import dataclasses
  import datetime
  import warnings
  import numpy
  import pandas
  import pytest
  from greykite.algo.forecast.silverkite.forecast_silverkite import SilverkiteForecast
  from greykite.algo.forecast.silverkite.forecast_simple_silverkite_helper import generate_holiday_events
  from greykite.algo.forecast.silverkite.forecast_simple_silverkite_helper import get_event_pred_cols
  from greykite.common.constants import ADJUSTMENT_DELTA_COL
  from greykite.common.constants import END_TIME_COL
  from greykite.common.constants import METRIC_COL
  from greykite.common.constants import PREDICTION_BAND_COVERAGE
  from greykite.common.constants import START_TIME_COL
  from greykite.common.constants import TIME_COL
  from greykite.common.constants import VALUE_COL
  from greykite.common.evaluation import EvaluationMetricEnum
  from greykite.common.python_utils import assert_equal
  from greykite.common.testing_utils import generate_df_for_tests
  from greykite.common.testing_utils import generate_df_with_reg_for_tests
  from greykite.framework.constants import COMPUTATION_N_JOBS
  from greykite.framework.constants import CV_REPORT_METRICS_ALL
  from greykite.framework.templates.autogen.forecast_config import ComputationParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationMetricParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationPeriodParam
  from greykite.framework.templates.autogen.forecast_config import ForecastConfig
  from greykite.framework.templates.autogen.forecast_config import MetadataParam
  from greykite.framework.templates.autogen.forecast_config import ModelComponentsParam
  from greykite.framework.templates.forecaster import Forecaster
  from greykite.framework.templates.model_templates import ModelTemplateEnum
  from greykite.framework.templates.silverkite_template import SilverkiteTemplate
  from greykite.framework.templates.silverkite_template import apply_default_model_components
  from greykite.framework.templates.silverkite_template import get_extra_pred_cols
  from greykite.framework.utils.framework_testing_utils import assert_basic_pipeline_equal
  from greykite.framework.utils.framework_testing_utils import check_forecast_pipeline_result
  from greykite.sklearn.estimator.silverkite_estimator import SilverkiteEstimator
label_desc: Use image node_id 14 for calling a global function with example usage: test_run_template_3() without return types