openstef-models 4.1.1.dev0__tar.gz → 4.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/.gitignore +2 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/PKG-INFO +1 -1
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/pyproject.toml +1 -1
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/lgbm_forecaster.py +8 -6
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/lgbmlinear_forecaster.py +8 -6
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/presets/forecasting_workflow.py +26 -4
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/postprocessing/isotonic_quantile_calibrator.py +2 -2
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/multi_quantile_regressor.py +12 -8
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_multi_quantile_regressor.py +29 -3
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/README.md +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/mixins.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/plotters/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/plotters/contributions_plotter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/plotters/feature_importance_plotter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/joblib/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/joblib/joblib_model_serializer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/mlflow/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/mlflow/mlflow_storage.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/mlflow/mlflow_storage_callback.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/optuna/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/optuna/tuner.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/mixins/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/mixins/callbacks.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/mixins/model_serializer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/component_splitter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/constant_component_splitter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/linear_component_splitter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/linear_component_splitter_model/linear_component_splitter_model.z +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting/linear_component_splitter_model/linear_component_splitter_model.z.license +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/component_splitting_model.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/base_case_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/constant_quantile_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/flatliner_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/gblinear_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/median_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting/xgboost_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting_model.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/presets/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/testing.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/energy_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/energy_domain/wind_power_feature_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/dimensionality_reducer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/empty_feature_remover.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/flagger.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/imputer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/nan_dropper.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/outlier_handler.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/sample_weighter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/scaler.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/selector.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/general/shifter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/postprocessing/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/postprocessing/confidence_interval_applicator.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/postprocessing/quantile_sorter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/cyclic_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/datetime_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/holiday_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/lags_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/rolling_aggregates_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/time_domain/versioned_lags_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/validation/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/validation/completeness_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/validation/flatline_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/validation/input_consistency_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/weather_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/weather_domain/atmosphere_derived_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/weather_domain/daylight_feature_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/weather_domain/radiation_derived_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/data_split.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/evaluation_functions.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/feature_selection.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/loss_functions.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/xgboost.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/callbacks/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/callbacks/data_save.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/callbacks/model_performance_callback.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/custom_component_split_workflow.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/custom_forecasting_workflow.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/integration/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/integration/test_integration.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/explainability/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/explainability/plotters/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/explainability/plotters/test_contributions_plotter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/joblib/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/joblib/test_joblib_model_serializer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/mlflow/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/mlflow/test_mlflow_storage.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/mlflow/test_mlflow_storage_callback.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/optuna/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/optuna/test_tuner.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/component_splitting/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/component_splitting/test_constant_component_splitter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/component_splitting/test_linear_component_splitter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/conftest.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_base_case_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_constant_quantile_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_flatliner_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_gblinear_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_lgbm_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_lgbmlinear_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_median_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/test_xgboost_forecaster.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/test_forecasting_model.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/test_example.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/energy_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/energy_domain/test_wind_power_feature_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_dimensionality_reducer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_empty_feature_remover.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_flagger.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_imputer.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_nan_dropper.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_outlier_handler.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_sample_weighter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_scaler.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_selector.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_shifter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/postprocessing/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/postprocessing/test_confidence_interval_applicator.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/postprocessing/test_isotonic_quantile_calibrator.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/postprocessing/test_quantile_sorter.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_cyclic_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_datetime_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_holiday_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_lags_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_rolling_aggregates_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/test_versioned_lags_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/validation/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/validation/test_completeness_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/validation/test_flatline_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/validation/test_input_consistency_checker.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/weather_domain/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/weather_domain/test_atmosphere_derived_features_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/weather_domain/test_daylight_feature_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/weather_domain/test_radiation_derived_featuers_adder.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_data_split.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_feature_selection.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_loss_functions.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/workflows/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/workflows/callbacks/__init__.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/workflows/callbacks/test_model_performance_callback.py +0 -0
- {openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/workflows/test_custom_forecasting_workflow.py +0 -0
|
@@ -71,6 +71,8 @@ docs/source/user_guide/**/quick_start_tutorial.py
|
|
|
71
71
|
docs/source/user_guide/**/feature_engineering_tutorial.py
|
|
72
72
|
docs/source/user_guide/**/datasets_tutorial.py
|
|
73
73
|
docs/source/user_guide/**/backtesting_tutorial.py
|
|
74
|
+
docs/source/user_guide/**/foundation_model_forecasting_quickstart.py
|
|
75
|
+
docs/source/user_guide/**/foundation_model_forecasting.py
|
|
74
76
|
|
|
75
77
|
# docs/_doctrees/
|
|
76
78
|
# docs/_static_gen/
|
|
@@ -111,6 +111,12 @@ class LGBMHyperParams(HyperParams):
|
|
|
111
111
|
description="Fraction of features used when constructing each tree. Range: (0,1]",
|
|
112
112
|
)
|
|
113
113
|
|
|
114
|
+
# Early Stopping
|
|
115
|
+
early_stopping_rounds: int | None = Field(
|
|
116
|
+
default=None,
|
|
117
|
+
description="Training will stop if performance doesn't improve for this many rounds. Requires validation data.",
|
|
118
|
+
)
|
|
119
|
+
|
|
114
120
|
@classmethod
|
|
115
121
|
def forecaster_class(cls) -> "type[LGBMForecaster]":
|
|
116
122
|
"""Create a LightGBM forecaster instance from this configuration.
|
|
@@ -184,10 +190,6 @@ class LGBMForecaster(Forecaster, ExplainableForecaster, ContributionsMixin):
|
|
|
184
190
|
alias="seed",
|
|
185
191
|
description="Random seed for reproducibility.",
|
|
186
192
|
)
|
|
187
|
-
early_stopping_rounds: int | None = Field(
|
|
188
|
-
default=None,
|
|
189
|
-
description="Training stops if performance doesn't improve for this many rounds.",
|
|
190
|
-
)
|
|
191
193
|
|
|
192
194
|
_lgbm_model: MultiQuantileRegressor = PrivateAttr()
|
|
193
195
|
|
|
@@ -229,7 +231,7 @@ class LGBMForecaster(Forecaster, ExplainableForecaster, ContributionsMixin):
|
|
|
229
231
|
"colsample_bytree": self.hyperparams.colsample_bytree,
|
|
230
232
|
# General parameters
|
|
231
233
|
"random_state": self.random_state,
|
|
232
|
-
"early_stopping_rounds": self.early_stopping_rounds,
|
|
234
|
+
"early_stopping_rounds": self.hyperparams.early_stopping_rounds,
|
|
233
235
|
"verbosity": self.verbosity,
|
|
234
236
|
"n_jobs": self.n_jobs,
|
|
235
237
|
}
|
|
@@ -238,7 +240,7 @@ class LGBMForecaster(Forecaster, ExplainableForecaster, ContributionsMixin):
|
|
|
238
240
|
base_learner=LGBMRegressor,
|
|
239
241
|
quantile_param="alpha",
|
|
240
242
|
hyperparams=lgbm_params,
|
|
241
|
-
quantiles=
|
|
243
|
+
quantiles=self.quantiles,
|
|
242
244
|
)
|
|
243
245
|
|
|
244
246
|
@property
|
|
@@ -111,6 +111,12 @@ class LGBMLinearHyperParams(HyperParams):
|
|
|
111
111
|
description="Fraction of features used when constructing each tree. Range: (0,1]",
|
|
112
112
|
)
|
|
113
113
|
|
|
114
|
+
# Early Stopping
|
|
115
|
+
early_stopping_rounds: int | None = Field(
|
|
116
|
+
default=None,
|
|
117
|
+
description="Training will stop if performance doesn't improve for this many rounds. Requires validation data.",
|
|
118
|
+
)
|
|
119
|
+
|
|
114
120
|
@classmethod
|
|
115
121
|
def forecaster_class(cls) -> "type[LGBMLinearForecaster]":
|
|
116
122
|
"""Get forecaster class for these hyperparams.
|
|
@@ -185,10 +191,6 @@ class LGBMLinearForecaster(Forecaster, ExplainableForecaster, ContributionsMixin
|
|
|
185
191
|
alias="seed",
|
|
186
192
|
description="Random seed for reproducibility.",
|
|
187
193
|
)
|
|
188
|
-
early_stopping_rounds: int | None = Field(
|
|
189
|
-
default=None,
|
|
190
|
-
description="Training stops if performance doesn't improve for this many rounds.",
|
|
191
|
-
)
|
|
192
194
|
|
|
193
195
|
_lgbmlinear_model: MultiQuantileRegressor = PrivateAttr()
|
|
194
196
|
|
|
@@ -230,7 +232,7 @@ class LGBMLinearForecaster(Forecaster, ExplainableForecaster, ContributionsMixin
|
|
|
230
232
|
"colsample_bytree": self.hyperparams.colsample_bytree,
|
|
231
233
|
# General parameters
|
|
232
234
|
"random_state": self.random_state,
|
|
233
|
-
"early_stopping_rounds": self.early_stopping_rounds,
|
|
235
|
+
"early_stopping_rounds": self.hyperparams.early_stopping_rounds,
|
|
234
236
|
"verbosity": self.verbosity,
|
|
235
237
|
"n_jobs": self.n_jobs,
|
|
236
238
|
}
|
|
@@ -239,7 +241,7 @@ class LGBMLinearForecaster(Forecaster, ExplainableForecaster, ContributionsMixin
|
|
|
239
241
|
base_learner=LGBMRegressor,
|
|
240
242
|
quantile_param="alpha",
|
|
241
243
|
hyperparams=lgbmlinear_params,
|
|
242
|
-
quantiles=
|
|
244
|
+
quantiles=self.quantiles,
|
|
243
245
|
)
|
|
244
246
|
|
|
245
247
|
@property
|
|
@@ -453,7 +453,13 @@ def create_forecasting_workflow(
|
|
|
453
453
|
horizons=config.horizons,
|
|
454
454
|
hyperparams=config.lgbmlinear_hyperparams,
|
|
455
455
|
)
|
|
456
|
-
postprocessing = [
|
|
456
|
+
postprocessing = [
|
|
457
|
+
QuantileSorter(),
|
|
458
|
+
ConfidenceIntervalApplicator(
|
|
459
|
+
quantiles=config.quantiles,
|
|
460
|
+
add_quantiles_from_std=False,
|
|
461
|
+
),
|
|
462
|
+
]
|
|
457
463
|
elif config.model == "lgbm":
|
|
458
464
|
preprocessing = [
|
|
459
465
|
*checks,
|
|
@@ -468,7 +474,13 @@ def create_forecasting_workflow(
|
|
|
468
474
|
horizons=config.horizons,
|
|
469
475
|
hyperparams=config.lgbm_hyperparams,
|
|
470
476
|
)
|
|
471
|
-
postprocessing = [
|
|
477
|
+
postprocessing = [
|
|
478
|
+
QuantileSorter(),
|
|
479
|
+
ConfidenceIntervalApplicator(
|
|
480
|
+
quantiles=config.quantiles,
|
|
481
|
+
add_quantiles_from_std=False,
|
|
482
|
+
),
|
|
483
|
+
]
|
|
472
484
|
elif config.model == "gblinear":
|
|
473
485
|
preprocessing = [
|
|
474
486
|
*checks,
|
|
@@ -510,7 +522,12 @@ def create_forecasting_workflow(
|
|
|
510
522
|
quantiles=config.quantiles,
|
|
511
523
|
horizons=config.horizons,
|
|
512
524
|
)
|
|
513
|
-
postprocessing = [
|
|
525
|
+
postprocessing = [
|
|
526
|
+
ConfidenceIntervalApplicator(
|
|
527
|
+
quantiles=config.quantiles,
|
|
528
|
+
add_quantiles_from_std=False,
|
|
529
|
+
),
|
|
530
|
+
]
|
|
514
531
|
elif config.model == "constant_quantile":
|
|
515
532
|
preprocessing = [
|
|
516
533
|
CompletenessChecker(
|
|
@@ -522,7 +539,12 @@ def create_forecasting_workflow(
|
|
|
522
539
|
quantiles=config.quantiles,
|
|
523
540
|
horizons=config.horizons,
|
|
524
541
|
)
|
|
525
|
-
postprocessing = [
|
|
542
|
+
postprocessing = [
|
|
543
|
+
ConfidenceIntervalApplicator(
|
|
544
|
+
quantiles=config.quantiles,
|
|
545
|
+
add_quantiles_from_std=False,
|
|
546
|
+
),
|
|
547
|
+
]
|
|
526
548
|
elif config.model == "flatliner":
|
|
527
549
|
preprocessing = []
|
|
528
550
|
forecaster = FlatlinerForecaster(
|
|
@@ -161,7 +161,7 @@ class IsotonicQuantileCalibrator(BaseModel, Transform[ForecastDataset, ForecastD
|
|
|
161
161
|
continue # Skip this quantile
|
|
162
162
|
|
|
163
163
|
if self.use_local_quantile_estimation:
|
|
164
|
-
actuals_clean = self._estimate_local_quantiles(predictions_clean, actuals_clean,
|
|
164
|
+
actuals_clean = self._estimate_local_quantiles(predictions_clean, actuals_clean, quantile)
|
|
165
165
|
|
|
166
166
|
# Fit isotonic regression
|
|
167
167
|
calibrator = IsotonicRegression(
|
|
@@ -184,7 +184,7 @@ class IsotonicQuantileCalibrator(BaseModel, Transform[ForecastDataset, ForecastD
|
|
|
184
184
|
self._is_fitted = True
|
|
185
185
|
|
|
186
186
|
def _estimate_local_quantiles(
|
|
187
|
-
self, predictions: np.ndarray, actuals: np.ndarray, quantile_level:
|
|
187
|
+
self, predictions: np.ndarray, actuals: np.ndarray, quantile_level: Quantile
|
|
188
188
|
) -> np.ndarray:
|
|
189
189
|
"""Estimate local quantiles using adaptive windowing.
|
|
190
190
|
|
|
@@ -13,6 +13,8 @@ import numpy.typing as npt
|
|
|
13
13
|
import pandas as pd
|
|
14
14
|
from sklearn.base import BaseEstimator, RegressorMixin
|
|
15
15
|
|
|
16
|
+
from openstef_core.types import Quantile
|
|
17
|
+
|
|
16
18
|
logger = logging.getLogger(__name__)
|
|
17
19
|
|
|
18
20
|
ParamType = float | int | str | bool | None
|
|
@@ -29,7 +31,7 @@ class MultiQuantileRegressor(BaseEstimator, RegressorMixin):
|
|
|
29
31
|
self,
|
|
30
32
|
base_learner: type[BaseEstimator],
|
|
31
33
|
quantile_param: str,
|
|
32
|
-
quantiles: list[
|
|
34
|
+
quantiles: list[Quantile],
|
|
33
35
|
hyperparams: dict[str, ParamType],
|
|
34
36
|
):
|
|
35
37
|
"""Initialize MultiQuantileRegressor.
|
|
@@ -82,6 +84,9 @@ class MultiQuantileRegressor(BaseEstimator, RegressorMixin):
|
|
|
82
84
|
"""
|
|
83
85
|
# Pass model-specific eval arguments
|
|
84
86
|
kwargs = {}
|
|
87
|
+
|
|
88
|
+
x_array = np.asarray(X)
|
|
89
|
+
|
|
85
90
|
for model in self._models:
|
|
86
91
|
# Check if early stopping is supported
|
|
87
92
|
# Check that eval_set is supported
|
|
@@ -89,21 +94,20 @@ class MultiQuantileRegressor(BaseEstimator, RegressorMixin):
|
|
|
89
94
|
model.set_params(early_stopping_rounds=None)
|
|
90
95
|
|
|
91
96
|
if eval_set is not None and self.learner_eval_sample_weight_param is not None:
|
|
97
|
+
kwargs["eval_set"] = [
|
|
98
|
+
(x_array if eval_x is X else np.asarray(eval_x), eval_y) for eval_x, eval_y in eval_set
|
|
99
|
+
]
|
|
92
100
|
kwargs[self.learner_eval_sample_weight_param] = eval_sample_weight
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
model.set_params(early_stopping_rounds=self.hyperparams["early_stopping_rounds"])
|
|
101
|
+
if "early_stopping_rounds" in self.hyperparams:
|
|
102
|
+
model.set_params(early_stopping_rounds=self.hyperparams["early_stopping_rounds"])
|
|
96
103
|
|
|
97
104
|
if feature_name:
|
|
98
105
|
self.model_feature_names = feature_name
|
|
99
106
|
else:
|
|
100
107
|
self.model_feature_names = []
|
|
101
108
|
|
|
102
|
-
if eval_sample_weight is not None and self.learner_eval_sample_weight_param:
|
|
103
|
-
kwargs[self.learner_eval_sample_weight_param] = eval_sample_weight
|
|
104
|
-
|
|
105
109
|
model.fit( # type: ignore
|
|
106
|
-
X=
|
|
110
|
+
X=x_array,
|
|
107
111
|
y=y,
|
|
108
112
|
sample_weight=sample_weight,
|
|
109
113
|
**kwargs,
|
|
@@ -10,6 +10,7 @@ from sklearn.base import BaseEstimator
|
|
|
10
10
|
from sklearn.linear_model import QuantileRegressor
|
|
11
11
|
from xgboost import XGBRegressor
|
|
12
12
|
|
|
13
|
+
from openstef_core.types import Quantile
|
|
13
14
|
from openstef_models.utils.multi_quantile_regressor import MultiQuantileRegressor, ParamType
|
|
14
15
|
|
|
15
16
|
ParamDict = dict[str, ParamType]
|
|
@@ -66,7 +67,7 @@ def baselearner_config(request: pytest.FixtureRequest) -> BaseLearnerConfig:
|
|
|
66
67
|
|
|
67
68
|
def test_init_sets_quantiles_and_models(baselearner_config: BaseLearnerConfig):
|
|
68
69
|
# Arrange
|
|
69
|
-
quantiles = [0.1, 0.5, 0.9]
|
|
70
|
+
quantiles = [Quantile(0.1), Quantile(0.5), Quantile(0.9)]
|
|
70
71
|
|
|
71
72
|
# Act
|
|
72
73
|
model = MultiQuantileRegressor(
|
|
@@ -83,7 +84,7 @@ def test_init_sets_quantiles_and_models(baselearner_config: BaseLearnerConfig):
|
|
|
83
84
|
|
|
84
85
|
def test_fit_and_predict_shape(dataset: tuple[pd.DataFrame, pd.Series], baselearner_config: BaseLearnerConfig):
|
|
85
86
|
# Arrange
|
|
86
|
-
quantiles = [0.1, 0.5, 0.9]
|
|
87
|
+
quantiles = [Quantile(0.1), Quantile(0.5), Quantile(0.9)]
|
|
87
88
|
X, y = dataset[0], dataset[1]
|
|
88
89
|
model = MultiQuantileRegressor(
|
|
89
90
|
base_learner=baselearner_config.base_learner,
|
|
@@ -102,7 +103,7 @@ def test_fit_and_predict_shape(dataset: tuple[pd.DataFrame, pd.Series], baselear
|
|
|
102
103
|
|
|
103
104
|
def test_is_fitted_true_after_fit(dataset: tuple[pd.DataFrame, pd.Series], baselearner_config: BaseLearnerConfig):
|
|
104
105
|
# Arrange
|
|
105
|
-
quantiles = [0.1, 0.5, 0.9]
|
|
106
|
+
quantiles = [Quantile(0.1), Quantile(0.5), Quantile(0.9)]
|
|
106
107
|
X, y = dataset[0], dataset[1]
|
|
107
108
|
model = MultiQuantileRegressor(
|
|
108
109
|
base_learner=baselearner_config.base_learner,
|
|
@@ -116,3 +117,28 @@ def test_is_fitted_true_after_fit(dataset: tuple[pd.DataFrame, pd.Series], basel
|
|
|
116
117
|
|
|
117
118
|
# Assert
|
|
118
119
|
assert model.is_fitted
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_fit_forwards_eval_set_for_early_stopping_lgbm(dataset: tuple[pd.DataFrame, pd.Series]):
|
|
123
|
+
# Arrange
|
|
124
|
+
quantiles = [Quantile(0.1), Quantile(0.5), Quantile(0.9)]
|
|
125
|
+
early_stopping_rounds = 3
|
|
126
|
+
X, y = dataset
|
|
127
|
+
y = y.to_numpy()
|
|
128
|
+
X_train, y_train = X.iloc[:80], y[:80] # noqa: N806
|
|
129
|
+
X_val, y_val = X.iloc[80:], y[80:] # noqa: N806
|
|
130
|
+
model = MultiQuantileRegressor(
|
|
131
|
+
base_learner=LGBMRegressor,
|
|
132
|
+
quantile_param="alpha",
|
|
133
|
+
quantiles=quantiles,
|
|
134
|
+
hyperparams={"objective": "quantile", "n_estimators": 10, "early_stopping_rounds": early_stopping_rounds},
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
# Act
|
|
138
|
+
model.fit(X_train, y_train, eval_set=[(X_train, y_train), (X_val, y_val)])
|
|
139
|
+
|
|
140
|
+
# Assert
|
|
141
|
+
for estimator in model.models:
|
|
142
|
+
assert isinstance(estimator, LGBMRegressor)
|
|
143
|
+
assert estimator.get_params()["early_stopping_rounds"] == early_stopping_rounds
|
|
144
|
+
assert estimator.evals_result_
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/__init__.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/explainability/mixins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/integrations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/mixins/callbacks.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/mixins/model_serializer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/models/forecasting_model.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/presets/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/transforms/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/data_split.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/feature_selection.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/utils/loss_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/src/openstef_models/workflows/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/explainability/plotters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/joblib/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/mlflow/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/optuna/__init__.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/integrations/optuna/test_tuner.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/__init__.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/forecasting/conftest.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/models/test_forecasting_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/energy_domain/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_flagger.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_imputer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_scaler.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_selector.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/general/test_shifter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/time_domain/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/transforms/validation/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_feature_selection.py
RENAMED
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/utils/test_loss_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
{openstef_models-4.1.1.dev0 → openstef_models-4.2.1}/tests/unit/workflows/callbacks/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|