Repository: aeon-toolkit/aeon
Pull request #1716 (2024-06-24 17:12:26)

[BUG] Remove feature extraction from `TSFreshClusterer`

#### What does this implement/fix? Explain your changes.

This estimator has a parameter for feature extraction, which does not make sense for clustering. This currently breaks the estimator if toggled to true.

I don't believe this is released yet, and even if it is the code is broken anyway, so no deprecation issue IMO.


aeon-actions-bot[bot]: 
## Thank you for contributing to `aeon`

I have added the following labels to this PR based on the title: **[ $\\color{#d73a4a}{\\textsf{bug}}$ ]**.
I have added the following labels to this PR based on the changes made: **[ $\\color{#4011F3}{\\textsf{clustering}}$ ]**. Feel free to change these if they do not properly represent the PR.

The [Checks](https://github.com/aeon-toolkit/aeon/pull/1716/checks) tab will show the status of our automated tests. You can click on individual test runs in the tab or "Details" in the panel below to see more information if there is a failure.

If our `pre-commit` code quality check fails, any trivial fixes will automatically be pushed to your PR unless it is a draft.

Don't hesitate to ask questions on the `aeon` [Slack](https://join.slack.com/t/aeon-toolkit/shared_invite/zt-22vwvut29-HDpCu~7VBUozyfL_8j3dLA) channel if you have any.

### PR CI actions

These checkboxes will add labels to enable/disable CI functionality for this PR. This may not take effect immediately, and a new commit may be required to run the new configuration.

- [ ] Run `pre-commit` checks for all files
- [ ] Run all `pytest` tests and configurations
- [ ] Run all notebook example tests
- [ ] Run numba-disabled `codecov` tests
- [ ] Stop automatic `pre-commit` fixes (always disabled for drafts)
    

Patch:
diff --git a/aeon/clustering/feature_based/_tsfresh.py b/aeon/clustering/feature_based/_tsfresh.py
index 9539260c..cd77518b 100644
--- a/aeon/clustering/feature_based/_tsfresh.py
+++ b/aeon/clustering/feature_based/_tsfresh.py
@@ -12,10 +12,7 @@ from sklearn.cluster import KMeans
 
 from aeon.base._base import _clone_estimator
 from aeon.clustering import BaseClusterer
-from aeon.transformations.collection.feature_based import (
-    TSFreshFeatureExtractor,
-    TSFreshRelevantFeatureExtractor,
-)
+from aeon.transformations.collection.feature_based import TSFreshFeatureExtractor
 
 
 class TSFreshClusterer(BaseClusterer):
@@ -30,8 +27,6 @@ class TSFreshClusterer(BaseClusterer):
     default_fc_parameters : str, default="efficient"
         Set of TSFresh features to be extracted, options are "minimal", "efficient" or
         "comprehensive".
-    relevant_feature_extractor : bool, default=False
-        Remove irrelevant features using the FRESH algorithm.
     estimator : sklearn clusterer, default=None
         An sklearn estimator to be built using the transformed data. Defaults to a
         Random Forest with 200 trees.
@@ -52,8 +47,6 @@ class TSFreshClusterer(BaseClusterer):
     See Also
     --------
     TSFreshFeatureExtractor
-    TSFreshRelevantFeatureExtractor
-    TSFreshRegressor
 
     References
     ----------
@@ -84,7 +77,6 @@ class TSFreshClusterer(BaseClusterer):
     def __init__(
         self,
         default_fc_parameters="efficient",
-        relevant_feature_extractor=True,
         estimator=None,
         verbose=0,
         n_jobs=1,
@@ -92,7 +84,6 @@ class TSFreshClusterer(BaseClusterer):
         random_state=None,
     ):
         self.default_fc_parameters = default_fc_parameters
-        self.relevant_feature_extractor = relevant_feature_extractor
         self.estimator = estimator
 
         self.verbose = verbose
@@ -125,18 +116,10 @@ class TSFreshClusterer(BaseClusterer):
         Changes state by creating a fitted model that updates attributes
         ending in "_" and sets is_fitted flag to True.
         """
-        self._transformer = (
-            TSFreshRelevantFeatureExtractor(
-                default_fc_parameters=self.default_fc_parameters,
-                n_jobs=self._n_jobs,
-                chunksize=self.chunksize,
-            )
-            if self.relevant_feature_extractor
-            else TSFreshFeatureExtractor(
-                default_fc_parameters=self.default_fc_parameters,
-                n_jobs=self._n_jobs,
-                chunksize=self.chunksize,
-            )
+        self._transformer = TSFreshFeatureExtractor(
+            default_fc_parameters=self.default_fc_parameters,
+            n_jobs=self._n_jobs,
+            chunksize=self.chunksize,
         )
         self._estimator = _clone_estimator(
             (KMeans() if self.estimator is None else self.estimator),
@@ -227,5 +210,4 @@ class TSFreshClusterer(BaseClusterer):
         """
         return {
             "default_fc_parameters": "minimal",
-            "relevant_feature_extractor": False,
         }
diff --git a/aeon/forecasting/base/_base.py b/aeon/forecasting/base/_base.py
index 37769add..3a829ee0 100644
--- a/aeon/forecasting/base/_base.py
+++ b/aeon/forecasting/base/_base.py
@@ -241,7 +241,7 @@ class BaseForecaster(BaseEstimator):
             where `columns1` is first or only item in `key`, and `columns2` is the last
             if only one item is passed in `key`, only `columns1` is applied to input
         """
-        from aeon.transformations.subset import ColumnSelect
+        from aeon.transformations._legacy.subset import _ColumnSelect
 
         def is_noneslice(obj):
             res = isinstance(obj, slice)
@@ -259,13 +259,13 @@ class BaseForecaster(BaseEstimator):
             if is_noneslice(columns1) and is_noneslice(columns2):
                 return self
             elif is_noneslice(columns2):
-                return ColumnSelect(columns1) ** self
+                return _ColumnSelect(columns1) ** self
             elif is_noneslice(columns1):
-                return self * ColumnSelect(columns2)
+                return self * _ColumnSelect(columns2)
             else:
-                return ColumnSelect(columns1) ** self * ColumnSelect(columns2)
+                return _ColumnSelect(columns1) ** self * _ColumnSelect(columns2)
         else:
-            return ColumnSelect(key) ** self
+            return _ColumnSelect(key) ** self
 
     def fit(self, y, X=None, fh=None):
         """Fit forecaster to training data.
diff --git a/aeon/transformations/_delegate.py b/aeon/transformations/_legacy/_delegate.py
similarity index 100%
rename from aeon/transformations/_delegate.py
rename to aeon/transformations/_legacy/_delegate.py
diff --git a/aeon/transformations/subset.py b/aeon/transformations/_legacy/subset.py
similarity index 95%
rename from aeon/transformations/subset.py
rename to aeon/transformations/_legacy/subset.py
index 397f9ced..48facac3 100644
--- a/aeon/transformations/subset.py
+++ b/aeon/transformations/_legacy/subset.py
@@ -3,19 +3,12 @@
 __maintainer__ = []
 
 import pandas as pd
-from deprecated.sphinx import deprecated
 from pandas.api.types import is_integer_dtype
 
 from aeon.transformations.base import BaseTransformer
 
 
-# TODO: remove in v0.10.0
-@deprecated(
-    version="0.9.0",
-    reason="IndexSubset will be removed in version 0.10.0.",
-    category=FutureWarning,
-)
-class IndexSubset(BaseTransformer):
+class _IndexSubset(BaseTransformer):
     r"""Index subsetting transformer.
 
     In transform, subsets `X` to the indices in `y.index`.
@@ -115,13 +108,7 @@ class IndexSubset(BaseTransformer):
         return [params1, params2]
 
 
-# TODO: remove in v0.10.0
-@deprecated(
-    version="0.9.0",
-    reason="ColumnSelect will be removed in version 0.10.0.",
-    category=FutureWarning,
-)
-class ColumnSelect(BaseTransformer):
+class _ColumnSelect(BaseTransformer):
     r"""Column selection transformer.
 
     In transform, subsets `X` to `columns` provided as hyper-parameters.
diff --git a/aeon/transformations/acf.py b/aeon/transformations/acf.py
deleted file mode 100644
index 66992f1a..00000000
--- a/aeon/transformations/acf.py
+++ /dev/null
@@ -1,280 +0,0 @@
-"""Auto-correlation transformations.
-
-Module :mod:`aeon.transformations` implements auto-correlation
-transformers.
-"""
-
-from deprecated.sphinx import deprecated
-
-__maintainer__ = []
-__all__ = ["AutoCorrelationTransformer", "PartialAutoCorrelationTransformer"]
-
-import pandas as pd
-
-from aeon.transformations.base import BaseTransformer
-
-
-# TODO: remove in v0.10.0
-@deprecated(
-    version="0.9.0",
-    reason="AutoCorrelationTransformer statsmodels wrapper will be removed in version "
-    "0.10.0. Please use the BaseSeriesTransformer version in the "
-    "transformations.series module called StatsModelsACF for a wrapper version.",
-    category=FutureWarning,
-)
-class AutoCorrelationTransformer(BaseTransformer):
-    """Auto-correlation transformer.
-
-    The autocorrelation function measures how correlated a timeseries is
-    with itself at different lags. The AutocorrelationTransformer returns
-    these values as a series for each lag up to the `n_lags` specified.
-
-    Parameters
-    ----------
-    adjusted : bool, default=False
-        If True, then denominators for autocovariance are n-k, otherwise n.
-
-    n_lags : int, default=None
-        Number of lags to return autocorrelation for. If None,
-        statsmodels acf function uses min(10 * np.log10(nobs), nobs - 1).
-
-    fft : bool, default=False
-        If True, computes the ACF via FFT.
-
-    missing : {"none", "raise", "conservative", "drop"}, default="none"
-        How missing values are to be treated in autocorrelation function
-        calculations.
-
-        - "none" performs no checks or handling of missing values
-        - "raise" raises an exception if NaN values are found.
-        - "drop" removes the missing observations and then estimates the
-          autocovariances treating the non-missing as contiguous.
-        - "conservative" computes the autocovariance using nan-ops so that nans
-          are removed when computing the mean and cross-products that are used to
-          estimate the autocovariance. "n" in calculation is set to the number of
-          non-missing observations.
-
-    See Also
-    --------
-    PartialAutoCorrelationTransformer
-
-    Notes
-    -----
-    Provides wrapper around statsmodels
-    `acf <https://www.statsmodels.org/devel/generated/
-    statsmodels.tsa.stattools.acf.html>`_ function.
-
-    Examples
-    --------
-    >>> from aeon.transformations.acf import AutoCorrelationTransformer
-    >>> from aeon.datasets import load_airline
-    >>> y = load_airline()  # doctest: +SKIP
-    >>> transformer = AutoCorrelationSeriesTransformer(n_lags=12)  # doctest: +SKIP
-    >>> y_hat = transformer.fit_transform(y)  # doctest: +SKIP
-    """
-
-    _tags = {
-        "input_data_type": "Series",
-        # what is the abstract type of X: Series, or Panel
-        "output_data_type": "Series",
-        # what abstract type is returned: Primitives, Series, Panel
-        "instancewise": True,  # is this an instance-wise transform?
-        "X_inner_type": "pd.Series",
-        "y_inner_type": "None",
-        "capability:multivariate": False,
-        "fit_is_empty": True,
-        "python_dependencies": "statsmodels",
-    }
-
-    def __init__(
-        self,
-        adjusted=False,
-        n_lags=None,
-        fft=False,
-        missing="none",
-    ):
-        self.adjusted = adjusted
-        self.n_lags = n_lags
-        self.fft = fft
-        self.missing = missing
-        super().__init__()
-
-    def _transform(self, X, y=None):
-        """Transform X and return a transformed version.
-
-        private _transform containing the core logic, called from transform
-
-        Parameters
-        ----------
-        X : pd.Series
-            Data to be transformed
-        y : ignored argument for interface compatibility
-            Additional data, e.g., labels for transformation
-
-        Returns
-        -------
-        transformed version of X
-        """
-        from statsmodels.tsa.stattools import acf
-
-        # Passing an alpha values other than None would return confidence intervals
-        # and break the signature of the series-to-series transformer
-        zt = acf(
-            X,
-            adjusted=self.adjusted,
-            nlags=self.n_lags,
-            qstat=False,
-            fft=self.fft,
-            alpha=None,
-            missing=self.missing,
-        )
-        return pd.Series(zt)
-
-    @classmethod
-    def get_test_params(cls, parameter_set="default"):
-        """Return testing parameter settings for the estimator.
-
-        Parameters
-        ----------
-        parameter_set : str, default="default"
-            Name of the set of test parameters to return, for use in tests. If no
-            special parameters are defined for a value, will return `"default"` set.
-
-
-        Returns
-        -------
-        params : dict or list of dict, default = {}
-            Parameters to create testing instances of the class
-            Each dict are parameters to construct an "interesting" test instance, i.e.,
-            `MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
-            `create_test_instance` uses the first (or only) dictionary in `params`
-        """
-        return [{}, {"n_lags": 1}]
-
-
-# TODO: remove in v0.10.0
-@deprecated(
-    version="0.9.0",
-    reason="PartialAutoCorrelationTransformer statsmodels wrapper will be removed"
-    "in version 0.10.0. Please use the BaseSeriesTransformer version in the "
-    "transformations.series module called StatsModelsPACF.",
-    category=FutureWarning,
-)
-class PartialAutoCorrelationTransformer(BaseTransformer):
-    """Partial auto-correlation transformer.
-
-    The partial autocorrelation function measures the conditional correlation
-    between a timeseries and its self at different lags. In particular,
-    the correlation between a time period and a lag, is calculated conditional
-    on all the points between the time period and the lag.
-
-    The PartialAutoCorrelationTransformer returns
-    these values as a series for each lag up to the `n_lags` specified.
-
-    Parameters
-    ----------
-    n_lags : int, default=None
-        Number of lags to return partial autocorrelation for. If None,
-        statsmodels acf function uses min(10 * np.log10(nobs), nobs // 2 - 1).
-
-    method : str, default="ywadjusted"
-        Specifies which method for the calculations to use.
-
-        - "yw" or "ywadjusted" : Yule-Walker with sample-size adjustment in
-          denominator for acovf. Default.
-        - "ywm" or "ywmle" : Yule-Walker without adjustment.
-        - "ols" : regression of time series on lags of it and on constant.
-        - "ols-inefficient" : regression of time series on lags using a single
-          common sample to estimate all pacf coefficients.
-        - "ols-adjusted" : regression of time series on lags with a bias
-          adjustment.
-        - "ld" or "ldadjusted" : Levinson-Durbin recursion with bias
-          correction.
-        - "ldb" or "ldbiased" : Levinson-Durbin recursion without bias
-          correction.
-
-    See Also
-    --------
-    AutoCorrelationSeriesTransformer
-
-    Notes
-    -----
-    Provides wrapper around statsmodels
-    `pacf <https://www.statsmodels.org/devel/generated/
-    statsmodels.tsa.stattools.pacf.html>`_ function.
-
-
-    Examples
-    --------
-    >>> from aeon.transformations.acf import PartialAutoCorrelationTransformer
-    >>> from aeon.datasets import load_airline
-    >>> y = load_airline()  # doctest: +SKIP
-    >>> transformer = PartialAutoCorrelationTransformer(n_lags=12)  # doctest: +SKIP
-    >>> y_hat = transformer.fit_transform(y)  # doctest: +SKIP
-    """
-
-    _tags = {
-        "input_data_type": "Series",
-        # what is the abstract type of X: Series, or Panel
-        "output_data_type": "Series",
-        # what abstract type is returned: Primitives, Series, Panel
-        "instancewise": True,
-        "X_inner_type": "pd.Series",
-        "y_inner_type": "None",
-        "capability:multivariate": False,
-        "fit_is_empty": True,
-        "python_dependencies": "statsmodels",
-    }
-
-    def __init__(
-        self,
-        n_lags=None,
-        method="ywadjusted",
-    ):
-        self.n_lags = n_lags
-        self.method = method
-        super().__init__()
-
-    def _transform(self, X, y=None):
-        """Transform X and return a transformed version.
-
-        private _transform containing the core logic, called from transform
-
-        Parameters
-        ----------
-        X : pd.Series
-            Data to be transformed
-        y : ignored argument for interface compatibility
-            Additional data, e.g., labels for transformation
-
-        Returns
-        -------
-        transformed version of X
-        """
-        from statsmodels.tsa.stattools import pacf
-
-        # Passing an alpha values other than None would return confidence intervals
-        # and break the signature of the series-to-series transformer
-        zt = pacf(X, nlags=self.n_lags, method=self.method, alpha=None)
-        return pd.Series(zt)
-
-    @classmethod
-    def get_test_params(cls, parameter_set="default"):
-        """Return testing parameter settings for the estimator.
-
-        Parameters
-        ----------
-        parameter_set : str, default="default"
-            Name of the set of test parameters to return, for use in tests. If no
-            special parameters are defined for a value, will return `"default"` set.
-
-
-        Returns
-        -------
-        params : dict or list of dict, default = {}
-            Parameters to create testing instances of the class
-            Each dict are parameters to construct an "interesting" test instance, i.e.,
-            `MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
-            `create_test_instance` uses the first (or only) dictionary in `params`
-        """
-        return [{}, {"n_lags": 1}]
diff --git a/aeon/transformations/adapt.py b/aeon/transformations/adapt.py
index 33a93a39..6445e262 100644
--- a/aeon/transformations/adapt.py
+++ b/aeon/transformations/adapt.py
@@ -10,6 +10,12 @@ from sklearn.base import clone
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="TabularToSeriesAdaptor will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class TabularToSeriesAdaptor(BaseTransformer):
     """
     Adapt scikit-learn transformation interface to time series setting.
diff --git a/aeon/transformations/base.py b/aeon/transformations/base.py
index e1b8f03d..1fc51da7 100644
--- a/aeon/transformations/base.py
+++ b/aeon/transformations/base.py
@@ -309,7 +309,7 @@ class BaseTransformer(BaseEstimator):
             where `columns1` is first or only item in `key`, and `columns2` is the last
             if only one item is passed in `key`, only `columns1` is applied to input
         """
-        from aeon.transformations.subset import ColumnSelect
+        from aeon.transformations._legacy.subset import _ColumnSelect
 
         def is_noneslice(obj):
             res = isinstance(obj, slice)
@@ -327,13 +327,13 @@ class BaseTransformer(BaseEstimator):
             if is_noneslice(columns1) and is_noneslice(columns2):
                 return self
             elif is_noneslice(columns2):
-                return ColumnSelect(columns1) * self
+                return _ColumnSelect(columns1) * self
             elif is_noneslice(columns1):
-                return self * ColumnSelect(columns2)
+                return self * _ColumnSelect(columns2)
             else:
-                return ColumnSelect(columns1) * self * ColumnSelect(columns2)
+                return _ColumnSelect(columns1) * self * _ColumnSelect(columns2)
         else:
-            return ColumnSelect(key) * self
+            return _ColumnSelect(key) * self
 
     def fit(self, X, y=None):
         """Fit transformer to X, optionally to y.
diff --git a/aeon/transformations/compose.py b/aeon/transformations/compose.py
index 48db9d28..503025f1 100644
--- a/aeon/transformations/compose.py
+++ b/aeon/transformations/compose.py
@@ -4,11 +4,12 @@ from warnings import warn
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 from sklearn import clone
 
 from aeon.base import _HeterogenousMetaEstimator
 from aeon.testing.mock_estimators import MockTransformer
-from aeon.transformations._delegate import _DelegatedTransformer
+from aeon.transformations._legacy._delegate import _DelegatedTransformer
 from aeon.transformations.base import BaseTransformer
 from aeon.utils.multiindex import flatten_multiindex
 from aeon.utils.sklearn import is_sklearn_transformer
@@ -42,6 +43,12 @@ def _coerce_to_aeon(other):
     return other
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="TransformerPipeline will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class TransformerPipeline(_HeterogenousMetaEstimator, BaseTransformer):
     """
     Pipeline of transformers compositor.
@@ -101,42 +108,6 @@ class TransformerPipeline(_HeterogenousMetaEstimator, BaseTransformer):
         is always in (str, transformer) format, even if `steps` is just a list
         strings not passed in `steps` are replaced by unique generated strings
         i-th transformer in `steps_` is clone of i-th in `steps`.
-
-    Examples
-    --------
-    >>> from aeon.testing.mock_estimators import MockTransformer
-    >>> t1 = MockTransformer(power=2)
-    >>> t2 = MockTransformer(power=0.5)
-
-        Example 1, option A: construct without strings (unique names are generated for
-        the two components t1 and t2)
-    >>> pipe = TransformerPipeline(steps = [t1, t2])
-
-        Example 1, option B: construct with strings to give custom names to steps
-    >>> pipe = TransformerPipeline(
-    ...         steps = [
-    ...             ("trafo1", t1),
-    ...             ("trafo2", t2),
-    ...         ]
-    ...     )
-
-        Example 1, option C: for quick construction, the * dunder method can be used
-    >>> pipe = t1 * t2
-
-        Example 2: sklearn transformers can be used in the pipeline.
-        If applied to Series, sklearn transformers are applied by series instance.
-        If applied to Table, sklearn transformers are applied to the table as a whole.
-    >>> from sklearn.preprocessing import StandardScaler
-    >>> from aeon.transformations.summarize import SummaryTransformer
-
-        This applies the scaler per series, then summarizes:
-    >>> pipe = StandardScaler() * SummaryTransformer()
-
-        This applies the sumamrization, then scales the full summary table:
-    >>> pipe = SummaryTransformer() * StandardScaler()
-
-        This scales the series, then summarizes, then scales the full summary table:
-    >>> pipe = StandardScaler() * SummaryTransformer() * StandardScaler()
     """
 
     _tags = {
@@ -401,6 +372,12 @@ class TransformerPipeline(_HeterogenousMetaEstimator, BaseTransformer):
         return [params1, params2, params3]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="FeatureUnion will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FeatureUnion(_HeterogenousMetaEstimator, BaseTransformer):
     """Concatenates results of multiple transformer objects.
 
@@ -619,6 +596,12 @@ class FeatureUnion(_HeterogenousMetaEstimator, BaseTransformer):
         return {"transformer_list": TRANSFORMERS}
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="FitInTransform will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FitInTransform(BaseTransformer):
     """
     Transformer wrapper to delay fit to the transform phase.
@@ -643,30 +626,6 @@ class FitInTransform(BaseTransformer):
         transformer is the inner transformer. So the inner transformer is
         fitted on the inverse_transform data. This is required to have a non-
         state changing transform() method of FitInTransform.
-
-    Examples
-    --------
-    >>> from aeon.datasets import load_longley
-    >>> from aeon.forecasting.naive import NaiveForecaster
-    >>> from aeon.forecasting.base import ForecastingHorizon
-    >>> from aeon.forecasting.compose import ForecastingPipeline
-    >>> from aeon.forecasting.model_selection import temporal_train_test_split
-    >>> from aeon.transformations.compose import FitInTransform
-    >>> from aeon.transformations.impute import Imputer
-    >>> y, X = load_longley()
-    >>> y_train, y_test, X_train, X_test = temporal_train_test_split(y, X)
-    >>> fh = ForecastingHorizon(y_test.index, is_relative=False)
-    >>> # we want to fit the Imputer only on the predict (=transform) data.
-    >>> # note that NaiveForecaster cant use X data, this is just a show case.
-    >>> pipe = ForecastingPipeline(
-    ...     steps=[
-    ...         ("imputer", FitInTransform(Imputer(method="mean"))),
-    ...         ("forecaster", NaiveForecaster()),
-    ...     ]
-    ... )
-    >>> pipe.fit(y_train, X_train)
-    ForecastingPipeline(...)
-    >>> y_pred = pipe.predict(fh=fh, X=X_test)
     """
 
     def __init__(self, transformer, skip_inverse_transform=True):
@@ -754,6 +713,12 @@ class FitInTransform(BaseTransformer):
         return params
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="MultiplexTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class MultiplexTransformer(_HeterogenousMetaEstimator, _DelegatedTransformer):
     """
     Facilitate an AutoML based selection of the best transformer.
@@ -797,40 +762,6 @@ class MultiplexTransformer(_HeterogenousMetaEstimator, _DelegatedTransformer):
     _transformers : list of (name, est) tuples, where est are direct references to
         the estimators passed in transformers passed. If transformers was passed
         without names, those be auto-generated and put here.
-
-    Examples
-    --------
-    >>> from aeon.datasets import load_shampoo_sales
-    >>> from aeon.forecasting.naive import NaiveForecaster
-    >>> from aeon.transformations.compose import MultiplexTransformer
-    >>> from aeon.transformations.impute import Imputer
-    >>> from aeon.forecasting.compose import TransformedTargetForecaster
-    >>> from aeon.forecasting.model_selection import (
-    ...     ForecastingGridSearchCV,
-    ...     ExpandingWindowSplitter)
-    >>> # create MultiplexTransformer:
-    >>> multiplexer = MultiplexTransformer(transformers=[
-    ...     ("impute_mean", Imputer(method="mean", missing_values = -1)),
-    ...     ("impute_near", Imputer(method="nearest", missing_values = -1)),
-    ...     ("impute_rand", Imputer(method="random", missing_values = -1))])
-    >>> cv = ExpandingWindowSplitter(
-    ...     initial_window=24,
-    ...     step_length=12,
-    ...     fh=[1,2,3])
-    >>> pipe = TransformedTargetForecaster(steps = [
-    ...     ("multiplex", multiplexer),
-    ...     ("forecaster", NaiveForecaster())
-    ...     ])
-    >>> gscv = ForecastingGridSearchCV(
-    ...     cv=cv,
-    ...     param_grid={"multiplex__selected_transformer":
-    ...     ["impute_mean", "impute_near", "impute_rand"]},
-    ...     forecaster=pipe,
-    ...     )
-    >>> y = load_shampoo_sales()
-    >>> # randomly make some of the values nans:
-    >>> y.loc[y.sample(frac=0.1).index] = -1
-    >>> gscv = gscv.fit(y)
     """
 
     # tags will largely be copied from selected_transformer
@@ -1012,6 +943,12 @@ class MultiplexTransformer(_HeterogenousMetaEstimator, _DelegatedTransformer):
         )
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="InvertTransform will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class InvertTransform(_DelegatedTransformer):
     """Invert a series-to-series transformation.
 
@@ -1026,16 +963,6 @@ class InvertTransform(_DelegatedTransformer):
     ----------
     transformer_: transformer,
         this clone is fitted when `fit` is called and provides `transform` and inverse
-
-    Examples
-    --------
-    >>> from aeon.datasets import load_airline
-    >>> from aeon.transformations.compose import InvertTransform
-    >>> from aeon.testing.mock_estimators import MockTransformer
-    >>>
-    >>> inverse_exponent = InvertTransform(MockTransformer(power=3))
-    >>> X = load_airline()
-    >>> Xt = inverse_exponent.fit_transform(X)  # computes 3rd square root
     """
 
     _tags = {
@@ -1162,6 +1089,12 @@ class InvertTransform(_DelegatedTransformer):
         return [params1, params2]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Id will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Id(BaseTransformer):
     """Identity transformer, returns data unchanged in transform/inverse_transform."""
 
@@ -1225,6 +1158,12 @@ class Id(BaseTransformer):
         return {}
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="OptionalPassthrough will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class OptionalPassthrough(_DelegatedTransformer):
     """
     Wrap an existing transformer to tune whether to include it in a pipeline.
@@ -1251,41 +1190,6 @@ class OptionalPassthrough(_DelegatedTransformer):
         this clone is fitted when `fit` is called and provides `transform` and inverse
         if passthrough = False, a clone of `transformer`passed
         if passthrough = True, the identity transformer `Id`
-
-    Examples
-    --------
-    >>> from aeon.datasets import load_airline
-    >>> from aeon.forecasting.naive import NaiveForecaster
-    >>> from aeon.transformations.compose import OptionalPassthrough
-    >>> from aeon.transformations.detrend import Deseasonalizer
-    >>> from aeon.transformations.adapt import TabularToSeriesAdaptor
-    >>> from aeon.forecasting.compose import TransformedTargetForecaster
-    >>> from aeon.forecasting.model_selection import (
-    ...     ForecastingGridSearchCV,
-    ...     SlidingWindowSplitter)
-    >>> from sklearn.preprocessing import StandardScaler
-    >>> # create pipeline
-    >>> pipe = TransformedTargetForecaster(steps=[
-    ...     ("deseasonalizer", OptionalPassthrough(Deseasonalizer())),
-    ...     ("scaler", OptionalPassthrough(TabularToSeriesAdaptor(StandardScaler()))),
-    ...     ("forecaster", NaiveForecaster())])  # doctest: +SKIP
-    >>> # putting it all together in a grid search
-    >>> cv = SlidingWindowSplitter(
-    ...     initial_window=60,
-    ...     window_length=24,
-    ...     start_with_window=True,
-    ...     step_length=48)  # doctest: +SKIP
-    >>> param_grid = {
-    ...     "deseasonalizer__passthrough" : [True, False],
-    ...     "scaler__transformer__transformer__with_mean": [True, False],
-    ...     "scaler__passthrough" : [True, False],
-    ...     "forecaster__strategy": ["drift", "mean", "last"]}  # doctest: +SKIP
-    >>> gscv = ForecastingGridSearchCV(
-    ...     forecaster=pipe,
-    ...     param_grid=param_grid,
-    ...     cv=cv,
-    ...     n_jobs=-1)  # doctest: +SKIP
-    >>> gscv_fitted = gscv.fit(load_airline())  # doctest: +SKIP
     """
 
     _tags = {
@@ -1354,6 +1258,12 @@ class OptionalPassthrough(_DelegatedTransformer):
         return {"transformer": _BoxCoxTransformer(), "passthrough": False}
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="ColumnwiseTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class ColumnwiseTransformer(BaseTransformer):
     """Apply a transformer columnwise to multivariate series.
 
@@ -1380,15 +1290,6 @@ class ColumnwiseTransformer(BaseTransformer):
     See Also
     --------
     OptionalPassthrough
-
-    Examples
-    --------
-    >>> from aeon.datasets import load_longley
-    >>> from aeon.transformations.detrend import Detrender
-    >>> from aeon.transformations.compose import ColumnwiseTransformer
-    >>> _, X = load_longley()
-    >>> transformer = ColumnwiseTransformer(Detrender())
-    >>> Xt = transformer.fit_transform(X)
     """
 
     _tags = {
@@ -1589,6 +1490,12 @@ def _check_is_pdseries(z):
     return z, is_series
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="ColumnConcatenator will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class ColumnConcatenator(BaseTransformer):
     """Concatenate multivariate series to a long univariate series.
 
@@ -1640,6 +1547,12 @@ class ColumnConcatenator(BaseTransformer):
         return Xt
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="OptionalPassthrough will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class YtoX(BaseTransformer):
     """
     Create exogeneous features which are a copy of the endogenous data.
diff --git a/aeon/transformations/date.py b/aeon/transformations/date.py
index 6dd006bc..903292a2 100644
--- a/aeon/transformations/date.py
+++ b/aeon/transformations/date.py
@@ -7,6 +7,7 @@ import warnings
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 
@@ -31,6 +32,12 @@ _RAW_DUMMIES = [
 ]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="DateTimeFeatures will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class DateTimeFeatures(BaseTransformer):
     """DateTime feature extraction for use in e.g. tree based models.
 
diff --git a/aeon/transformations/detrend/_deseasonalize.py b/aeon/transformations/detrend/_deseasonalize.py
index f5a0d946..95650dfd 100644
--- a/aeon/transformations/detrend/_deseasonalize.py
+++ b/aeon/transformations/detrend/_deseasonalize.py
@@ -7,6 +7,7 @@ from warnings import warn
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 from aeon.utils.datetime import _get_duration, _get_freq
@@ -65,6 +66,12 @@ def autocorrelation_seasonality_test(y, sp):
         return np.abs(coef) > limit
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Deseasonalizer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Deseasonalizer(BaseTransformer):
     """Remove seasonal components from a time series.
 
@@ -284,6 +291,12 @@ class Deseasonalizer(BaseTransformer):
         return [params, params2]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="ConditionalDeseasonalizer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class ConditionalDeseasonalizer(Deseasonalizer):
     """Remove seasonal components from time series, conditional on seasonality test.
 
@@ -410,6 +423,12 @@ class ConditionalDeseasonalizer(Deseasonalizer):
         return self
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="STLTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class STLTransformer(BaseTransformer):
     """Remove seasonal components from a time-series using STL.
 
diff --git a/aeon/transformations/detrend/_detrend.py b/aeon/transformations/detrend/_detrend.py
index c03e463b..541fa949 100644
--- a/aeon/transformations/detrend/_detrend.py
+++ b/aeon/transformations/detrend/_detrend.py
@@ -4,6 +4,7 @@ __all__ = ["Detrender"]
 __maintainer__ = []
 
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.forecasting.base._fh import ForecastingHorizon
 from aeon.forecasting.trend import PolynomialTrendForecaster
@@ -11,6 +12,12 @@ from aeon.transformations.base import BaseTransformer
 from aeon.utils.index_functions import update_data
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="STLTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Detrender(BaseTransformer):
     """Remove a :term:`trend <Trend>` from a series.
 
diff --git a/aeon/transformations/exponent.py b/aeon/transformations/exponent.py
index d81f5f84..130df563 100644
--- a/aeon/transformations/exponent.py
+++ b/aeon/transformations/exponent.py
@@ -11,6 +11,12 @@ import pandas as pd
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="ExponentTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class ExponentTransformer(BaseTransformer):
     """Apply element-wise exponentiation transformation to a time series.
 
diff --git a/aeon/transformations/feature_selection.py b/aeon/transformations/feature_selection.py
index d19ccb11..f71b246a 100644
--- a/aeon/transformations/feature_selection.py
+++ b/aeon/transformations/feature_selection.py
@@ -6,11 +6,18 @@ __all__ = ["FeatureSelection"]
 import math
 
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 from aeon.utils.validation.forecasting import check_regressor
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="DateTimeFeatures will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FeatureSelection(BaseTransformer):
     """
     Select exogenous features.
diff --git a/aeon/transformations/fourier.py b/aeon/transformations/fourier.py
index 2b074878..8c57dbc6 100644
--- a/aeon/transformations/fourier.py
+++ b/aeon/transformations/fourier.py
@@ -6,10 +6,17 @@ from typing import List, Optional, Union
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="FourierFeatures will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FourierFeatures(BaseTransformer):
     r"""Fourier Features for time series seasonality.
 
diff --git a/aeon/transformations/func_transform.py b/aeon/transformations/func_transform.py
index 8bf2e00d..79a98727 100644
--- a/aeon/transformations/func_transform.py
+++ b/aeon/transformations/func_transform.py
@@ -4,6 +4,7 @@ __maintainer__ = []
 __all__ = ["FunctionTransformer"]
 
 import numpy as np
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 
@@ -13,6 +14,12 @@ def _identity(X):
     return X
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="FourierFeatures will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FunctionTransformer(BaseTransformer):
     r"""
     Constructs a transformer from an arbitrary callable.
diff --git a/aeon/transformations/hierarchical/aggregate.py b/aeon/transformations/hierarchical/aggregate.py
index aa0ce3b5..d25328e7 100644
--- a/aeon/transformations/hierarchical/aggregate.py
+++ b/aeon/transformations/hierarchical/aggregate.py
@@ -6,10 +6,17 @@ from warnings import warn
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Aggregator will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Aggregator(BaseTransformer):
     """Prepare hierarchical data, including aggregate levels, from bottom level.
 
diff --git a/aeon/transformations/hierarchical/reconcile.py b/aeon/transformations/hierarchical/reconcile.py
index 4dcc2b95..315d7a03 100644
--- a/aeon/transformations/hierarchical/reconcile.py
+++ b/aeon/transformations/hierarchical/reconcile.py
@@ -9,12 +9,19 @@ from warnings import warn
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 from numpy.linalg import inv
 
 from aeon.transformations.base import BaseTransformer
 from aeon.transformations.hierarchical.aggregate import _check_index_no_total
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Reconciler will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Reconciler(BaseTransformer):
     """Hierarchical reconcilation transformer.
 
diff --git a/aeon/transformations/impute.py b/aeon/transformations/impute.py
index 87125b00..db802cc6 100644
--- a/aeon/transformations/impute.py
+++ b/aeon/transformations/impute.py
@@ -5,6 +5,7 @@ __all__ = ["Imputer"]
 
 
 import numpy as np
+from deprecated.sphinx import deprecated
 from sklearn.utils import check_random_state
 
 from aeon.forecasting.base import ForecastingHorizon
@@ -12,6 +13,12 @@ from aeon.forecasting.trend import PolynomialTrendForecaster
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Imputer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Imputer(BaseTransformer):
     """Missing value imputation.
 
diff --git a/aeon/transformations/lag.py b/aeon/transformations/lag.py
index 137b238c..ca50978c 100644
--- a/aeon/transformations/lag.py
+++ b/aeon/transformations/lag.py
@@ -6,6 +6,7 @@ from warnings import warn
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 from pandas.api.types import is_integer_dtype
 
 from aeon.transformations.base import BaseTransformer
@@ -23,6 +24,12 @@ def _coerce_to_int(obj):
     return obj
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="Lag will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class Lag(BaseTransformer):
     """Lagging transformer. Lags time series by one or multiple lags.
 
@@ -322,6 +329,12 @@ class Lag(BaseTransformer):
         return [params1, params2, params3]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="ReducerTransform will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class ReducerTransform(BaseTransformer):
     """Transformer for forecasting reduction. Prepares tabular X/y via lag and trafos.
 
diff --git a/aeon/transformations/outlier_detection.py b/aeon/transformations/outlier_detection.py
index d83e45e1..81c8e8b4 100644
--- a/aeon/transformations/outlier_detection.py
+++ b/aeon/transformations/outlier_detection.py
@@ -7,11 +7,18 @@ import warnings
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 
 from aeon.forecasting.model_selection import SlidingWindowSplitter
 from aeon.transformations.base import BaseTransformer
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="HampelFilter will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class HampelFilter(BaseTransformer):
     """Use HampelFilter to detect outliers based on a sliding window.
 
diff --git a/aeon/transformations/summarize.py b/aeon/transformations/summarize.py
index 1922b832..edfbc28b 100644
--- a/aeon/transformations/summarize.py
+++ b/aeon/transformations/summarize.py
@@ -5,12 +5,19 @@ __all__ = ["SummaryTransformer", "WindowSummarizer"]
 
 import numpy as np
 import pandas as pd
+from deprecated.sphinx import deprecated
 from joblib import Parallel, delayed
 
 from aeon.transformations.base import BaseTransformer
 from aeon.utils.multiindex import flatten_multiindex
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="WindowSummarizer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class WindowSummarizer(BaseTransformer):
     """
     Transformer for extracting time series features.
@@ -587,6 +594,12 @@ def _check_quantiles(quantiles):
     return quantiles
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="SummaryTransformer will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class SummaryTransformer(BaseTransformer):
     """Calculate summary value of a time series.
 
@@ -729,6 +742,12 @@ class SummaryTransformer(BaseTransformer):
         return [params1, params2, params3]
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="PlateauFinder will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class PlateauFinder(BaseTransformer):
     """
     Plateau finder transformer.
@@ -814,6 +833,12 @@ class PlateauFinder(BaseTransformer):
         return Xt
 
 
+# TODO: remove in v0.11.0
+@deprecated(
+    version="0.10.0",
+    reason="FittedParamExtractor will be removed in version 0.11.0.",
+    category=FutureWarning,
+)
 class FittedParamExtractor(BaseTransformer):
     """Fitted parameter extractor.
 
diff --git a/docs/api_reference/transformations.rst b/docs/api_reference/transformations.rst
index b0da9b66..60409c19 100644
--- a/docs/api_reference/transformations.rst
+++ b/docs/api_reference/transformations.rst
@@ -46,23 +46,6 @@ Composition
 Pipeline building
 ~~~~~~~~~~~~~~~~~
 
-.. currentmodule:: aeon.transformations.compose
-
-.. autosummary::
-    :toctree: auto_generated/
-    :template: class.rst
-
-    TransformerPipeline
-    FeatureUnion
-    ColumnwiseTransformer
-    ColumnTransformer
-    FitInTransform
-    MultiplexTransformer
-    OptionalPassthrough
-    InvertTransform
-    Id
-    YtoX
-
 .. currentmodule:: aeon.transformations.func_transform
 
 .. autosummary::
@@ -82,15 +65,6 @@ Sklearn and pandas adapters
 
     Tabularizer
 
-.. currentmodule:: aeon.transformations.adapt
-
-.. autosummary::
-    :toctree: auto_generated/
-    :template: class.rst
-
-    TabularToSeriesAdaptor
-    PandasTransformAdaptor
-
 Series-to-tabular transformers
 -------------------------------
 
@@ -353,18 +327,6 @@ Seasonality and Date-Time Features
 
     FourierFeatures
 
-Auto-correlation series
-~~~~~~~~~~~~~~~~~~~~~~~
-
-.. currentmodule:: aeon.transformations.acf
-
-.. autosummary::
-    :toctree: auto_generated/
-    :template: class.rst
-
-    AutoCorrelationTransformer
-    PartialAutoCorrelationTransformer
-
 Window-based series transforms
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -413,20 +375,6 @@ These transformers select features in `X` based on `y`.
     ElbowClassSum
     ElbowClassPairwise
 
-Subsetting time points and variables
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-These transformers subset `X` by time points (`pandas` index or index level) or variables (`pandas` columns).
-
-.. currentmodule:: aeon.transformations.subset
-
-.. autosummary::
-    :toctree: auto_generated/
-    :template: class.rst
-
-    ColumnSelect
-    IndexSubset
-
 Panel transformers
 ------------------
 


Test patch:
diff --git a/aeon/testing/test_config.py b/aeon/testing/test_config.py
index bf43eac7..718bb4ee 100644
--- a/aeon/testing/test_config.py
+++ b/aeon/testing/test_config.py
@@ -28,8 +28,8 @@ EXCLUDE_ESTIMATORS = [
     "ReverseAugmenter",
     "RandomSamplesAugmenter",
     "SqrtTransformer",
-    "ColumnSelect",
-    "IndexSubset",
+    "_ColumnSelect",
+    "_IndexSubset",
     "TimeSince",
     "Differencer",
     "CosineTransformer",
diff --git a/aeon/transformations/tests/test_compose.py b/aeon/transformations/tests/test_compose.py
index 4d84bdcc..09ca4989 100644
--- a/aeon/transformations/tests/test_compose.py
+++ b/aeon/transformations/tests/test_compose.py
@@ -12,6 +12,7 @@ from aeon.testing.mock_estimators import MockTransformer
 from aeon.testing.utils.deep_equals import deep_equals
 from aeon.testing.utils.estimator_checks import _assert_array_almost_equal
 from aeon.transformations._legacy._boxcox import _LogTransformer
+from aeon.transformations._legacy.subset import _ColumnSelect
 from aeon.transformations.collection.pad import PaddingTransformer
 from aeon.transformations.compose import (
     ColumnConcatenator,
@@ -21,7 +22,6 @@ from aeon.transformations.compose import (
     TransformerPipeline,
 )
 from aeon.transformations.impute import Imputer
-from aeon.transformations.subset import ColumnSelect
 from aeon.transformations.summarize import SummaryTransformer
 from aeon.transformations.theta import ThetaLinesTransformer
 
@@ -175,7 +175,7 @@ def test_pipeline_column_vectorization():
     """Test that pipelines vectorize properly over columns."""
     X = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
 
-    t = ColumnSelect([0, 1]) * ThetaLinesTransformer()
+    t = _ColumnSelect([0, 1]) * ThetaLinesTransformer()
 
     X_theta = t.fit_transform(X)