diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c540a549..a2539f434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add default `params_to_tune` for `MedianOutliersTransform`, `DensityOutliersTransform` and `PredictionIntervalOutliersTransform` ([#1231](https://github.com/tinkoff-ai/etna/pull/1231)) - Add default `params_to_tune` for `TimeSeriesImputerTransform` ([#1232](https://github.com/tinkoff-ai/etna/pull/1232)) - Add default `params_to_tune` for `DifferencingTransform`, `MedianTransform`, `MaxTransform`, `MinTransform`, `QuantileTransform`, `StdTransform`, `MeanTransform`, `MADTransform`, `MinMaxDifferenceTransform`, `SumTransform`, `BoxCoxTransform`, `YeoJohnsonTransform`, `MaxAbsScalerTransform`, `MinMaxScalerTransform`, `RobustScalerTransform` and `StandardScalerTransform` ([#1233](https://github.com/tinkoff-ai/etna/pull/1233)) +- Add default `params_to_tune` for `LabelEncoderTransform` ([#1242](https://github.com/tinkoff-ai/etna/pull/1242)) ### Fixed - Fix bug in `GaleShapleyFeatureSelectionTransform` with wrong number of remaining features ([#1110](https://github.com/tinkoff-ai/etna/pull/1110)) - `ProphetModel` fails with additional seasonality set ([#1157](https://github.com/tinkoff-ai/etna/pull/1157)) @@ -68,6 +69,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix `DifferencingTransform` to raise error on new segments during `transform` and `inverse_transform` in inplace mode ([#1141](https://github.com/tinkoff-ai/etna/pull/1141)) - Teach `DifferencingTransform` to `inverse_transform` with NaNs ([#1155](https://github.com/tinkoff-ai/etna/pull/1155)) - Teach `BaseMixin.set_params` to work with nested `list` and `tuple` ([#1201](https://github.com/tinkoff-ai/etna/pull/1201)) +- ### Removed - `sample_acf_plot`, `sample_pacf_plot`, `CatBoostModelPerSegment`, `CatBoostModelMultiSegment` ([#1118](https://github.com/tinkoff-ai/etna/pull/1118)) - `PytorchForecastingTransform` ([#971](https://github.com/tinkoff-ai/etna/pull/971)) diff --git a/etna/transforms/encoders/categorical.py b/etna/transforms/encoders/categorical.py index d76072ac2..4926aabae 100644 --- a/etna/transforms/encoders/categorical.py +++ b/etna/transforms/encoders/categorical.py @@ -1,4 +1,5 @@ from enum import Enum +from typing import Dict from typing import List from typing import Optional @@ -8,9 +9,14 @@ from sklearn.utils._encode import _check_unknown from sklearn.utils._encode import _encode +from etna import SETTINGS from etna.datasets import TSDataset from etna.transforms.base import IrreversibleTransform +if SETTINGS.auto_required: + from optuna.distributions import BaseDistribution + from optuna.distributions import CategoricalDistribution + class ImputerMode(str, Enum): """Enum for different imputation strategy.""" @@ -130,6 +136,20 @@ def _get_column_name(self) -> str: return self.out_column return self.__repr__() + def params_to_tune(self) -> Dict[str, "BaseDistribution"]: + """Get default grid for tuning hyperparameters. + + This grid tunes only ``strategy`` parameter. Other parameters are expected to be set by the user. + + Returns + ------- + : + Grid to tune. + """ + return { + "strategy": CategoricalDistribution(["new_value", "mean"]), + } + class OneHotEncoderTransform(IrreversibleTransform): """Encode categorical feature as a one-hot numeric features. diff --git a/tests/test_transforms/test_encoders/test_categorical_transform.py b/tests/test_transforms/test_encoders/test_categorical_transform.py index 639414c04..d0a047147 100644 --- a/tests/test_transforms/test_encoders/test_categorical_transform.py +++ b/tests/test_transforms/test_encoders/test_categorical_transform.py @@ -13,6 +13,7 @@ from etna.transforms import FilterFeaturesTransform from etna.transforms.encoders.categorical import LabelEncoderTransform from etna.transforms.encoders.categorical import OneHotEncoderTransform +from tests.test_transforms.utils import assert_sampling_is_valid from tests.test_transforms.utils import assert_transformation_equals_loaded_original @@ -350,3 +351,16 @@ def test_save_load_ohe(dtype): def test_get_regressors_info_not_fitted(transform): with pytest.raises(ValueError, match="Fit the transform to get the correct regressors info!"): _ = transform.get_regressors_info() + + +def test_params_to_tune_ohe(): + transform = OneHotEncoderTransform(in_column="regressor_0") + assert len(transform.params_to_tune()) == 0 + + +def test_params_to_tune_label_encoder(ts_for_label_encoding): + ts, _ = ts_for_label_encoding + for i in range(3): + transform = LabelEncoderTransform(in_column=f"regressor_{i}", out_column="test") + assert len(transform.params_to_tune()) > 0 + assert_sampling_is_valid(transform=transform, ts=ts) diff --git a/tests/test_transforms/test_encoders/test_mean_segment_encoder_transform.py b/tests/test_transforms/test_encoders/test_mean_segment_encoder_transform.py index f8d41433f..9b546ba62 100644 --- a/tests/test_transforms/test_encoders/test_mean_segment_encoder_transform.py +++ b/tests/test_transforms/test_encoders/test_mean_segment_encoder_transform.py @@ -98,3 +98,8 @@ def test_fit_transform_with_nans(ts_diff_endings): def test_save_load(almost_constant_ts): transform = MeanSegmentEncoderTransform() assert_transformation_equals_loaded_original(transform=transform, ts=almost_constant_ts) + + +def test_params_to_tune(): + transform = MeanSegmentEncoderTransform() + assert len(transform.params_to_tune()) == 0 diff --git a/tests/test_transforms/test_encoders/test_segment_encoder_transform.py b/tests/test_transforms/test_encoders/test_segment_encoder_transform.py index 76b9797bb..8e29abd50 100644 --- a/tests/test_transforms/test_encoders/test_segment_encoder_transform.py +++ b/tests/test_transforms/test_encoders/test_segment_encoder_transform.py @@ -62,3 +62,8 @@ def test_new_segments_error(simple_ts): def test_save_load(example_tsds): transform = SegmentEncoderTransform() assert_transformation_equals_loaded_original(transform=transform, ts=example_tsds) + + +def test_params_to_tune(): + transform = SegmentEncoderTransform() + assert len(transform.params_to_tune()) == 0