Repository: aeon-toolkit/aeon (python)

Issue:
[ENH] Consider changing `outlier_norm` default to `True` for Catch22 estimators.
### Describe the feature or idea you want to propose

Catch22 can take significantly longer to calculate based on the max value in the series. Higher values mean longer run time. The `outlier_norm` parameter mitigates this by normalising for the features responsible, but by default it is set to `False`.

### Describe your proposed solution

Evaluate the impact of the parameter for series with low/medium/high values. Based on results, decide whether to change the default or not.

### Describe alternatives you've considered, if relevant

_No response_

### Additional context

This parameter does not exist in the original publication, as all the series were normalised in the paper so this issue was not present.

Pull request:
[ENH] Set `outlier_norm` default to True for Catch22 estimators
#### Reference Issues/PRs
Fixes #2648

#### What does this implement/fix? Explain your changes.
sets the `outlier_norm` default to True for Catch22Clusterer 

Dataset for clustering:
the time series are scaled sine waves with added gaussian noise with 0 mean and variance = 0.1*scale
![image](https://github.com/user-attachments/assets/639a8a81-c0da-43da-ac34-ea9846794a7d)

Results for clustering:
We observe a significant increase in speed when `outlier_norm=True`
The `True` printed is the console tells us that the prediction on the fitted dataset in both cases is same
i.e. labels are same. (Which is expected since we are just normalizing the amplitudes)
![image](https://github.com/user-attachments/assets/51472d3f-a6bd-4123-801d-899c98780bc7)



#### Does your contribution introduce a new dependency? If yes, which one?


#### Any other comments?



### PR checklist



##### For all contributions
- [x] I've added myself to the [list of contributors](https://github.com/aeon-toolkit/aeon/blob/main/.all-contributorsrc). Alternatively, you can use the [@all-contributors](https://allcontributors.org/docs/en/bot/usage) bot to do this for you after the PR has been merged.
- [x] The PR title starts with either [ENH], [MNT], [DOC], [BUG], [REF], [DEP] or [GOV] indicating whether the PR topic is related to enhancement, maintenance, documentation, bugs, refactoring, deprecation or governance.

##### For new estimators and functions
- [ ] I've added the estimator/function to the online [API documentation](https://www.aeon-toolkit.org/en/latest/api_reference.html).
- [ ] (OPTIONAL) I've added myself as a `__maintainer__` at the top of relevant files and want to be contacted regarding its maintenance. Unmaintained files may be removed. This is for the full file, and you should not add yourself if you are just making minor changes or do not want to help maintain its contents.

##### For developers with write access
- [ ] (OPTIONAL) I've updated aeon's [CODEOWNERS](https://github.com/aeon-toolkit/aeon/blob/main/CODEOWNERS) to receive notifications about future changes to these files.


<!--
Thanks for contributing!
-->


Patch:
diff --git a/aeon/classification/feature_based/_catch22.py b/aeon/classification/feature_based/_catch22.py
index bec5deff..26a56d0a 100644
--- a/aeon/classification/feature_based/_catch22.py
+++ b/aeon/classification/feature_based/_catch22.py
@@ -43,8 +43,11 @@ class Catch22Classifier(BaseClassifier):
         true. If a List of specific features to extract is provided, "Mean" and/or
         "StandardDeviation" must be added to the List to extract these features.
     outlier_norm : bool, optional, default=False
-        Normalise each series during the two outlier Catch22 features, which can take a
-        while to process for large values.
+        If True, each time series is normalized during the computation of the two
+        outlier Catch22 features, which can take a while to process for large values
+        as it depends on the max value in the timseries. Note that this parameter
+        did not exist in the original publication/implementation as they used time
+        series that were already normalized.
     replace_nans : bool, default=True
         Replace NaN or inf values from the Catch22 transform with 0.
     use_pycatch22 : bool, default=False
@@ -136,7 +139,7 @@ class Catch22Classifier(BaseClassifier):
         self,
         features="all",
         catch24=True,
-        outlier_norm=False,
+        outlier_norm=True,
         replace_nans=True,
         use_pycatch22=False,
         estimator=None,
diff --git a/aeon/clustering/feature_based/_catch22.py b/aeon/clustering/feature_based/_catch22.py
index 33f0b79b..30fad7ff 100644
--- a/aeon/clustering/feature_based/_catch22.py
+++ b/aeon/clustering/feature_based/_catch22.py
@@ -42,9 +42,12 @@ class Catch22Clusterer(BaseClusterer):
         Extract the mean and standard deviation as well as the 22 Catch22 features if
         true. If a List of specific features to extract is provided, "Mean" and/or
         "StandardDeviation" must be added to the List to extract these features.
-    outlier_norm : bool, optional, default=False
-        Normalise each series during the two outlier Catch22 features, which can take a
-        while to process for large values.
+        outlier_norm : bool, optional, default=False
+            If True, each time series is normalized during the computation of the two
+            outlier Catch22 features, which can take a while to process for large values
+            as it depends on the max value in the timseries. Note that this parameter
+            did not exist in the original publication/implementation as they used
+            time series that were already normalized.
     replace_nans : bool, default=True
         Replace NaN or inf values from the Catch22 transform with 0.
     use_pycatch22 : bool, default=False
@@ -103,7 +106,7 @@ class Catch22Clusterer(BaseClusterer):
         self,
         features="all",
         catch24=True,
-        outlier_norm=False,
+        outlier_norm=True,
         replace_nans=True,
         use_pycatch22=False,
         estimator=None,
diff --git a/aeon/regression/feature_based/_catch22.py b/aeon/regression/feature_based/_catch22.py
index f669cbe8..1ab04ee6 100644
--- a/aeon/regression/feature_based/_catch22.py
+++ b/aeon/regression/feature_based/_catch22.py
@@ -43,8 +43,11 @@ class Catch22Regressor(BaseRegressor):
         True. If a List of specific features to extract is provided, "Mean" and/or
         "StandardDeviation" must be added to the List to extract these features.
     outlier_norm : bool, optional, default=False
-        Normalise each series during the two outlier Catch22 features, which can take a
-        while to process for large values.
+        If True, each time series is normalized during the computation of the two
+        outlier Catch22 features, which can take a while to process for large values
+        as it depends on the max value in the timseries. Note that this parameter
+        did not exist in the original publication/implementation as they used time
+        series that were already normalized.
     replace_nans : bool, optional, default=True
         Replace NaN or inf values from the Catch22 transform with 0.
     use_pycatch22 : bool, optional, default=False
@@ -110,7 +113,7 @@ class Catch22Regressor(BaseRegressor):
         self,
         features="all",
         catch24=True,
-        outlier_norm=False,
+        outlier_norm=True,
         replace_nans=True,
         use_pycatch22=False,
         estimator=None,
diff --git a/aeon/transformations/collection/feature_based/_catch22.py b/aeon/transformations/collection/feature_based/_catch22.py
index daae46f5..0431da8d 100644
--- a/aeon/transformations/collection/feature_based/_catch22.py
+++ b/aeon/transformations/collection/feature_based/_catch22.py
@@ -111,8 +111,11 @@ class Catch22(BaseCollectionTransformer):
         true. If a List of specific features to extract is provided, "Mean" and/or
         "StandardDeviation" must be added to the List to extract these features.
     outlier_norm : bool, optional, default=False
-        Normalise each series during the two outlier Catch22 features, which can take a
-        while to process for large values.
+        If True, each time series is normalized during the computation of the two
+        outlier Catch22 features, which can take a while to process for large values
+        as it depends on the max value in the timseries. Note that this parameter
+        did not exist in the original publication/implementation as they used time
+        series that were already normalized.
     replace_nans : bool, default=False
         Replace NaN or inf values from the Catch22 transform with 0.
     use_pycatch22 : bool, optional, default=False
@@ -163,7 +166,7 @@ class Catch22(BaseCollectionTransformer):
     [1.15639531e+00 1.31700577e+00 5.66227710e-01 2.00000000e+00
      3.89048349e-01 2.33853577e-01 1.00000000e+00 3.00000000e+00
      8.23045267e-03 0.00000000e+00 1.70859420e-01 2.00000000e+00
-     1.00000000e+00 2.00000000e-01 0.00000000e+00 1.10933565e-32
+     1.00000000e+00 7.00000000e-01 2.00000000e-01 1.10933565e-32
      4.00000000e+00 2.04319187e+00 0.00000000e+00 0.00000000e+00
      1.96349541e+00 5.51667002e-01]
     """
@@ -181,7 +184,7 @@ class Catch22(BaseCollectionTransformer):
         self,
         features="all",
         catch24=False,
-        outlier_norm=False,
+        outlier_norm=True,
         replace_nans=False,
         use_pycatch22=False,
         n_jobs=1,


Test patch:
diff --git a/aeon/transformations/collection/feature_based/tests/test_catch22.py b/aeon/transformations/collection/feature_based/tests/test_catch22.py
index 5b5bc289..9ebc6786 100644
--- a/aeon/transformations/collection/feature_based/tests/test_catch22.py
+++ b/aeon/transformations/collection/feature_based/tests/test_catch22.py
@@ -120,7 +120,7 @@ catch22_basic_motions_data = np.array(
             0.0616,
             1.0,
             0.5,
-            -0.2,
+            -0.2799,
             0.04,
             0.4158,
             4.0,
@@ -231,7 +231,7 @@ catch22_basic_motions_data = np.array(
             2.0,
             1.0,
             -0.11,
-            -0.72,
+            -0.81,
             1.7181,
             8.0,
             1.8142,
@@ -255,7 +255,7 @@ catch22_basic_motions_data = np.array(
             4.0,
             0.3333,
             -0.15,
-            0.03,
+            0.01,
             32.285,
             8.0,
             1.9501,
@@ -298,8 +298,8 @@ catch22_basic_motions_data = np.array(
             0.1303,
             3.0,
             0.3333,
-            -0.23,
-            -0.04,
+            -0.2299,
+            0.06,
             14.3938,
             5.0,
             2.0059,
@@ -320,8 +320,8 @@ catch22_basic_motions_data = np.array(
             0.1047,
             2.0,
             0.3333,
-            0.15,
-            -0.18,
+            0.06,
+            -0.235,
             7.1407,
             6.0,
             2.0097,
@@ -342,7 +342,7 @@ catch22_basic_motions_data = np.array(
             0.064,
             1.0,
             0.3333,
-            0.18,
+            0.20,
             0.3,
             1.6007,
             5.0,
@@ -365,7 +365,7 @@ catch22_basic_motions_data = np.array(
             2.0,
             0.3333,
             -0.14,
-            0.1,
+            -0.0399,
             7.3076,
             5.0,
             1.9736,
@@ -389,7 +389,7 @@ catch22_basic_motions_data = np.array(
             2.0,
             0.3333,
             -0.13,
-            0.02,
+            -0.3399,
             0.0081,
             5.0,
             2.133,
@@ -410,8 +410,8 @@ catch22_basic_motions_data = np.array(
             0.5715,
             2.0,
             1.0,
-            -0.12,
-            -0.02,
+            -0.1399,
+            -0.0099,
             0.1288,
             7.0,
             1.9505,
@@ -476,8 +476,8 @@ catch22_basic_motions_data = np.array(
             6.8497,
             2.0,
             0.3333,
-            -0.06,
-            0.05,
+            -0.0799,
+            0.03,
             0.0013,
             7.0,
             2.039,
@@ -498,8 +498,8 @@ catch22_basic_motions_data = np.array(
             3.1416,
             2.0,
             1.0,
-            -0.155,
-            0.125,
+            -0.1999,
+            0.1200,
             0.0212,
             7.0,
             1.8706,
@@ -522,7 +522,7 @@ catch22_basic_motions_data = np.array(
             0.1723,
             1.0,
             1.0,
-            -0.01,
+            -0.0799,
             -0.17,
             8.3186,
             5.0,
@@ -544,8 +544,8 @@ catch22_basic_motions_data = np.array(
             0.1222,
             1.0,
             1.0,
-            0.09,
-            0.01,
+            0.08,
+            -0.0099,
             5.3016,
             4.0,
             2.0075,
@@ -566,8 +566,8 @@ catch22_basic_motions_data = np.array(
             0.0841,
             2.0,
             0.5,
-            0.13,
-            -0.08,
+            -0.0199,
+            -0.1199,
             1.7627,
             5.0,
             2.1476,
@@ -611,7 +611,7 @@ catch22_basic_motions_data = np.array(
             1.0,
             0.5,
             -0.05,
-            -0.11,
+            -0.0999,
             0.2086,
             6.0,
             2.0597,
@@ -656,8 +656,8 @@ catch22_basic_motions_data = np.array(
             0.0718,
             1.0,
             0.3333,
-            0.03,
-            0.13,
+            0.025,
+            -0.1399,
             0.501,
             6.0,
             2.0492,
@@ -701,7 +701,7 @@ catch22_basic_motions_data = np.array(
             2.0,
             0.5,
             -0.13,
-            0.19,
+            0.29,
             0.3096,
             6.0,
             1.8881,
@@ -745,7 +745,7 @@ catch22_basic_motions_data = np.array(
             3.0,
             1.0,
             0.11,
-            0.35,
+            0.285,
             0.2719,
             7.0,
             1.7647,