%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.11%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22scikit-learn%22%2C%0A%23%20%20%20%20%20%22yohou%5Bplotting%5D%22%2C%0A%23%20%5D%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.8%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20How%20to%20Combine%20Forecasters%20with%20VotingPointForecaster%0A%0A%20%20%20%20This%20notebook%20shows%20how%20to%20combine%20multiple%20forecasters%20into%20a%0A%20%20%20%20single%20ensemble%20using%20%5B%60VotingPointForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.ensemble.VotingPointForecaster%2F).%0A%20%20%20%20Ensembles%20reduce%20variance%20by%20averaging%20out%20individual%20model%20errors.%0A%0A%20%20%20%20**Prerequisites%3A**%20Basic%20familiarity%20with%20point%20forecasters%20-%20see%20the%20%5Bquickstart%5D(%2Fexamples%2Fquickstart%2F)%20for%20an%20introduction.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20from%20copy%20import%20deepcopy%0A%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20from%20sklearn.ensemble%20import%20GradientBoostingRegressor%2C%20RandomForestRegressor%0A%20%20%20%20from%20sklearn.linear_model%20import%20Ridge%0A%0A%20%20%20%20from%20yohou.datasets%20import%20fetch_sunspot%2C%20fetch_tourism_monthly%0A%20%20%20%20from%20yohou.ensemble%20import%20VotingPointForecaster%0A%20%20%20%20from%20yohou.metrics%20import%20MeanAbsoluteError%0A%20%20%20%20from%20yohou.model_selection%20import%20train_test_split%0A%20%20%20%20from%20yohou.plotting%20import%20(%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_heatmap%2C%0A%20%20%20%20%20%20%20%20plot_score_per_step%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20%20%20%20%20plot_score_summary%2C%0A%20%20%20%20%20%20%20%20plot_score_time_series%2C%0A%20%20%20%20)%0A%20%20%20%20from%20yohou.point%20import%20PointReductionForecaster%2C%20SeasonalNaive%0A%20%20%20%20from%20yohou.preprocessing%20import%20LagTransformer%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20GradientBoostingRegressor%2C%0A%20%20%20%20%20%20%20%20LagTransformer%2C%0A%20%20%20%20%20%20%20%20MeanAbsoluteError%2C%0A%20%20%20%20%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20%20%20%20%20RandomForestRegressor%2C%0A%20%20%20%20%20%20%20%20Ridge%2C%0A%20%20%20%20%20%20%20%20SeasonalNaive%2C%0A%20%20%20%20%20%20%20%20VotingPointForecaster%2C%0A%20%20%20%20%20%20%20%20deepcopy%2C%0A%20%20%20%20%20%20%20%20fetch_sunspot%2C%0A%20%20%20%20%20%20%20%20fetch_tourism_monthly%2C%0A%20%20%20%20%20%20%20%20pl%2C%0A%20%20%20%20%20%20%20%20plot_forecast%2C%0A%20%20%20%20%20%20%20%20plot_score_heatmap%2C%0A%20%20%20%20%20%20%20%20plot_score_per_vintage%2C%0A%20%20%20%20%20%20%20%20plot_score_summary%2C%0A%20%20%20%20%20%20%20%20plot_score_time_series%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20Load%20and%20Prepare%20Data%0A%0A%20%20%20%20Monthly%20sunspot%20numbers%20with%20a%20strong%20~11-year%20cycle.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fetch_sunspot%2C%20pl%2C%20train_test_split)%3A%0A%20%20%20%20y%20%3D%20fetch_sunspot().frame.group_by_dynamic(%22time%22%2C%20every%3D%221mo%22).agg(pl.col(%22sunspot_number%22).mean())%0A%20%20%20%20forecasting_horizon%20%3D%2024%0A%20%20%20%20y_train%2C%20y_test%20%3D%20train_test_split(y%2C%20test_size%3Dforecasting_horizon)%0A%0A%20%20%20%20print(f%22Training%3A%20%7Blen(y_train)%7D%20obs%2C%20Test%3A%20%7Blen(y_test)%7D%20obs%22)%0A%20%20%20%20print(f%22Forecasting%20horizon%3A%20%7Bforecasting_horizon%7D%20months%22)%0A%20%20%20%20return%20forecasting_horizon%2C%20y_test%2C%20y_train%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Define%20Base%20Forecasters%0A%0A%20%20%20%20Create%20diverse%20forecasters%20with%20different%20modeling%20approaches.%0A%20%20%20%20Diversity%20is%20the%20key%20ingredient%20for%20effective%20ensembles.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GradientBoostingRegressor%2C%0A%20%20%20%20LagTransformer%2C%0A%20%20%20%20PointReductionForecaster%2C%0A%20%20%20%20RandomForestRegressor%2C%0A%20%20%20%20Ridge%2C%0A%20%20%20%20SeasonalNaive%2C%0A)%3A%0A%20%20%20%20base_forecasters%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(%22naive_12%22%2C%20SeasonalNaive(seasonality%3D12))%2C%0A%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ridge%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20PointReductionForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20estimator%3DRidge()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%203%2C%206%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rf%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20PointReductionForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20estimator%3DRandomForestRegressor(n_estimators%3D50%2C%20random_state%3D42)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%203%2C%206%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gbr%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20PointReductionForecaster(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20estimator%3DGradientBoostingRegressor(n_estimators%3D50%2C%20random_state%3D42)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20feature_transformer%3DLagTransformer(lag%3D%5B1%2C%202%2C%203%2C%206%2C%2012%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction_strategy%3D%22direct%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%5D%0A%20%20%20%20return%20(base_forecasters%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20Fit%20an%20Equal-Weight%20Mean%20Ensemble%0A%0A%20%20%20%20Pass%20the%20named%20forecasters%20to%20%5B%60VotingPointForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.ensemble.voting_point.VotingPointForecaster%2F)%20with%20%60method%3D%22mean%22%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(VotingPointForecaster%2C%20base_forecasters%2C%20forecasting_horizon%2C%20y_train)%3A%0A%20%20%20%20ensemble_mean%20%3D%20VotingPointForecaster(%0A%20%20%20%20%20%20%20%20forecasters%3Dbase_forecasters%2C%0A%20%20%20%20%20%20%20%20method%3D%22mean%22%2C%0A%20%20%20%20)%0A%20%20%20%20ensemble_mean.fit(y_train%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20return%20(ensemble_mean%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20deepcopy%2C%0A%20%20%20%20ensemble_mean%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20plot_forecast%2C%0A%20%20%20%20y_test%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20y_pred_mean%20%3D%20deepcopy(ensemble_mean).observe_predict(y_test%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20plot_forecast(y_test%2C%20y_pred_mean%2C%20y_train%3Dy_train%2C%20n_history%3D400%2C%20title%3D%22Mean%20Ensemble%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20Weighted%20Ensemble%0A%0A%20%20%20%20Assign%20higher%20weight%20to%20models%20you%20expect%20to%20perform%20better.%0A%20%20%20%20Weights%20are%20passed%20to%20%60numpy.average%60%20which%20normalizes%20internally.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(VotingPointForecaster%2C%20base_forecasters%2C%20forecasting_horizon%2C%20y_train)%3A%0A%20%20%20%20ensemble_weighted%20%3D%20VotingPointForecaster(%0A%20%20%20%20%20%20%20%20forecasters%3Dbase_forecasters%2C%0A%20%20%20%20%20%20%20%20method%3D%22mean%22%2C%0A%20%20%20%20%20%20%20%20weights%3D%5B0.5%2C%201.0%2C%202.0%2C%202.0%5D%2C%0A%20%20%20%20)%0A%20%20%20%20ensemble_weighted.fit(y_train%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20return%20(ensemble_weighted%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20deepcopy%2C%0A%20%20%20%20ensemble_weighted%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20plot_forecast%2C%0A%20%20%20%20y_test%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20y_pred_weighted%20%3D%20deepcopy(ensemble_weighted).observe_predict(y_test%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20plot_forecast(y_test%2C%20y_pred_weighted%2C%20y_train%3Dy_train%2C%20n_history%3D400%2C%20title%3D%22Weighted%20Ensemble%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20Median%20Ensemble%0A%0A%20%20%20%20Use%20%60method%3D%22median%22%60%20for%20robustness%20to%20outlier%20predictions.%0A%20%20%20%20Weights%20are%20silently%20ignored%20with%20this%20method.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(VotingPointForecaster%2C%20base_forecasters%2C%20forecasting_horizon%2C%20y_train)%3A%0A%20%20%20%20ensemble_median%20%3D%20VotingPointForecaster(%0A%20%20%20%20%20%20%20%20forecasters%3Dbase_forecasters%2C%0A%20%20%20%20%20%20%20%20method%3D%22median%22%2C%0A%20%20%20%20)%0A%20%20%20%20ensemble_median.fit(y_train%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20return%20(ensemble_median%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20deepcopy%2C%0A%20%20%20%20ensemble_median%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20plot_forecast%2C%0A%20%20%20%20y_test%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20y_pred_median%20%3D%20deepcopy(ensemble_median).predict(forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20plot_forecast(y_test%2C%20y_pred_median%2C%20y_train%3Dy_train%2C%20n_history%3D400%2C%20title%3D%22Median%20Ensemble%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20Compare%20Ensemble%20Methods%0A%0A%20%20%20%20Compare%20all%20three%20ensembles%20against%20the%20individual%20base%20forecasters.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20MeanAbsoluteError%2C%0A%20%20%20%20deepcopy%2C%0A%20%20%20%20ensemble_mean%2C%0A%20%20%20%20ensemble_median%2C%0A%20%20%20%20ensemble_weighted%2C%0A%20%20%20%20forecasting_horizon%2C%0A%20%20%20%20plot_score_summary%2C%0A%20%20%20%20y_test%2C%0A)%3A%0A%20%20%20%20models%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22Mean%20Ensemble%22%3A%20ensemble_mean%2C%0A%20%20%20%20%20%20%20%20%22Weighted%20Ensemble%22%3A%20ensemble_weighted%2C%0A%20%20%20%20%20%20%20%20%22Median%20Ensemble%22%3A%20ensemble_median%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20y_preds%20%3D%20%7B%7D%0A%20%20%20%20for%20name%2C%20model%20in%20models.items()%3A%0A%20%20%20%20%20%20%20%20y_preds%5Bname%5D%20%3D%20deepcopy(model).observe_predict(y_test%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%0A%20%20%20%20plot_score_summary(%0A%20%20%20%20%20%20%20%20MeanAbsoluteError()%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_preds%2C%0A%20%20%20%20%20%20%20%20title%3D%22Ensemble%20Method%20Comparison%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(y_preds%2C)%0A%0A%0A%40app.cell%0Adef%20_(MeanAbsoluteError%2C%20plot_score_per_vintage%2C%20y_preds%2C%20y_test)%3A%0A%20%20%20%20plot_score_per_vintage(%0A%20%20%20%20%20%20%20%20MeanAbsoluteError()%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_preds%2C%0A%20%20%20%20%20%20%20%20kind%3D%22line%22%2C%0A%20%20%20%20%20%20%20%20show_trend%3DTrue%2C%0A%20%20%20%20%20%20%20%20title%3D%22Ensemble%20MAE%20per%20Vintage%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%207.%20Panel%20Data%20Ensemble%0A%0A%20%20%20%20%5B%60VotingPointForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.ensemble.voting_point.VotingPointForecaster%2F)%20supports%20panel%20data%20automatically.%20Each%20forecaster%0A%20%20%20%20handles%20all%20panel%20groups.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20SeasonalNaive%2C%0A%20%20%20%20VotingPointForecaster%2C%0A%20%20%20%20fetch_tourism_monthly%2C%0A%20%20%20%20train_test_split%2C%0A)%3A%0A%20%20%20%20tourism%20%3D%20fetch_tourism_monthly(n_series%3D5).frame%0A%20%20%20%20tourism_train%2C%20tourism_test%20%3D%20train_test_split(tourism%2C%20test_size%3D12%20*%205)%0A%0A%20%20%20%20panel_ensemble%20%3D%20VotingPointForecaster(%0A%20%20%20%20%20%20%20%20forecasters%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22naive_1%22%2C%20SeasonalNaive(seasonality%3D1))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22naive_6%22%2C%20SeasonalNaive(seasonality%3D6))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22naive_12%22%2C%20SeasonalNaive(seasonality%3D12))%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20method%3D%22mean%22%2C%0A%20%20%20%20)%0A%20%20%20%20panel_ensemble.fit(tourism_train%2C%20forecasting_horizon%3D12)%0A%20%20%20%20y_pred_panel%20%3D%20panel_ensemble.observe_predict(tourism_test%2C%20forecasting_horizon%3D12%2C%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D)%0A%0A%20%20%20%20print(f%22Panel%20groups%3A%20%7Bpanel_ensemble.groups_%7D%22)%0A%20%20%20%20print(f%22Prediction%20shape%3A%20%7By_pred_panel.shape%7D%22)%0A%20%20%20%20return%20tourism_test%2C%20tourism_train%2C%20y_pred_panel%0A%0A%0A%40app.cell%0Adef%20_(plot_forecast%2C%20tourism_test%2C%20tourism_train%2C%20y_pred_panel)%3A%0A%20%20%20%20plot_forecast(%0A%20%20%20%20%20%20%20%20tourism_test%2C%0A%20%20%20%20%20%20%20%20y_pred_panel%2C%0A%20%20%20%20%20%20%20%20y_train%3Dtourism_train%2C%0A%20%20%20%20%20%20%20%20groups%3D%5B%22T3%22%2C%20%22T4%22%2C%20%22T5%22%5D%2C%0A%20%20%20%20%20%20%20%20n_history%3D400%2C%0A%20%20%20%20%20%20%20%20title%3D%22Panel%20Data%20Ensemble%20(5%20Tourism%20Series)%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Multi-vintage%20Scoring%0A%0A%20%20%20%20The%20%60observe_predict%60%20method%20with%20%60stride%3D1%60%20produces%20one%20forecast%20per%0A%20%20%20%20observation%20point%2C%20creating%20multiple%20*vintages*.%20Each%20vintage%20represents%0A%20%20%20%20a%20different%20forecast%20origin%2C%20so%20you%20can%20analyse%20how%20accuracy%20evolves%20as%0A%20%20%20%20the%20model%20absorbs%20more%20data.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(deepcopy%2C%20ensemble_mean%2C%20forecasting_horizon%2C%20y_test)%3A%0A%20%20%20%20_vintage_model%20%3D%20deepcopy(ensemble_mean)%0A%20%20%20%20y_pred_vintages%20%3D%20_vintage_model.observe_predict(%0A%20%20%20%20%20%20%20%20y%3Dy_test%2C%0A%20%20%20%20%20%20%20%20stride%3D1%2C%0A%20%20%20%20%20%20%20%20forecasting_horizon%3Dforecasting_horizon%2C%0A%20%20%20%20)%0A%20%20%20%20print(f%22Vintages%3A%20%7By_pred_vintages%5B'vintage_time'%5D.n_unique()%7D%22)%0A%20%20%20%20y_pred_vintages.head(10)%0A%20%20%20%20return%20(y_pred_vintages%2C)%0A%0A%0A%40app.cell%0Adef%20_(MeanAbsoluteError%2C%20y_train)%3A%0A%20%20%20%20vintage_scorer%20%3D%20MeanAbsoluteError()%0A%20%20%20%20vintage_scorer.fit(y_train)%0A%20%20%20%20return%20(vintage_scorer%2C)%0A%0A%0A%40app.cell%0Adef%20_(plot_score_heatmap%2C%20vintage_scorer%2C%20y_pred_vintages%2C%20y_test)%3A%0A%20%20%20%20plot_score_heatmap(%0A%20%20%20%20%20%20%20%20vintage_scorer%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_pred_vintages%2C%0A%20%20%20%20%20%20%20%20title%3D%22Score%20Heatmap%20(Step%20x%20Vintage)%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plot_score_time_series%2C%20vintage_scorer%2C%20y_pred_vintages%2C%20y_test)%3A%0A%20%20%20%20plot_score_time_series(%0A%20%20%20%20%20%20%20%20vintage_scorer%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_pred_vintages%2C%0A%20%20%20%20%20%20%20%20title%3D%22Per-timestep%20MAE%20across%20Vintages%22%2C%0A%20%20%20%20%20%20%20%20y_label%3D%22MAE%22%2C%0A%20%20%20%20%20%20%20%20height%3D500%2C%0A%20%20%20%20%20%20%20%20facet_by%3D%22vintage%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Next%20Steps%0A%0A%20%20%20%20-%20%5BEnsemble%20Forecasting%5D(%2Fpages%2Fhow-to%2Fensemble-forecasting%2F)%20for%20the%20full%20guide%0A%20%20%20%20-%20%5BBuild%20Reduction%20Forecasters%5D(%2Fpages%2Fhow-to%2Fbuild-reduction-forecasters%2F)%20for%20related%20techniques%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
0845fb3e70fec748f5e6a1fe4abd597c