Repository: sktime/sktime
Pull request #7330 (2024-10-24 18:36:57)

[ENH] refactor `InstanceSplitter` to a utility `apply_split` to apply an `sklearn` split to a time series collection
#### Reference Issues/PRs
Towards https://github.com/sktime/sktime/issues/7021 , see also https://github.com/sktime/sktime/issues/6852
https://github.com/sktime/sktime/issues/6708


#### What does this implement/fix? Explain your changes.
InstanceSplitter was unable to apply the same index to split X and y without throwing an error when X was a multi-index dataframe and y was a 1D array. This PR fixes this issue by generating plain indices for splitting 

#### Does your contribution introduce a new dependency? If yes, which one?
No

#### What should a reviewer concentrate their feedback on?
Function docstring and variable names

#### Did you add any tests for the change?
No

ksharma6: Ran into a `TypeError: len() of unsized object` that appears to be tied to 

```python
 y_loc = inst_ix[np.array(iloc_ix)
```

To reproduce:
```python
X_train, y_train = load_arrow_head(split="train", return_type="pd-multiindex")
splitter = InstanceSplitter(KFold(3))
iloc_x = splitter.split(X_train)

apply_split(X_train, iloc_x)
```
fkiraly: I think you want `.split(y_train)`, because otherwise `iloc_x` will have more instances than `X_train`?
ksharma6: Hi @fkiraly 

Starting with the Docstring, I believe this better captures what we need apply_split to do:

```python
def apply_split(y, iloc_ix):
    """Generates indices to apply split from indexer onto dataset.

    Parameters
    ----------
    y : sktime or compatible multiindex data container
    iloc_ix: 1D numpy array containing indices for splitting

    Yields
    ------
    y_iloc : 1D numpy array containing plain indices for splitting.
    """

How can this be improved/is there a standardized language/style I should be using when writing docstrings for sktime?
ksharma6: ```python
import pandas as pd
import numpy as np

def apply_split(y, iloc_ix):
"""Generates indices to apply split from indexer onto dataset.
Parameters
----------
y : sktime or compatible multiindex data container
iloc_ix: 1D numpy array containing indices for splitting
Returns
------
"""
    y_iloc : 1D numpy array containing plain indices for splitting.
    if not isinstance(y, pd.MultiIndex):
        zeros = [0] * len(y)
        y = pd.MultiIndex.from_arrays([zeros, y])

    inst_ix = y.droplevel(-1).unique()
    iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)

    y_loc = inst_ix[np.array(iloc_ix)]
    y_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_loc]
    y_iloc = np.concatenate(y_np)

    return y_iloc

from sktime.split.instance import InstanceSplitter
from sklearn.model_selection import KFold
from sktime.datasets import load_arrow_head

X_train, y_train = load_arrow_head(split= "Train", type = "multiindex")
splitter = InstanceSplitter(KFold(3))
iloc_ix = splitter.split(X_train)
#Iterate through generator object (used in InstanceSplitter._split() and will be used in evalute())
for y_train_inst_iloc, y_test_inst_iloc in splitter.split(X_train):
    y_train_iloc = apply_split(y, y_train_inst_iloc)

    print( y_train_iloc)
    break
```
ksharma6: **INPUTS to apply_split**:
y = y_train; 1d np array containing values 0, 1, or 2 of shape: (36,)
y_train_inst_iloc = an array of indices defined as [3012, 3013,...,9035]

**EXPECTED OUTPUT**
y_train_iloc = y[12:]

**Nature of the bug:**
IndexError: index 3012 is out of bounds for axis 0 with size 1

my y_train_inst_iloc is length 6024 while my y is length 36. I suspect I need to do some kind of a
conversion to make the indices work as intended. Since Kfold =3, I need the returned indices to be the
final 2 thirds of y... so y[12:]


**Last line that executes, w/ values of variables**
iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)
- y is a multiindex dataframe of len 36
([(0, '0'),
(0, '1'),
(0, '2'),...
(0, '0'),
(0, '1'),])


First line that breaks w/ values of variables
y_loc = inst_ix[np.array(iloc_ix)]
inst_ix: Index([0], dtype=
'int64')
iloc_ix: array of indices defined as [3012,...,9035]

**I am not entirely sure what y_loc should look like**


Do the values deviate from expectation?
No








fkiraly: Thanks!

Main comment is, I do not think your `y` satisfies the assumption of the function input contract. It should be in the format `pd-multiindex`, i.e., `pd.DataFrame` with row multiindex and additional assumptions as detailed in the data type API reference.

Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index f9ec09cba..7db6a11b5 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -181,6 +181,15 @@
         "test"
       ]
     },
+    {
+      "login": "jgyasu",
+      "name": "Jigyasu",
+      "avatar_url": "https://avatars.githubusercontent.com/u/94278611?s=400&u=19941ae4723ef841b3a3c7df996214efadc98c45&v=4",
+      "profile": "https://www.linkedin.com/in/jgyasu/",
+      "contributions": [
+        "code"
+      ]
+    },
     {
       "login": "jesellier",
       "name": "jesellier",
@@ -3251,10 +3260,19 @@
       ]
     },
     {
-      "login":"Adarsh2345",
-      "name":"Adarsh J",
-      "avatar_url":"https://avatars.githubusercontent.com/u/130629672?v=4",
-      "profile":"https://github.com/Adarsh2345",
+      "login": "y-mx",
+      "name": "Yimeng Xie",
+      "avatar_url": "https://avatars.githubusercontent.com/y-mx",
+      "profile": "https://github.com/y-mx",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "Adarsh2345",
+      "name": "Adarsh J",
+      "avatar_url": "https://avatars.githubusercontent.com/u/130629672?v=4",
+      "profile": "https://github.com/Adarsh2345",
       "contributions": [
          "doc"
       ]
@@ -3277,6 +3295,15 @@
         "doc",
         "code"
       ]
+    },
+    {
+      "login": "VjayRam",
+      "name": "Vijay Ram Enaganti",
+      "avatar_url": "https://avatars.githubusercontent.com/u/76694566?v=4",
+      "profile": "https://github.com/VjayRam",
+      "contributions": [
+        "doc"
+      ]
     }
   ]
 }
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 5d0c934c5..69fedd936 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -6,7 +6,7 @@ Contributors
 <!-- Please add your badges to .all-contibutorsrc -->
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-322-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-324-orange.svg)](#contributors)
 <!-- ALL-CONTRIBUTORS-BADGE:END -->
 
 This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
@@ -174,6 +174,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
     </tr>
     <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/javiber"><img src="https://avatars.githubusercontent.com/u/3588715?v=4?s=100" width="100px;" alt="Javier Berneche"/><br /><sub><b>Javier Berneche</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=javiber" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=javiber" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/jgyasu/"><img src="https://avatars.githubusercontent.com/u/94278611?s=400&u=19941ae4723ef841b3a3c7df996214efadc98c45&v=4?s=100" width="100px;" alt="Jigyasu"/><br /><sub><b>Jigyasu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jgyasu" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Z-Fran"><img src="https://avatars.githubusercontent.com/u/49083766?v=4?s=100" width="100px;" alt="Jindong Zhang"/><br /><sub><b>Jindong Zhang</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Z-Fran" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tajir0"><img src="https://avatars.githubusercontent.com/u/36022362?s=100" width="100px;" alt="Jinrong Tang"/><br /><sub><b>Jinrong Tang</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tajir0" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=tajir0" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pirnerjonas"><img src="https://avatars.githubusercontent.com/u/48887249?v=4?s=100" width="100px;" alt="Jonas Pirner"/><br /><sub><b>Jonas Pirner</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pirnerjonas" title="Documentation">📖</a></td>
@@ -181,9 +182,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jorenham"><img src="?s=100" width="100px;" alt="Joren Hammudoglu"/><br /><sub><b>Joren Hammudoglu</b></sub></a><br /><a href="#infra-jorenham" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://juanitorduz.github.io/"><img src="https://avatars1.githubusercontent.com/u/22996444?v=4?s=100" width="100px;" alt="Juan Orduz"/><br /><sub><b>Juan Orduz</b></sub></a><br /><a href="#tutorial-juanitorduz" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/commits?author=juanitorduz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/julia-kraus"><img src="https://avatars.githubusercontent.com/julia-kraus?s=100" width="100px;" alt="Julia Kraus"/><br /><sub><b>Julia Kraus</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/jelc53"><img src="?s=100" width="100px;" alt="Julian Cooper"/><br /><sub><b>Julian Cooper</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jelc53" title="Code">💻</a> <a href="#ideas-jelc53" title="Ideas, Planning, & Feedback">🤔</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/jelc53"><img src="?s=100" width="100px;" alt="Julian Cooper"/><br /><sub><b>Julian Cooper</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jelc53" title="Code">💻</a> <a href="#ideas-jelc53" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/helloplayer1"><img src="https://avatars.githubusercontent.com/u/32032467?v=4?s=100" width="100px;" alt="Julian Haderlein"/><br /><sub><b>Julian Haderlein</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=helloplayer1" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/julnow"><img src="https://avatars.githubusercontent.com/u/21206185?v=4?s=100" width="100px;" alt="Julian Nowak"/><br /><sub><b>Julian Nowak</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ajulnow" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=julnow" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/julianarn/"><img src="https://avatars.githubusercontent.com/u/19613567?v=4?s=100" width="100px;" alt="Juliana"/><br /><sub><b>Juliana</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=julramos" title="Code">💻</a></td>
@@ -192,9 +193,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kcc-lion"><img src="?s=100" width="100px;" alt="Kai Lion"/><br /><sub><b>Kai Lion</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kanand77"><img src="https://avatars.githubusercontent.com/kanand77?s=100" width="100px;" alt="Kavin Anand"/><br /><sub><b>Kavin Anand</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kanand77" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://kejsitake.com/"><img src="https://avatars.githubusercontent.com/u/23707808?v=4?s=100" width="100px;" alt="Kejsi Take"/><br /><sub><b>Kejsi Take</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kejsitake" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/kevinlam2"><img src="https://avatars.githubusercontent.com/u/114420932?s=400&v=4?s=100" width="100px;" alt="Kevin Lam"/><br /><sub><b>Kevin Lam</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Code">💻</a> <a href="#example-klam-data" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/kevinlam2"><img src="https://avatars.githubusercontent.com/u/114420932?s=400&v=4?s=100" width="100px;" alt="Kevin Lam"/><br /><sub><b>Kevin Lam</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Code">💻</a> <a href="#example-klam-data" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kirilral"><img src="https://avatars.githubusercontent.com/u/34281484?v=4?s=100" width="100px;" alt="Kiril Ralinovski"/><br /><sub><b>Kiril Ralinovski</b></sub></a><br /><a href="#ideas-kirilral" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-kirilral" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-kirilral" title="Project Management">📆</a> <a href="#talk-kirilral" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://whitakerlab.github.io/"><img src="https://avatars1.githubusercontent.com/u/3626306?v=4?s=100" width="100px;" alt="Kirstie Whitaker"/><br /><sub><b>Kirstie Whitaker</b></sub></a><br /><a href="#ideas-KirstieJane" title="Ideas, Planning, & Feedback">🤔</a> <a href="#fundingFinding-KirstieJane" title="Funding Finding">🔍</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kishmanani"><img src="https://avatars.githubusercontent.com/u/30973056?v=4?s=100" width="100px;" alt="Kishan Manani"/><br /><sub><b>Kishan Manani</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AKishManani" title="Bug reports">🐛</a> <a href="#ideas-KishManani" title="Ideas, Planning, & Feedback">🤔</a></td>
@@ -203,9 +204,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/koralturkk"><img src="https://avatars2.githubusercontent.com/u/18037789?s=460&v=4?s=100" width="100px;" alt="Kutay Koralturk"/><br /><sub><b>Kutay Koralturk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=koralturkk" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akoralturkk" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ltsaprounis"><img src="https://avatars.githubusercontent.com/u/64217214?v=4?s=100" width="100px;" alt="Leonidas Tsaprounis"/><br /><sub><b>Leonidas Tsaprounis</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ltsaprounis" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Altsaprounis" title="Bug reports">🐛</a> <a href="#mentoring-ltsaprounis" title="Mentoring">🧑‍🏫</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Altsaprounis" title="Reviewed Pull Requests">👀</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lielleravid"><img src="https://avatars.githubusercontent.com/u/37774194?v=4?s=100" width="100px;" alt="Lielle Ravid"/><br /><sub><b>Lielle Ravid</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/chillerobscuro"><img src="https://avatars.githubusercontent.com/u/5232872?v=4?s=100" width="100px;" alt="Logan Duffy"/><br /><sub><b>Logan Duffy</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Achillerobscuro" title="Bug reports">🐛</a> <a href="#ideas-chillerobscuro" title="Ideas, Planning, & Feedback">🤔</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/chillerobscuro"><img src="https://avatars.githubusercontent.com/u/5232872?v=4?s=100" width="100px;" alt="Logan Duffy"/><br /><sub><b>Logan Duffy</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Achillerobscuro" title="Bug reports">🐛</a> <a href="#ideas-chillerobscuro" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://lpantano.github.io/"><img src="https://avatars2.githubusercontent.com/u/1621788?v=4?s=100" width="100px;" alt="Lorena Pantano"/><br /><sub><b>Lorena Pantano</b></sub></a><br /><a href="#ideas-lpantano" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ltoniazzi"><img src="https://avatars.githubusercontent.com/u/61414566?s=100" width="100px;" alt="Lorenzo Toniazzi"/><br /><sub><b>Lorenzo Toniazzi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ltoniazzi" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Lovkush-A"><img src="https://avatars.githubusercontent.com/u/25344832?v=4?s=100" width="100px;" alt="Lovkush"/><br /><sub><b>Lovkush</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Lovkush-A" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Lovkush-A" title="Tests">⚠️</a> <a href="#ideas-Lovkush-A" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-Lovkush-A" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-Lovkush-A" title="Project Management">📆</a></td>
@@ -214,9 +215,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/luiszugasti"><img src="https://avatars.githubusercontent.com/u/11198457?s=460&u=0645b72683e491824aca16db9702f1d3eb990389&v=4?s=100" width="100px;" alt="Luis Zugasti"/><br /><sub><b>Luis Zugasti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=luiszugasti" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lmmentel"><img src="https://avatars.githubusercontent.com/u/8989838?v=4?s=100" width="100px;" alt="Lukasz Mentel"/><br /><sub><b>Lukasz Mentel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Documentation">📖</a> <a href="#infra-lmmentel" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Almmentel" title="Bug reports">🐛</a> <a href="#maintenance-lmmentel" title="Maintenance">🚧</a> <a href="#mentoring-lmmentel" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/madhuri-agarwal-166080209/"><img src="https://avatars.githubusercontent.com/u/108001973?v=4&size=64?s=100" width="100px;" alt="Madhuri"/><br /><sub><b>Madhuri</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=madhuri723" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/manuel-munoz-aguirre"><img src="https://avatars.githubusercontent.com/u/5576458?v=4?s=100" width="100px;" alt="Manuel Muñoz Aguirre"/><br /><sub><b>Manuel Muñoz Aguirre</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manuel-munoz-aguirre" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/manuel-munoz-aguirre"><img src="https://avatars.githubusercontent.com/u/5576458?v=4?s=100" width="100px;" alt="Manuel Muñoz Aguirre"/><br /><sub><b>Manuel Muñoz Aguirre</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manuel-munoz-aguirre" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/manolotis"><img src="https://avatars.githubusercontent.com/manolotis?s=100" width="100px;" alt="Manuel Muñoz Sánchez"/><br /><sub><b>Manuel Muñoz Sánchez</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manolotis" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/marrov"><img src="https://avatars.githubusercontent.com/u/54272586?v=4?s=100" width="100px;" alt="Marc Rovira"/><br /><sub><b>Marc Rovira</b></sub></a><br /><a href="#design-marrov" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/commits?author=marrov" title="Documentation">📖</a> <a href="#ideas-marrov" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-marrov" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-marrov" title="Project Management">📆</a> <a href="#talk-marrov" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://marcelotryle.com"><img src="https://avatars3.githubusercontent.com/u/7353520?v=4?s=100" width="100px;" alt="Marcelo Trylesinski"/><br /><sub><b>Marcelo Trylesinski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Kludex" title="Documentation">📖</a></td>
@@ -225,9 +226,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mariamjabara"><img src="?s=100" width="100px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mariamjabara" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://twitter.com/marielli"><img src="https://avatars2.githubusercontent.com/u/13499809?v=4?s=100" width="100px;" alt="Marielle"/><br /><sub><b>Marielle</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Code">💻</a> <a href="#ideas-marielledado" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mloning"><img src="https://avatars3.githubusercontent.com/u/21020482?v=4?s=100" width="100px;" alt="Markus Löning"/><br /><sub><b>Markus Löning</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mloning" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Tests">⚠️</a> <a href="#maintenance-mloning" title="Maintenance">🚧</a> <a href="#platform-mloning" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amloning" title="Reviewed Pull Requests">👀</a> <a href="#infra-mloning" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#example-mloning" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amloning" title="Bug reports">🐛</a> <a href="#tutorial-mloning" title="Tutorials">✅</a> <a href="#business-mloning" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Documentation">📖</a> <a href="#design-mloning" title="Design">🎨</a> <a href="#eventOrganizing-mloning" title="Event Organizing">📋</a> <a href="#fundingFinding-mloning" title="Funding Finding">🔍</a> <a href="#ideas-mloning" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-mloning" title="Project Management">📆</a> <a href="#question-mloning" title="Answering Questions">💬</a> <a href="#talk-mloning" title="Talks">📢</a> <a href="#mentoring-mloning" title="Mentoring">🧑‍🏫</a> <a href="#video-mloning" title="Videos">📹</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/markussagen"><img src="https://avatars.githubusercontent.com/u/20767068?v=4?s=100" width="100px;" alt="Markus Sagen"/><br /><sub><b>Markus Sagen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=markussagen" title="Code">💻</a> <a href="#example-markussagen" title="Examples">💡</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/markussagen"><img src="https://avatars.githubusercontent.com/u/20767068?v=4?s=100" width="100px;" alt="Markus Sagen"/><br /><sub><b>Markus Sagen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=markussagen" title="Code">💻</a> <a href="#example-markussagen" title="Examples">💡</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/martin-walter-1a33b3114/"><img src="https://avatars0.githubusercontent.com/u/29627036?v=4?s=100" width="100px;" alt="Martin Walter"/><br /><sub><b>Martin Walter</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=aiwalter" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Aaiwalter" title="Bug reports">🐛</a> <a href="#projectManagement-aiwalter" title="Project Management">📆</a> <a href="#fundingFinding-aiwalter" title="Funding Finding">🔍</a> <a href="#mentoring-aiwalter" title="Mentoring">🧑‍🏫</a> <a href="#ideas-aiwalter" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-aiwalter" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Aaiwalter" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=aiwalter" title="Documentation">📖</a> <a href="#talk-aiwalter" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/martinagvilas"><img src="https://avatars2.githubusercontent.com/u/37339384?v=4?s=100" width="100px;" alt="Martina G. Vilas"/><br /><sub><b>Martina G. Vilas</b></sub></a><br /><a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amartinagvilas" title="Reviewed Pull Requests">👀</a> <a href="#ideas-martinagvilas" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mateuszkasprowicz"><img src="https://avatars.githubusercontent.com/mateuszkasprowicz?s=100" width="100px;" alt="Mateusz Kasprowicz"/><br /><sub><b>Mateusz Kasprowicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Tests">⚠️</a></td>
@@ -236,9 +237,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tvdboom"><img src="https://avatars.githubusercontent.com/u/32366550?v=4?s=100" width="100px;" alt="Mavs"/><br /><sub><b>Mavs</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tvdboom" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/maxfrohlich/"><img src="https://avatars.githubusercontent.com/u/16393653?v=4?s=100" width="100px;" alt="Max Frohlich"/><br /><sub><b>Max Frohlich</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ninedigits" title="Code">💻</a> <a href="#ideas-ninedigits" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-ninedigits" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/solen0id"><img src="https://avatars.githubusercontent.com/u/20767606?v=4?s=100" width="100px;" alt="Max Patzelt"/><br /><sub><b>Max Patzelt</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=solen0id" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/meraldoantonio"><img src="https://avatars.githubusercontent.com/u/37468543?v=4?s=100" width="100px;" alt="Meraldo Antonio"/><br /><sub><b>Meraldo Antonio</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ameraldoantonio" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/meraldoantonio"><img src="https://avatars.githubusercontent.com/u/37468543?v=4?s=100" width="100px;" alt="Meraldo Antonio"/><br /><sub><b>Meraldo Antonio</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ameraldoantonio" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Hephaest"><img src="https://avatars2.githubusercontent.com/u/37981444?v=4?s=100" width="100px;" alt="Miao Cai"/><br /><sub><b>Miao Cai</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AHephaest" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Hephaest" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="michaelfeil.eu"><img src="https://avatars.githubusercontent.com/u/63565275?v=4?s=100" width="100px;" alt="Michael Feil"/><br /><sub><b>Michael Feil</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Tests">⚠️</a> <a href="#ideas-michaelfeil" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mgazian000"><img src="https://avatars.githubusercontent.com/mgazian000?s=100" width="100px;" alt="Michael Gaziani"/><br /><sub><b>Michael Gaziani</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgazian000" title="Documentation">📖</a></td>
@@ -247,9 +248,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mjste"><img src="https://avatars.githubusercontent.com/mjste?s=100" width="100px;" alt="Michał Stefanik"/><br /><sub><b>Michał Stefanik</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mjste" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mk406"><img src="https://avatars.githubusercontent.com/u/78024411?v=4?s=100" width="100px;" alt="Miguel Krause"/><br /><sub><b>Miguel Krause</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mk406" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/miraep8"><img src="https://avatars.githubusercontent.com/u/10511777?s=400&u=10a774fd4be767fa3b23a82a98bbfe102c17f0f3&v=4?s=100" width="100px;" alt="Mirae Parker"/><br /><sub><b>Mirae Parker</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/MBristle"><img src="https://avatars.githubusercontent.com/MBristle?s=100" width="100px;" alt="Mirko Bristle"/><br /><sub><b>Mirko Bristle</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMBristle" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/MBristle"><img src="https://avatars.githubusercontent.com/MBristle?s=100" width="100px;" alt="Mirko Bristle"/><br /><sub><b>Mirko Bristle</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMBristle" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://mo-saif.github.io/"><img src="https://avatars0.githubusercontent.com/u/27867617?v=4?s=100" width="100px;" alt="Mohammed Saif Kazamel"/><br /><sub><b>Mohammed Saif Kazamel</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMo-Saif" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://moradabaz.github.io/"><img src="https://avatars.githubusercontent.com/u/29915156?v=4?s=100" width="100px;" alt="Morad :)"/><br /><sub><b>Morad :)</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/skinan"><img src="https://avatars.githubusercontent.com/skinan?s=100" width="100px;" alt="Muhammad Sakib Khan Inan"/><br /><sub><b>Muhammad Sakib Khan Inan</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=skinan" title="Documentation">📖</a></td>
@@ -258,9 +259,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/niekvanderlaan"><img src="https://avatars.githubusercontent.com/u/9962825?v=4?s=100" width="100px;" alt="Niek van der Laan"/><br /><sub><b>Niek van der Laan</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=niekvanderlaan" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Dehelaan"><img src="https://avatars.githubusercontent.com/u/120308161?s=400&v=4?s=100" width="100px;" alt="Nihal Chaudhary"/><br /><sub><b>Nihal Chaudhary</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Dehelaan" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=100" width="100px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/nshahpazov/"><img src="https://avatars.githubusercontent.com/nshahpazov?s=100" width="100px;" alt="Nikola Shahpazov"/><br /><sub><b>Nikola Shahpazov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nshahpazov" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/nshahpazov/"><img src="https://avatars.githubusercontent.com/nshahpazov?s=100" width="100px;" alt="Nikola Shahpazov"/><br /><sub><b>Nikola Shahpazov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nshahpazov" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/nilesh05apr"><img src="https://avatars.githubusercontent.com/u/65773314?v=4?s=100" width="100px;" alt="Nilesh Kumar"/><br /><sub><b>Nilesh Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nilesh05apr" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ninfueng"><img src="https://avatars2.githubusercontent.com/u/28499769?v=4?s=100" width="100px;" alt="Ninnart Fuengfusin"/><br /><sub><b>Ninnart Fuengfusin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ninfueng" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/NoaBenAmi"><img src="https://avatars.githubusercontent.com/u/37590002?v=4?s=100" width="100px;" alt="Noa Ben Ami"/><br /><sub><b>Noa Ben Ami</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Documentation">📖</a></td>
@@ -269,9 +270,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/olivermatthews"><img src="https://avatars.githubusercontent.com/u/31141490?v=4?s=100" width="100px;" alt="Oliver Matthews"/><br /><sub><b>Oliver Matthews</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=OliverMatthews" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=100" width="100px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Code">💻</a> <a href="#design-prockenschaub" title="Design">🎨</a> <a href="#ideas-prockenschaub" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=100" width="100px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://ber.gp"><img src="https://avatars1.githubusercontent.com/u/9824244?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Pangoraw" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://ber.gp"><img src="https://avatars1.githubusercontent.com/u/9824244?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Pangoraw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/paulyim97/"><img src="https://avatars.githubusercontent.com/pyyim?s=100" width="100px;" alt="Paul Yim"/><br /><sub><b>Paul Yim</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Code">💻</a> <a href="#example-pyyim" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.imes.uni-hannover.de/de/institut/team/m-sc-karl-philipp-kortmann/"><img src="https://avatars.githubusercontent.com/u/20466981?v=4?s=100" width="100px;" alt="Philipp Kortmann"/><br /><sub><b>Philipp Kortmann</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MrPr3ntice" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MrPr3ntice" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Piyush1729"><img src="https://avatars2.githubusercontent.com/u/64950012?v=4?s=100" width="100px;" alt="Piyush Gade"/><br /><sub><b>Piyush Gade</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Piyush1729" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3APiyush1729" title="Reviewed Pull Requests">👀</a></td>
@@ -280,9 +281,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Prtm2110"><img src="https://avatars.githubusercontent.com/u/139000226?s=400&u=a2ef29514ad2780d1263ba9d724898132c8d18fb&v=4?s=100" width="100px;" alt="Pratham Hole"/><br /><sub><b>Pratham Hole</b></sub></a><br /><a href="#maintenance-Prtm2110" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=100" width="100px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=100" width="100px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=100" width="100px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ram0nB"><img src="https://avatars.githubusercontent.com/u/45173421?s=100" width="100px;" alt="Ramon Bussing"/><br /><sub><b>Ramon Bussing</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ARam0nB" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RavenRudi"><img src="https://avatars.githubusercontent.com/u/46402968?v=4?s=100" width="100px;" alt="RavenRudi"/><br /><sub><b>RavenRudi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RavenRudi" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wolph"><img src="?s=100" width="100px;" alt="Rick van Hattem"/><br /><sub><b>Rick van Hattem</b></sub></a><br /><a href="#infra-wolph" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
@@ -291,9 +292,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/VectorNd"><img src="https://avatars.githubusercontent.com/u/111004091?v=4?s=100" width="100px;" alt="Rishabh Kamboj"/><br /><sub><b>Rishabh Kamboj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VectorNd" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RishiKumarRay"><img src="https://avatars.githubusercontent.com/u/87641376?v=4?s=100" width="100px;" alt="Rishi Kumar Ray"/><br /><sub><b>Rishi Kumar Ray</b></sub></a><br /><a href="#infra-RishiKumarRay" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Riyabelle25"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Riyabelle25"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://linkedin.com/in/robert-kuebler"><img src="https://avatars.githubusercontent.com/u/932327?v=4?s=100" width="100px;" alt="Robert Kübler"/><br /><sub><b>Robert Kübler</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AGarve" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Garve" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/romanlutz/"><img src="https://avatars.githubusercontent.com/u/10245648?v=4?s=100" width="100px;" alt="Roman Lutz"/><br /><sub><b>Roman Lutz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=romanlutz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ronnie-llamado"><img src="https://avatars.githubusercontent.com/ronnie-llamado?s=100" width="100px;" alt="Ronnie Llamado"/><br /><sub><b>Ronnie Llamado</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ronnie-llamado" title="Documentation">📖</a></td>
@@ -302,9 +303,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SaiRevanth25"><img src="https://avatars.githubusercontent.com/SaiRevanth25?s=100" width="100px;" alt="Sai Revanth Gowravajhala"/><br /><sub><b>Sai Revanth Gowravajhala</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SaiRevanth25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ASaiRevanth25" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://sajay.online"><img src="https://avatars2.githubusercontent.com/u/25329624?v=4?s=100" width="100px;" alt="Sajaysurya Ganesh"/><br /><sub><b>Sajaysurya Ganesh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Documentation">📖</a> <a href="#design-sajaysurya" title="Design">🎨</a> <a href="#example-sajaysurya" title="Examples">💡</a> <a href="#ideas-sajaysurya" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Tests">⚠️</a> <a href="#tutorial-sajaysurya" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamiAlavi"><img src="https://avatars.githubusercontent.com/u/32700289?v=4?s=100" width="100px;" alt="Sami Alavi"/><br /><sub><b>Sami Alavi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamiAlavi" title="Code">💻</a> <a href="#maintenance-SamiAlavi" title="Maintenance">🚧</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamruddhiNavale"><img src="https://avatars.githubusercontent.com/u/86359115?v=4?s=100" width="100px;" alt="Samruddhi Navale"/><br /><sub><b>Samruddhi Navale</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamruddhiNavale" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamruddhiNavale"><img src="https://avatars.githubusercontent.com/u/86359115?v=4?s=100" width="100px;" alt="Samruddhi Navale"/><br /><sub><b>Samruddhi Navale</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamruddhiNavale" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sanjayk0508"><img src="https://avatars.githubusercontent.com/u/102804548?v=4?s=100" width="100px;" alt="Sanjay Kumar"/><br /><sub><b>Sanjay Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sanjayk0508" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/deysanjeeb"><img src="https://avatars.githubusercontent.com/u/39940629?v=4?s=100" width="100px;" alt="Sanjeeb Dey"/><br /><sub><b>Sanjeeb Dey</b></sub></a><br /><a href="#maintenance-deysanjeeb" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sssilvar"><img src="https://avatars.githubusercontent.com/u/16252054?v=4?s=100" width="100px;" alt="Santiago Smith Silva"/><br /><sub><b>Santiago Smith Silva</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sssilvar" title="Code">💻</a></td>
@@ -313,9 +314,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/satya-pattnaik-77a430144/"><img src="https://avatars.githubusercontent.com/u/22102468?v=4?s=100" width="100px;" alt="Satya Prakash Pattnaik"/><br /><sub><b>Satya Prakash Pattnaik</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=satya-pattnaik" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/dasgupsa"><img src="https://avatars2.githubusercontent.com/u/10398956?v=4?s=100" width="100px;" alt="Saurabh Dasgupta"/><br /><sub><b>Saurabh Dasgupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=dasgupsa" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SebasKoel"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="Sebastiaan Koel"/><br /><sub><b>Sebastiaan Koel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=100" width="100px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=shagn" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=100" width="100px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=shagn" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bastisar"><img src="https://avatars.githubusercontent.com/u/142449680?v=4?s=100" width="100px;" alt="Sebastian Hien"/><br /><sub><b>Sebastian Hien</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Abastisar" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShivamPathak99"><img src="https://avatars.githubusercontent.com/u/98941325?s=400&v=4?s=100" width="100px;" alt="Shivam Pathak"/><br /><sub><b>Shivam Pathak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ShivamPathak99" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShivamJ07"><img src="https://avatars.githubusercontent.com/ShivamJ07?s=100" width="100px;" alt="Shivam Singal"/><br /><sub><b>Shivam Singal</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AShivamJ07" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ShivamJ07" title="Code">💻</a></td>
@@ -324,9 +325,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShreeshaM07"><img src="https://avatars.githubusercontent.com/u/120820143?s=400&v=4?s=100" width="100px;" alt="Shreesha M"/><br /><sub><b>Shreesha M</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AShreeshaM07" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sbuse"><img src="https://avatars.githubusercontent.com/u/24408707?v=4?s=100" width="100px;" alt="Simon B."/><br /><sub><b>Simon B.</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sbuse" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/slavik57"><img src="https://avatars.githubusercontent.com/u/6184997?v=4?s=100" width="100px;" alt="Slava Shpitalny"/><br /><sub><b>Slava Shpitalny</b></sub></a><br /><a href="#maintenance-slavik57" title="Maintenance">🚧</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Sohaib-Ahmed21"><img src="https://avatars.githubusercontent.com/Sohaib-Ahmed21?s=100" width="100px;" alt="Sohaib Ahmed"/><br /><sub><b>Sohaib Ahmed</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Sohaib-Ahmed21" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Sohaib-Ahmed21"><img src="https://avatars.githubusercontent.com/Sohaib-Ahmed21?s=100" width="100px;" alt="Sohaib Ahmed"/><br /><sub><b>Sohaib Ahmed</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Sohaib-Ahmed21" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/solomon-botchway-a1383821b/"><img src="https://avatars.githubusercontent.com/u/62394255?v=4?s=100" width="100px;" alt="Solomon Botchway"/><br /><sub><b>Solomon Botchway</b></sub></a><br /><a href="#maintenance-snnbotchway" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/khrapovs"><img src="https://avatars.githubusercontent.com/u/3774663?v=4?s=100" width="100px;" alt="Stanislav Khrapov"/><br /><sub><b>Stanislav Khrapov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=khrapovs" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/steenrotsman"><img src="https://avatars.githubusercontent.com/u/78110080?s=400&v=4?s=100" width="100px;" alt="Stijn J. Rotman"/><br /><sub><b>Stijn J. Rotman</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Documentation">📖</a></td>
@@ -335,9 +336,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Taise228"><img src="https://avatars.githubusercontent.com/u/95762401?s=400&v=4?s=100" width="100px;" alt="Taisei Yamamoto"/><br /><sub><b>Taisei Yamamoto</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Taise228" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://thayeylolu.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/13348874?v=4?s=100" width="100px;" alt="Taiwo Owoseni"/><br /><sub><b>Taiwo Owoseni</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=thayeylolu" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lnthach"><img src="https://avatars0.githubusercontent.com/u/7788363?v=4?s=100" width="100px;" alt="Thach Le Nguyen"/><br /><sub><b>Thach Le Nguyen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mathco-wf"><img src="https://avatars.githubusercontent.com/mathco-wf?s=100" width="100px;" alt="TheMathcompay Widget Factory Team"/><br /><sub><b>TheMathcompay Widget Factory Team</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mathco-wf" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mathco-wf"><img src="https://avatars.githubusercontent.com/mathco-wf?s=100" width="100px;" alt="TheMathcompay Widget Factory Team"/><br /><sub><b>TheMathcompay Widget Factory Team</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mathco-wf" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tombh"><img src="https://avatars.githubusercontent.com/u/160835?s=80&v=4?s=100" width="100px;" alt="Thomas Buckley-Houston"/><br /><sub><b>Thomas Buckley-Houston</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atombh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xxl4tomxu98"><img src="https://avatars.githubusercontent.com/u/62292177?s=40&v=4?s=100" width="100px;" alt="Tom Xu"/><br /><sub><b>Tom Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tpvasconcelos"><img src="https://avatars.githubusercontent.com/u/17701527?v=4?s=100" width="100px;" alt="Tomas P. de Vasconcelos"/><br /><sub><b>Tomas P. de Vasconcelos</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atpvasconcelos" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=tpvasconcelos" title="Code">💻</a></td>
@@ -346,9 +347,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/onyekaugochukwu"><img src="https://avatars.githubusercontent.com/u/92909501?v=4?s=100" width="100px;" alt="Ugochukwu Onyeka"/><br /><sub><b>Ugochukwu Onyeka</b></sub></a><br /><a href="#business-onyekaugochukwu" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=onyekaugochukwu" title="Documentation">📖</a> <a href="#ideas-onyekaugochukwu" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-onyekaugochukwu" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-onyekaugochukwu" title="Project Management">📆</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/utsavcoding"><img src="https://avatars3.githubusercontent.com/u/55446385?v=4?s=100" width="100px;" alt="Utsav Kumar Tiwari"/><br /><sub><b>Utsav Kumar Tiwari</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vagechirkov"><img src="https://avatars.githubusercontent.com/vagechirkov?s=100" width="100px;" alt="Valerii Chirkov"/><br /><sub><b>Valerii Chirkov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vagechirkov" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vagechirkov" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/vandit98"><img src="https://avatars.githubusercontent.com/u/91458535?v=4?s=100" width="100px;" alt="Vandit Tyagi"/><br /><sub><b>Vandit Tyagi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vandit98" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/vandit98"><img src="https://avatars.githubusercontent.com/u/91458535?v=4?s=100" width="100px;" alt="Vandit Tyagi"/><br /><sub><b>Vandit Tyagi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vandit98" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Vasudeva-bit"><img src="https://avatars.githubusercontent.com/u/70791259?v=4?s=100" width="100px;" alt="Vasudeva Kilaru"/><br /><sub><b>Vasudeva Kilaru</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedantag17"><img src="https://avatars.githubusercontent.com/u/118207011?v=4?s=100" width="100px;" alt="Vedant Agrawal"/><br /><sub><b>Vedant Agrawal</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedantag17" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jgyfutub"><img src="https://avatars.githubusercontent.com/u/97391064?s=400&v=4?s=100" width="100px;" alt="Vedant Pandey"/><br /><sub><b>Vedant Pandey</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jgyfutub" title="Code">💻</a></td>
@@ -357,9 +358,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vnicholson1"><img src="?s=100" width="100px;" alt="Vincent Nicholson"/><br /><sub><b>Vincent Nicholson</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vnicholson1" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/VyomkeshVyas"><img src="?s=100" width="100px;" alt="Vyomkesh Vyas"/><br /><sub><b>Vyomkesh Vyas</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Documentation">📖</a> <a href="#example-VyomkeshVyas" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wayneadams"><img src="https://avatars.githubusercontent.com/u/15034841?s=400&u=d717e9945910bcc844c5e64cd56d570c6cc4e8e6&v=4?s=100" width="100px;" alt="Wayne Adams"/><br /><sub><b>Wayne Adams</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wayneadams" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/fr1ll"><img src="https://avatars.githubusercontent.com/u/29168593?v=4?s=100" width="100px;" alt="Will Sanger"/><br /><sub><b>Will Sanger</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/fr1ll"><img src="https://avatars.githubusercontent.com/u/29168593?v=4?s=100" width="100px;" alt="Will Sanger"/><br /><sub><b>Will Sanger</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/templierw/"><img src="https://github.com/templierw.png?s=100" width="100px;" alt="William Templier"/><br /><sub><b>William Templier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=templierw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/magittan"><img src="https://avatars0.githubusercontent.com/u/14024202?v=4?s=100" width="100px;" alt="William Zheng"/><br /><sub><b>William Zheng</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=magittan" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=magittan" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wirrywoo"><img src="https://avatars.githubusercontent.com/u/148647848?v=4?s=100?s=100" width="100px;" alt="Wilson Cheung"/><br /><sub><b>Wilson Cheung</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Documentation">📖</a></td>
@@ -368,20 +369,21 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yairbeer"><img src="https://avatars.githubusercontent.com/yairbeer?s=100" width="100px;" alt="Yair Beer"/><br /><sub><b>Yair Beer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yairbeer" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/yann-hallouard/"><img src="https://avatars.githubusercontent.com/YHallouard?s=100" width="100px;" alt="Yann Hallouard"/><br /><sub><b>Yann Hallouard</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MEMEO-PRO"><img src="https://avatars.githubusercontent.com/memeo-pro?s=100" width="100px;" alt="Yash Edake"/><br /><sub><b>Yash Edake</b></sub></a><br /><a href="#maintenance-memeo-pro" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amemeo-pro" title="Bug reports">🐛</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/YashKhare20"><img src="https://avatars.githubusercontent.com/u/92680366?s=400?s=100" width="100px;" alt="Yash Khare"/><br /><sub><b>Yash Khare</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/YashKhare20"><img src="https://avatars.githubusercontent.com/u/92680366?s=400?s=100" width="100px;" alt="Yash Khare"/><br /><sub><b>Yash Khare</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yashlamba"><img src="https://avatars.githubusercontent.com/u/44164398?v=4?s=100" width="100px;" alt="Yash Lamba"/><br /><sub><b>Yash Lamba</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yashlamba" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=100" width="100px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/y-mx"><img src="https://avatars.githubusercontent.com/y-mx?s=100" width="100px;" alt="Yimeng Xie"/><br /><sub><b>Yimeng Xie</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=y-mx" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sz85512678"><img src="https://avatars.githubusercontent.com/sz85512678?s=100" width="100px;" alt="Zhen Shao"/><br /><sub><b>Zhen Shao</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sz85512678" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ZiyaoWei"><img src="https://avatars.githubusercontent.com/u/940823?v=4?s=100" width="100px;" alt="Ziyao Wei"/><br /><sub><b>Ziyao Wei</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ZiyaoWei" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/aa25desh"><img src="https://avatars1.githubusercontent.com/u/29518290?v=4?s=100" width="100px;" alt="aa25desh"/><br /><sub><b>aa25desh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=aa25desh" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Aaa25desh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/abandus"><img src="https://avatars2.githubusercontent.com/u/46486474?v=4?s=100" width="100px;" alt="abandus"/><br /><sub><b>abandus</b></sub></a><br /><a href="#ideas-abandus" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=abandus" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/adoherty21"><img src="https://avatars.githubusercontent.com/u/52799751?s=400&v=4?s=100" width="100px;" alt="adoherty21"/><br /><sub><b>adoherty21</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aadoherty21" title="Bug reports">🐛</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/bethrice44"><img src="https://avatars.githubusercontent.com/u/11226988?v=4?s=100" width="100px;" alt="bethrice44"/><br /><sub><b>bethrice44</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Abethrice44" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abethrice44" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/big-o"><img src="https://avatars1.githubusercontent.com/u/1134151?v=4?s=100" width="100px;" alt="big-o"/><br /><sub><b>big-o</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=big-o" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=big-o" title="Tests">⚠️</a> <a href="#design-big-o" title="Design">🎨</a> <a href="#ideas-big-o" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abig-o" title="Reviewed Pull Requests">👀</a> <a href="#tutorial-big-o" title="Tutorials">✅</a> <a href="#mentoring-big-o" title="Mentoring">🧑‍🏫</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/bethrice44"><img src="https://avatars.githubusercontent.com/u/11226988?v=4?s=100" width="100px;" alt="bethrice44"/><br /><sub><b>bethrice44</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Abethrice44" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abethrice44" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Tests">⚠️</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/big-o"><img src="https://avatars1.githubusercontent.com/u/1134151?v=4?s=100" width="100px;" alt="big-o"/><br /><sub><b>big-o</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=big-o" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=big-o" title="Tests">⚠️</a> <a href="#design-big-o" title="Design">🎨</a> <a href="#ideas-big-o" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abig-o" title="Reviewed Pull Requests">👀</a> <a href="#tutorial-big-o" title="Tutorials">✅</a> <a href="#mentoring-big-o" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bobbys-dev"><img src="https://avatars.githubusercontent.com/bobbys-dev?s=100" width="100px;" alt="bobbys"/><br /><sub><b>bobbys</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bobbys-dev" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/brettkoonce"><img src="https://avatars2.githubusercontent.com/u/11281814?v=4?s=100" width="100px;" alt="brett koonce"/><br /><sub><b>brett koonce</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=brettkoonce" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/btrtts"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="btrtts"/><br /><sub><b>btrtts</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=btrtts" title="Documentation">📖</a></td>
@@ -389,10 +391,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chrisholder"><img src="https://avatars.githubusercontent.com/u/4674372?v=4?s=100" width="100px;" alt="chrisholder"/><br /><sub><b>chrisholder</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Documentation">📖</a> <a href="#design-chrisholder" title="Design">🎨</a> <a href="#example-chrisholder" title="Examples">💡</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/morestart"><img src="https://avatars.githubusercontent.com/u/35556811?s=100" width="100px;" alt="ctl"/><br /><sub><b>ctl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Amorestart" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/danbartl"><img src="https://avatars.githubusercontent.com/u/19947407?v=4?s=100" width="100px;" alt="danbartl"/><br /><sub><b>danbartl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Adanbartl" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Adanbartl" title="Reviewed Pull Requests">👀</a> <a href="#talk-danbartl" title="Talks">📢</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Tests">⚠️</a> <a href="#tutorial-danbartl" title="Tutorials">✅</a> <a href="#video-danbartl" title="Videos">📹</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/hamzahiqb"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hamzahiqb"/><br /><sub><b>hamzahiqb</b></sub></a><br /><a href="#infra-hamzahiqb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/hiqbal2"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hiqbal2"/><br /><sub><b>hiqbal2</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=hiqbal2" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/hamzahiqb"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hamzahiqb"/><br /><sub><b>hamzahiqb</b></sub></a><br /><a href="#infra-hamzahiqb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/hiqbal2"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hiqbal2"/><br /><sub><b>hiqbal2</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=hiqbal2" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jesellier"><img src="https://avatars0.githubusercontent.com/u/51952076?v=4?s=100" width="100px;" alt="jesellier"/><br /><sub><b>jesellier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jesellier" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jschemm"><img src="https://avatars.githubusercontent.com/u/81151346?v=4?s=100" width="100px;" alt="jschemm"/><br /><sub><b>jschemm</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jschemm" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kkoziara"><img src="https://avatars1.githubusercontent.com/u/4346849?v=4?s=100" width="100px;" alt="kkoziara"/><br /><sub><b>kkoziara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kkoziara" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akkoziara" title="Bug reports">🐛</a></td>
@@ -400,10 +402,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/oleskiewicz"><img src="https://avatars1.githubusercontent.com/u/5682158?v=4?s=100" width="100px;" alt="oleskiewicz"/><br /><sub><b>oleskiewicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pabworks"><img src="https://avatars.githubusercontent.com/u/32725127?v=4?s=100" width="100px;" alt="pabworks"/><br /><sub><b>pabworks</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xloem"><img src="?s=100" width="100px;" alt="patiently pending world peace"/><br /><sub><b>patiently pending world peace</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xloem" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/raishubham1"><img src="https://avatars3.githubusercontent.com/u/29356417?v=4?s=100" width="100px;" alt="raishubham1"/><br /><sub><b>raishubham1</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=raishubham1" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/simone-pignotti"><img src="https://avatars1.githubusercontent.com/u/44410066?v=4?s=100" width="100px;" alt="simone-pignotti"/><br /><sub><b>simone-pignotti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=simone-pignotti" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Asimone-pignotti" title="Bug reports">🐛</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/raishubham1"><img src="https://avatars3.githubusercontent.com/u/29356417?v=4?s=100" width="100px;" alt="raishubham1"/><br /><sub><b>raishubham1</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=raishubham1" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/simone-pignotti"><img src="https://avatars1.githubusercontent.com/u/44410066?v=4?s=100" width="100px;" alt="simone-pignotti"/><br /><sub><b>simone-pignotti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=simone-pignotti" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Asimone-pignotti" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sophijka"><img src="https://avatars2.githubusercontent.com/u/47450591?v=4?s=100" width="100px;" alt="sophijka"/><br /><sub><b>sophijka</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sophijka" title="Documentation">📖</a> <a href="#maintenance-sophijka" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sri1419"><img src="https://avatars2.githubusercontent.com/u/65078278?v=4?s=100" width="100px;" alt="sri1419"/><br /><sub><b>sri1419</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sri1419" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tensorflow-as-tf"><img src="https://avatars.githubusercontent.com/u/51345718?v=4?s=100" width="100px;" alt="tensorflow-as-tf"/><br /><sub><b>tensorflow-as-tf</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tensorflow-as-tf" title="Code">💻</a></td>
diff --git a/docs/source/api_reference/forecasting.rst b/docs/source/api_reference/forecasting.rst
index a606ee914..d84765ba2 100644
--- a/docs/source/api_reference/forecasting.rst
+++ b/docs/source/api_reference/forecasting.rst
@@ -237,6 +237,7 @@ Trend forecasters
     STLForecaster
     CurveFitForecaster
     ProphetPiecewiseLinearTrendForecaster
+    SplineTrendForecaster
 
 .. currentmodule:: sktime.forecasting.statsforecast
 
diff --git a/sktime/classification/deep_learning/cnn.py b/sktime/classification/deep_learning/cnn.py
index d8c37ce76..05b5128bf 100644
--- a/sktime/classification/deep_learning/cnn.py
+++ b/sktime/classification/deep_learning/cnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNClassifier(BaseDeepClassifier):
     """Time Convolutional Neural Network (CNN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -51,11 +54,6 @@ class CNNClassifier(BaseDeepClassifier):
           ``input_shape[0] < 60`` in the input layer, and ``"valid"`` otherwise.
         - "valid", "same", and other values are passed directly to ``Conv1D``
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -75,7 +73,8 @@ class CNNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "TonyBagnall"],
+        "authors": ["hfawaz", "James-Large"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/classification/deep_learning/cntc.py b/sktime/classification/deep_learning/cntc.py
index 6238ac9c7..e4404761a 100644
--- a/sktime/classification/deep_learning/cntc.py
+++ b/sktime/classification/deep_learning/cntc.py
@@ -12,6 +12,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNTCClassifier(BaseDeepClassifier):
     """Contextual Time-series Neural Classifier (CNTC), as described in [1].
 
+    Adapted from the implementation from Fullah et. al
+    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -38,11 +41,6 @@ class CNTCClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizer, default=keras.optimizers.Adam(),
     metrics         : list of strings, default=["accuracy"],
 
-    Notes
-    -----
-    Adapted from the implementation from Fullah et. al
-    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
-
     References
     ----------
     .. [1] Network originally defined in:
@@ -73,7 +71,13 @@ class CNTCClassifier(BaseDeepClassifier):
     """
 
     _tags = {
-        "authors": ["James-Large", "Withington", "TonyBagnall", "AurumnPegasus"],
+        "authors": [
+            "AmaduFullah",
+            "James-Large",
+            "Withington",
+            "TonyBagnall",
+            "AurumnPegasus",
+        ],
         "maintainers": ["James-Large", "Withington", "AurumnPegasus"],
         "python_dependencies": ["tensorflow", "keras-self-attention"],
     }
diff --git a/sktime/classification/deep_learning/fcn.py b/sktime/classification/deep_learning/fcn.py
index 6a1470c33..2d0b9b5fd 100644
--- a/sktime/classification/deep_learning/fcn.py
+++ b/sktime/classification/deep_learning/fcn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNClassifier(BaseDeepClassifier):
     """Fully Connected Neural Network (FCN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -39,11 +42,6 @@ class FCNClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -63,7 +61,8 @@ class FCNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus"],
         # estimator type handled by parent class
     }
diff --git a/sktime/classification/deep_learning/lstmfcn.py b/sktime/classification/deep_learning/lstmfcn.py
index 983d6c82f..e4e9aa46d 100644
--- a/sktime/classification/deep_learning/lstmfcn.py
+++ b/sktime/classification/deep_learning/lstmfcn.py
@@ -15,10 +15,8 @@ from sktime.networks.lstmfcn import LSTMFCNNetwork
 class LSTMFCNClassifier(BaseDeepClassifier):
     """Implementation of LSTMFCNClassifier from Karim et al (2019) [1].
 
-    Overview
-    --------
-     Combines an LSTM arm with a CNN arm. Optionally uses an attention mechanism in the
-     LSTM which the author indicates provides improved performance.
+    Combines an LSTM arm with a CNN arm. Optionally uses an attention mechanism in the
+    LSTM which the author indicates provides improved performance.
 
     Parameters
     ----------
diff --git a/sktime/classification/deep_learning/mcdcnn.py b/sktime/classification/deep_learning/mcdcnn.py
index a84c21e9b..d11832a66 100644
--- a/sktime/classification/deep_learning/mcdcnn.py
+++ b/sktime/classification/deep_learning/mcdcnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MCDCNNClassifier(BaseDeepClassifier):
     """Multi Channel Deep Convolutional Neural Classifier, as described in [1]_.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
+
     Parameters
     ----------
     n_epochs : int, optional (default=120)
@@ -57,11 +60,6 @@ class MCDCNNClassifier(BaseDeepClassifier):
     random_state : int, optional (default=0)
         The seed to any random action.
 
-    Notes
-    -----
-    Adapted from the implementation of Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
-
     References
     ----------
     .. [1] Zheng et. al, Time series classification using multi-channels deep
@@ -81,7 +79,7 @@ class MCDCNNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["james-large"],
+        "authors": ["hfawaz", "james-large"],
         "maintainers": ["james-large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/classification/deep_learning/mlp.py b/sktime/classification/deep_learning/mlp.py
index e8c770116..7e6c9f7d0 100644
--- a/sktime/classification/deep_learning/mlp.py
+++ b/sktime/classification/deep_learning/mlp.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPClassifier(BaseDeepClassifier):
     """Multi Layer Perceptron Network (MLP), as described in [1]_.
 
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -39,11 +42,6 @@ class MLPClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1] Wang et. al, Time series classification from
@@ -63,7 +61,8 @@ class MLPClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus"],
         # estimator type handled by parent class
     }
diff --git a/sktime/classification/deep_learning/resnet.py b/sktime/classification/deep_learning/resnet.py
index 82e46c667..6a2a84b28 100644
--- a/sktime/classification/deep_learning/resnet.py
+++ b/sktime/classification/deep_learning/resnet.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetClassifier(BaseDeepClassifier):
     """Residual Neural Network as described in [1].
 
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
+
     Parameters
     ----------
     n_epochs       : int, default = 1500
@@ -38,12 +41,6 @@ class ResNetClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
         .. [1] Wang et. al, Time series classification from
@@ -63,7 +60,8 @@ class ResNetClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus", "nilesh05apr"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus", "nilesh05apr"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         "python_dependencies": ["tensorflow"],
         # estimator type handled by parent class
diff --git a/sktime/datatypes/_series/_check.py b/sktime/datatypes/_series/_check.py
index 101129a21..b247af4a5 100644
--- a/sktime/datatypes/_series/_check.py
+++ b/sktime/datatypes/_series/_check.py
@@ -546,6 +546,62 @@ def _index_equally_spaced(index):
 class SeriesXarray(ScitypeSeries):
     """Data type: xarray based specification of single time series.
 
+    Name: ``xr.DataArray``
+
+    Short description:
+
+    An ``xarray.DataArray`` representing a single time series, where:
+
+    - Each row corresponds to a time point.
+    - Columns represent variables or features.
+    - Coordinates provide additional metadata for the time index and variables.
+
+    Long description:
+
+    The ``xr.DataArray`` :term:``mtype`` is a concrete specification
+    that implements the ``Series`` :term:``scitype``, i.e., the abstract
+    type for time series data.
+
+    An object ``obj: xarray.DataArray`` follows the specification iff:
+
+    * structure convention:
+
+      - ``obj`` is a 2D array-like structure with shape ``(n_timepoints, n_features)``.
+      - ``obj.coords`` must include:
+
+        - A time-like index (``dim_0``) which is either ``Int64Index``, ``RangeIndex``,
+          ``DatetimeIndex``, or ``PeriodIndex``, and it must be monotonic.
+        - A variable-like index (``dim_1``) for feature/variable names (optional).
+
+    * time index:
+
+      - The ``dim_0`` coordinate is interpreted as the time index.
+
+    * time points:
+
+      - Each row of ``obj`` represents a single time point.
+      - Rows with the same ``dim_0`` value correspond to the same time point.
+
+    * variables:
+
+      - Columns represent different variables (or features).
+      - Column names are stored in ``dim_1`` if present.
+
+    * variable names:
+
+      - The variable names are the column names (``dim_1``), if present.
+
+    * metadata:
+
+      - Additional metadata (e.g., attributes) may be included in ``obj.attrs``.
+
+    Capabilities:
+
+    * can represent univariate or multivariate time series
+    * requires equally spaced time points (if time index is specified)
+    * supports missing values
+    * cannot represent series with differing sets of variables
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_table/_check.py b/sktime/datatypes/_table/_check.py
index 4517e7338..bfd24c776 100644
--- a/sktime/datatypes/_table/_check.py
+++ b/sktime/datatypes/_table/_check.py
@@ -45,7 +45,32 @@ PRIMITIVE_TYPES = (float, int, str)
 
 
 class TablePdDataFrame(ScitypeTable):
-    """Data type: pandas.DataFrame based specification of data frame table.
+    """Data type: pandas.DataFrame based specification of tabular data.
+
+    Name: ``"pd_DataFrame_Table"``
+
+    Short description:
+
+    a pandas ``DataFrame`` representing tabular data,
+    with rows = instances, cols = features
+
+    Long description:
+
+    The ``"pd_DataFrame_Table"`` :term:`mtype` is a concrete specification
+    that implements the ``Table`` :term:`scitype`, i.e., the abstract
+    type of tabular data.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` can be any valid pandas index.
+    * features: columns of ``obj`` correspond to different features
+    * feature names: column names ``obj.columns``
+    * instances: rows of ``obj`` correspond to different instances
+
+    Capabilities:
+
+    * can represent multivariate data
+    * can represent missing values
 
     Parameters are inferred by check.
 
@@ -139,7 +164,32 @@ def _check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
 
 
 class TablePdSeries(ScitypeTable):
-    """Data type: pandas.Series based specification of data frame table.
+    """Data type: pandas.Series based specification of tabular data.
+
+    Name: ``"pd_Series_Table"``
+
+    Short description:
+
+    a pandas ``Series`` representing tabular data,
+    with rows = instances, single feature
+
+    Long description:
+
+    The ``"pd_Series_Table"`` :term:`mtype` is a concrete specification
+    that implements the ``Table`` :term:`scitype`, i.e., the abstract
+    type of tabular data.
+
+    An object ``obj: pandas.Series`` follows the specification iff:
+
+    * structure convention: ``obj.index`` can be any valid pandas index.
+    * feature: the series ``obj`` represents a single feature
+    * feature name: the ``name`` attribute of the ``pd.Series`` object
+    * instances: rows of ``obj`` correspond to different instances
+
+    Capabilities:
+
+    * cannot represent multivariate data
+    * can represent missing values
 
     Parameters are inferred by check.
 
diff --git a/sktime/detection/_datatypes/__init__.py b/sktime/detection/_datatypes/__init__.py
new file mode 100644
index 000000000..95f3aca30
--- /dev/null
+++ b/sktime/detection/_datatypes/__init__.py
@@ -0,0 +1,1 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
diff --git a/sktime/detection/_datatypes/_check.py b/sktime/detection/_datatypes/_check.py
new file mode 100644
index 000000000..b3b1c3746
--- /dev/null
+++ b/sktime/detection/_datatypes/_check.py
@@ -0,0 +1,59 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
+
+import pandas as pd
+
+
+def _is_valid_detection(obj, type="points"):
+    """Check if the input is valid common output format.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check for validity
+    type : str {"points", "segments"}
+        Type of output to check for validity
+    """
+    if not isinstance(obj, pd.DataFrame):
+        return False
+    if not isinstance(obj.index, pd.RangeIndex):
+        return False
+    if "ilocs" not in obj.columns:
+        return False
+
+    if type == "points":
+        return _is_points_dtype(obj)
+    elif type == "segments":
+        return _is_segments_dtype(obj)
+
+    return False
+
+
+def _is_points_dtype(obj):
+    """Check if the input is points-like.
+
+    Assumes validity of input is checked elsewhere.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check
+    """
+    return pd.api.types.is_integer_dtype(obj.ilocs.dtype)
+
+
+def _is_segments_dtype(obj):
+    """Check if the input is valid segments-like.
+
+    Assumes validity of input is checked elsewhere.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check
+    """
+    ilocs_dtype = obj.ilocs.dtype
+    if not (isinstance(ilocs_dtype, pd.IntervalDtype) or len(obj) == 0):
+        return False
+    if not len(obj) == 0:
+        return pd.api.types.is_integer_dtype(ilocs_dtype.subtype)
+    return True
diff --git a/sktime/detection/base/_base.py b/sktime/detection/base/_base.py
index d4cbe125c..b38940f29 100644
--- a/sktime/detection/base/_base.py
+++ b/sktime/detection/base/_base.py
@@ -921,18 +921,16 @@ class BaseDetector(BaseEstimator):
         9    1
         dtype: int64
         """
-        if isinstance(y_sparse, pd.DataFrame):
-            y_sparse = y_sparse.iloc[:, 0]
-        if not isinstance(y_sparse, pd.Series):
-            y_sparse = pd.Series(y_sparse, dtype="int64")
-        if isinstance(y_sparse.index.dtype, pd.IntervalDtype):
-            # Segmentation case
-            y_dense = BaseDetector._sparse_segments_to_dense(y_sparse, index)
-            return y_dense
-        else:
+        if not isinstance(y_sparse, pd.DataFrame):
+            y_sparse = pd.DataFrame(y_sparse, dtype="int64")
+        if not hasattr(y_sparse, "ilocs") or y_sparse.ilocs.dtype != "interval":
             # Anomaly/changepoint detection case
             y_dense = BaseDetector._sparse_points_to_dense(y_sparse, index)
             return y_dense
+        else:
+            # Segmentation case
+            y_dense = BaseDetector._sparse_segments_to_dense(y_sparse, index)
+            return y_dense
 
     @staticmethod
     def _sparse_points_to_dense(y_sparse, index):
@@ -952,7 +950,7 @@ class BaseDetector(BaseEstimator):
             y_sparse and 0 otherwise.
         """
         y_dense = pd.Series(np.zeros(len(index)), index=index, dtype="int64")
-        y_dense[y_sparse.values] = 1
+        y_dense[y_sparse.values.flatten()] = 1
         return y_dense
 
     @staticmethod
@@ -974,24 +972,26 @@ class BaseDetector(BaseEstimator):
             according to ``y_sparse``. Indexes that do not fall within any index are
             labelled -1.
         """
-        if y_sparse.index.is_overlapping:
+        if len(y_sparse) == 0:
+            return pd.DataFrame(0, index=index, dtype="int64", columns=["labels"])
+
+        seg_index = y_sparse.set_index("ilocs").index
+        index_rg = pd.RangeIndex(len(index))
+
+        if seg_index.is_overlapping:
             raise NotImplementedError(
                 "Cannot convert overlapping segments to a dense format yet."
             )
 
-        interval_indexes = y_sparse.index.get_indexer(index)
-
-        # Negative indexes do not fall within any interval so they are ignored
-        interval_labels = y_sparse.iloc[
-            interval_indexes[interval_indexes >= 0]
-        ].to_numpy()
-
-        # -1 is used to represent points do not fall within a segment
-        labels_dense = interval_indexes.copy()
-        labels_dense[labels_dense >= 0] = interval_labels
+        interval_ixs = seg_index.get_indexer(index_rg)
 
-        y_dense = pd.Series(labels_dense, index=index)
-        return y_dense
+        if "labels" not in y_sparse.columns:
+            y_dense = pd.DataFrame({"labels": interval_ixs}, index=index_rg)
+            return y_dense
+        else:
+            y_dense = y_sparse.labels.loc[interval_ixs]
+            y_dense = y_dense.reset_index(drop=True)
+            return pd.DataFrame({"labels": y_dense}, index=index_rg)
 
     @staticmethod
     def dense_to_sparse(y_dense):
@@ -1049,7 +1049,7 @@ class BaseDetector(BaseEstimator):
         pd.Series
             An empty series with a RangeIndex.
         """
-        return pd.Series(index=pd.RangeIndex(0), dtype="int64")
+        return pd.DataFrame(index=pd.RangeIndex(0), dtype="int64", columns=["ilocs"])
 
     @staticmethod
     def _empty_segments():
@@ -1060,7 +1060,13 @@ class BaseDetector(BaseEstimator):
         pd.Series
             An empty series with an IntervalIndex.
         """
-        return pd.Series(index=pd.IntervalIndex([]), dtype="int64")
+        empty_segs = pd.DataFrame(
+            pd.IntervalIndex([]),
+            index=pd.RangeIndex(0),
+            dtype="int64",
+            columns=["ilocs"],
+        )
+        return empty_segs
 
     @staticmethod
     def change_points_to_segments(y_sparse, start=None, end=None):
@@ -1156,7 +1162,7 @@ class BaseDetector(BaseEstimator):
         """
         if len(y_sparse) == 0:
             return BaseDetector._empty_sparse()
-        change_points = pd.Series(y_sparse.index.left)
+        change_points = y_sparse.set_index("ilocs").index.left
         return change_points
 
 
diff --git a/sktime/detection/hmm.py b/sktime/detection/hmm.py
index ce4912f07..26f9497a0 100644
--- a/sktime/detection/hmm.py
+++ b/sktime/detection/hmm.py
@@ -11,6 +11,7 @@ import numpy as np
 from scipy.stats import norm
 
 from sktime.detection.base import BaseDetector
+from sktime.detection.utils._arr_to_seg import arr_to_seg
 
 __author__ = ["miraep8"]
 __all__ = ["HMM"]
@@ -403,9 +404,11 @@ class HMM(BaseDetector):
 
         self.trans_prob = trans_prob
         self.trans_id = trans_id
-        return self._hmm_viterbi_label(
+        labels = self._hmm_viterbi_label(
             self.num_obs, self.states, self.trans_prob, self.trans_id
         )
+        y_seg = arr_to_seg(labels)
+        return y_seg
 
     @classmethod
     def get_test_params(cls, parameter_set="default"):
diff --git a/sktime/detection/hmm_learn/base.py b/sktime/detection/hmm_learn/base.py
index 1354fdf72..bebb4bd92 100644
--- a/sktime/detection/hmm_learn/base.py
+++ b/sktime/detection/hmm_learn/base.py
@@ -11,6 +11,7 @@ import numpy as np
 import pandas as pd
 
 from sktime.detection.base import BaseDetector
+from sktime.detection.utils._arr_to_seg import arr_to_seg
 
 __author__ = ["miraep8"]
 __all__ = ["BaseHMMLearn"]
@@ -93,11 +94,10 @@ class BaseHMMLearn(BaseDetector):
         annotated_x : array-like, shape = [num_observations]
             Array of predicted class labels, same size as input.
         """
-        X, series, index = self._fix_input(X)
+        X, _, _ = self._fix_input(X)
         X_prime = self._hmm_estimator.predict(X)
-        if series:
-            X_prime = pd.Series(X_prime, index=index)
-        return X_prime
+
+        return arr_to_seg(X_prime)
 
     def sample(self, n_samples=1, random_state=None, currstate=None):
         """Interface class which allows users to sample from their HMM."""
diff --git a/sktime/detection/hmm_learn/gaussian.py b/sktime/detection/hmm_learn/gaussian.py
index a0361b9b0..24147f7fe 100644
--- a/sktime/detection/hmm_learn/gaussian.py
+++ b/sktime/detection/hmm_learn/gaussian.py
@@ -19,6 +19,7 @@ class GaussianHMM(BaseHMMLearn):
         Number of states
     covariance_type : {"spherical", "diag", "full", "tied"}, optional
         The type of covariance parameters to use:
+
         * "spherical" --- each state uses a single variance value that
             applies to all features.
         * "diag" --- each state uses a diagonal covariance matrix
@@ -28,6 +29,7 @@ class GaussianHMM(BaseHMMLearn):
         * "tied" --- all mixture components of each state use **the same**
             full covariance matrix (note that this is not the same as for
             ``GaussianHMM``).
+
     min_covar : float, optional
         Floor on the diagonal of the covariance matrix to prevent
         overfitting. Defaults to 1e-3.
@@ -84,6 +86,7 @@ class GaussianHMM(BaseHMMLearn):
     covars_ : array
         Covariance parameters for each state.
         The shape depends on :attr:`covariance_type`:
+
         * (n_components, )                        if "spherical",
         * (n_components, n_features)              if "diag",
         * (n_components, n_features, n_features)  if "full",
@@ -91,8 +94,8 @@ class GaussianHMM(BaseHMMLearn):
 
     Examples
     --------
-    >>> from sktime.annotation.hmm_learn import GaussianHMM # doctest: +SKIP
-    >>> from sktime.annotation.datagen import piecewise_normal # doctest: +SKIP
+    >>> from sktime.detection.hmm_learn import GaussianHMM # doctest: +SKIP
+    >>> from sktime.detection.datagen import piecewise_normal # doctest: +SKIP
     >>> data = piecewise_normal( # doctest: +SKIP
     ...    means=[2, 4, 1], lengths=[10, 35, 40], random_state=7
     ...    ).reshape((-1, 1))
@@ -191,10 +194,15 @@ class GaussianHMM(BaseHMMLearn):
         -------
         params : dict or list of dict
         """
-        params = {
+        params0 = {
             "n_components": 3,
             "covariance_type": "diag",
             "min_covar": 1e-3,
         }
+        params1 = {
+            "n_components": 2,
+            "covariance_type": "full",
+            "min_covar": 1e-2,
+        }
 
-        return params
+        return [params0, params1]
diff --git a/sktime/detection/hmm_learn/gmm.py b/sktime/detection/hmm_learn/gmm.py
index ccd88c3ed..70f3a07b0 100644
--- a/sktime/detection/hmm_learn/gmm.py
+++ b/sktime/detection/hmm_learn/gmm.py
@@ -21,6 +21,7 @@ class GMMHMM(BaseHMMLearn):
         Number of states in the GMM.
     covariance_type : {"spherical", "diag", "full", "tied"}, optional
         The type of covariance parameters to use:
+
         * "spherical" --- each state uses a single variance value that
             applies to all features.
         * "diag" --- each state uses a diagonal covariance matrix
@@ -30,6 +31,7 @@ class GMMHMM(BaseHMMLearn):
         * "tied" --- all mixture components of each state use **the same**
             full covariance matrix (note that this is not the same as for
             ``GaussianHMM``).
+
     min_covar : float, optional
         Floor on the diagonal of the covariance matrix to prevent
         overfitting. Defaults to 1e-3.
@@ -90,6 +92,7 @@ class GMMHMM(BaseHMMLearn):
     covars_ : array
         Covariance parameters for each mixture components in each state.
         The shape depends on :attr:`covariance_type`:
+
         * (n_components, n_mix)                          if "spherical",
         * (n_components, n_mix, n_features)              if "diag",
         * (n_components, n_mix, n_features, n_features)  if "full"
@@ -97,14 +100,14 @@ class GMMHMM(BaseHMMLearn):
 
     Examples
     --------
-    >>> from sktime.annotation.hmm_learn import GMMHMM # doctest: +SKIP
-    >>> from sktime.annotation.datagen import piecewise_normal # doctest: +SKIP
-    >>> data = piecewise_normal( # doctest: +SKIP
+    >>> from sktime.detection.hmm_learn import GMMHMM
+    >>> from sktime.detection.datagen import piecewise_normal # doctest: +SKIP
+    >>> data = piecewise_normal(
     ...    means=[2, 4, 1], lengths=[10, 35, 40], random_state=7
     ...    ).reshape((-1, 1))
-    >>> model = GMMHMM(n_components=3) # doctest: +SKIP
-    >>> model = model.fit(data) # doctest: +SKIP
-    >>> labeled_data = model.predict(data) # doctest: +SKIP
+    >>> model = GMMHMM(n_components=3)
+    >>> model = model.fit(data)
+    >>> labeled_data = model.predict(data)
     """
 
     def __init__(
diff --git a/sktime/detection/hmm_learn/poisson.py b/sktime/detection/hmm_learn/poisson.py
index 453f20862..8b5b74e85 100644
--- a/sktime/detection/hmm_learn/poisson.py
+++ b/sktime/detection/hmm_learn/poisson.py
@@ -64,14 +64,14 @@ class PoissonHMM(BaseHMMLearn):
 
     Examples
     --------
-    >>> from sktime.annotation.hmm_learn import PoissonHMM # doctest: +SKIP
-    >>> from sktime.annotation.datagen import piecewise_poisson # doctest: +SKIP
-    >>> data = piecewise_poisson( # doctest: +SKIP
+    >>> from sktime.detection.hmm_learn import PoissonHMM
+    >>> from sktime.detection.datagen import piecewise_poisson
+    >>> data = piecewise_poisson(
     ...    lambdas=[1, 2, 3], lengths=[2, 4, 8], random_state=7
     ...    ).reshape((-1, 1))
-    >>> model = PoissonHMM(n_components=3) # doctest: +SKIP
-    >>> model = model.fit(data) # doctest: +SKIP
-    >>> labeled_data = model.predict(data) # doctest: +SKIP
+    >>> model = PoissonHMM(n_components=3)
+    >>> model = model.fit(data)
+    >>> labeled_data = model.predict(data)
     """
 
     _tags = {
@@ -157,8 +157,12 @@ class PoissonHMM(BaseHMMLearn):
         -------
         params : dict or list of dict
         """
-        params = {
+        params0 = {
             "n_components": 3,
         }
+        params1 = {
+            "n_components": 5,
+            "algorithm": "map",
+        }
 
-        return params
+        return [params0, params1]
diff --git a/sktime/detection/utils/__init__.py b/sktime/detection/utils/__init__.py
new file mode 100644
index 000000000..9673cc30b
--- /dev/null
+++ b/sktime/detection/utils/__init__.py
@@ -0,0 +1,1 @@
+"""Utilities for detection tasks."""
diff --git a/sktime/detection/utils/_arr_to_seg.py b/sktime/detection/utils/_arr_to_seg.py
new file mode 100644
index 000000000..fdbc10dd5
--- /dev/null
+++ b/sktime/detection/utils/_arr_to_seg.py
@@ -0,0 +1,51 @@
+"""Utilities for detection tasks."""
+
+import numpy as np
+import pandas as pd
+
+
+def arr_to_seg(arr):
+    """Convert 1D array-like of integers to segmentation data frame.
+
+    Returns a DataFrame with two columns:
+
+    - ilocs: IntervalIndex with start and end of consecutive blocks of integers.
+    - segments: The value in the block.
+
+    Parameters
+    ----------
+    arr (array-like) 1D array-like of integers
+        the array to convert to a segmentation DataFrame.
+        In "dense" format as returned by ``transform`` methods.
+
+    Returns
+    -------
+    df: pd.DataFrame
+        DataFrame with columns 'ilocs' and 'segments',
+        as returned by ``predict_segments`` methods.
+
+    Examples
+    --------
+    >>> from sktime.detection.utils import arr_to_seg
+    >>> arr = [1, 1, 2, 2, 2, 3, 4, 4]
+    >>> df = arr_to_seg(arr)
+    """
+    arr = np.asarray(arr)
+    if arr.ndim != 1:
+        raise ValueError("Input must be a 1D array-like of integers.")
+
+    # Identify block boundaries
+    diffs = np.diff(arr)
+    block_starts = np.where(diffs != 0)[0] + 1
+    block_indices = np.split(np.arange(len(arr)), block_starts)
+
+    # Create intervals and segments
+    intervals = [
+        pd.Interval(block[0], block[-1] + 1, closed="left") for block in block_indices
+    ]
+    segments = [arr[block[0]] for block in block_indices]
+
+    # Create DataFrame
+    df = pd.DataFrame({"ilocs": pd.IntervalIndex(intervals), "labels": segments})
+
+    return df
diff --git a/sktime/forecasting/base/_meta.py b/sktime/forecasting/base/_meta.py
index 740541659..72c6d8dad 100644
--- a/sktime/forecasting/base/_meta.py
+++ b/sktime/forecasting/base/_meta.py
@@ -18,6 +18,12 @@ class _HeterogenousEnsembleForecaster(_HeterogenousMetaEstimator, BaseForecaster
     # this must be an iterable of (name: str, estimator, ...) tuples for the default
     _steps_attr = "forecasters"
 
+    # if the estimator is fittable, _HeterogenousMetaEstimator also
+    # provides an override for get_fitted_params for params from the fitted estimators
+    # the fitted estimators should be in a different attribute, _steps_fitted_attr
+    # this must be an iterable of (name: str, estimator, ...) tuples for the default
+    _steps_fitted_attr = "forecasters_"
+
     def __init__(self, forecasters, n_jobs=None):
         self.forecasters = forecasters
         self.forecasters_ = None
diff --git a/sktime/forecasting/compose/_hierarchy_ensemble.py b/sktime/forecasting/compose/_hierarchy_ensemble.py
index 9a7d1f7da..131912399 100644
--- a/sktime/forecasting/compose/_hierarchy_ensemble.py
+++ b/sktime/forecasting/compose/_hierarchy_ensemble.py
@@ -61,19 +61,20 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
     >>> from sktime.forecasting.trend import PolynomialTrendForecaster, TrendForecaster
     >>> from sktime.utils._testing.hierarchical import _bottom_hier_datagen
     >>> y = _bottom_hier_datagen(
-    ...         no_bottom_nodes=7,
-    ...         no_levels=2,
-    ...         random_seed=123
+    ...     no_bottom_nodes=7,
+    ...     no_levels=2,
+    ...     random_seed=123,
     ... )
 
     >>> # Example of by = 'level'
     >>> forecasters = [
     ...     ('naive', NaiveForecaster(), 0),
-    ...     ('trend', TrendForecaster(), 1)
+    ...     ('trend', TrendForecaster(), 1),
     ... ]
     >>> forecaster = HierarchyEnsembleForecaster(
-    ...                 forecasters=forecasters,
-    ...                 by='level', default = PolynomialTrendForecaster(degree=2)
+    ...     forecasters=forecasters,
+    ...     by='level',
+    ...     default=PolynomialTrendForecaster(degree=2),
     ... )
     >>> forecaster.fit(y, fh=[1, 2, 3])
     HierarchyEnsembleForecaster(...)
@@ -188,11 +189,12 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
         x = X
 
         # check forecasters
-        self.forecasters_ = self._check_forecasters(y, z)
+        forecasters_ = self._check_forecasters(y, z)
+        self.forecasters_ = self._ensure_clone(forecasters_)
         self.fitted_list = []
 
         if y.index.nlevels == 1:
-            frcstr = self.forecasters_[0][1].clone()
+            frcstr = self.forecasters_[0][1]
             frcstr.fit(y, fh=fh, X=X)
             self.fitted_list.append([frcstr, y.index])
             return self
@@ -201,7 +203,7 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
             hier_dict = self._get_hier_dict(z)
             for _, forecaster, level in self.forecasters_:
                 if level in hier_dict.keys():
-                    frcstr = forecaster.clone()
+                    frcstr = forecaster
                     df = z[z.index.droplevel(-1).isin(hier_dict[level])]
                     if X is not None:
                         x = X.loc[df.index]
@@ -211,7 +213,7 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
         else:
             node_dict, frcstr_dict = self._get_node_dict(z)
             for key, nodes in node_dict.items():
-                frcstr = frcstr_dict[key].clone()
+                frcstr = frcstr_dict[key]
                 df = z[z.index.droplevel(-1).isin(nodes)]
                 if X is not None:
                     x = X.loc[df.index]
@@ -594,6 +596,21 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
 
         return forecasters
 
+    def _ensure_clone(self, forecasters):
+        """Ensure that forecasters are cloned.
+
+        This should be done by _check_forecasters, but the function is hard to
+        understand and debug. This function is a safety net to ensure that
+        all forecasters are cloned.
+
+        This function, and _check_forecasters, should be refactored to be more
+        readable and maintainable.
+        """
+        forecasters_ = []
+        for name, forecaster, level_nd in forecasters:
+            forecasters_.append((name, forecaster.clone(), level_nd))
+        return forecasters_
+
     @classmethod
     def get_test_params(cls):
         """Return testing parameter settings for the estimator.
diff --git a/sktime/forecasting/trend/__init__.py b/sktime/forecasting/trend/__init__.py
index 70703a832..6d362609d 100644
--- a/sktime/forecasting/trend/__init__.py
+++ b/sktime/forecasting/trend/__init__.py
@@ -5,9 +5,11 @@
 __all__ = [
     "TrendForecaster",
     "PolynomialTrendForecaster",
+    "SplineTrendForecaster",
     "STLForecaster",
     "CurveFitForecaster",
     "ProphetPiecewiseLinearTrendForecaster",
+    "SplineTrendForecaster",
 ]
 
 from sktime.forecasting.trend._curve_fit_forecaster import CurveFitForecaster
@@ -17,5 +19,8 @@ from sktime.forecasting.trend._polynomial_trend_forecaster import (
 from sktime.forecasting.trend._pwl_trend_forecaster import (
     ProphetPiecewiseLinearTrendForecaster,
 )
+from sktime.forecasting.trend._spline_trend_forecaster import (
+    SplineTrendForecaster,
+)
 from sktime.forecasting.trend._stl_forecaster import STLForecaster
 from sktime.forecasting.trend._trend_forecaster import TrendForecaster
diff --git a/sktime/forecasting/trend/_spline_trend_forecaster.py b/sktime/forecasting/trend/_spline_trend_forecaster.py
new file mode 100644
index 000000000..cfc9fb78d
--- /dev/null
+++ b/sktime/forecasting/trend/_spline_trend_forecaster.py
@@ -0,0 +1,183 @@
+# Copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
+
+"""SplineTrendForecaster implementation."""
+
+__author__ = ["jgyasu", "Dehelaan"]
+__all__ = ["SplineTrendForecaster"]
+
+from sklearn.base import clone
+from sklearn.linear_model import LinearRegression
+from sklearn.pipeline import make_pipeline
+from sklearn.preprocessing import SplineTransformer
+
+from sktime.forecasting.base._delegate import _DelegatedForecaster
+
+
+class SplineTrendForecaster(_DelegatedForecaster):
+    r"""Forecast time series data with a spline trend.
+
+    Uses an ``sklearn`` regressor specified by the ``regressor`` parameter
+    to perform regression on time series values against their corresponding indices,
+    after transformation of the indices with ``SplineTransformer``.
+
+    Parameters
+    ----------
+    regressor : sklearn regressor estimator object, default=None
+        Define the regression model type. If not set, defaults to
+        ``sklearn.linear_model.LinearRegression``.
+
+    n_knots : int, default=5
+        Number of knots of the splines if ``knots`` is one of {'uniform', 'quantile'}.
+        Must be at least 2. Ignored if ``knots`` is array-like.
+
+    degree : int, default=1
+        Degree of the splines (1 for linear, 2 for quadratic, etc.).
+    n_knots : int, default=4
+        Number of knots for the spline transformation.
+
+    knots : {'uniform', 'quantile'}or array-like of shape (n_knots, n_features),
+        default='uniform'
+        Determines knot positions such that first knot <= features <= last knot.
+
+        - 'uniform': `n_knots` are distributed uniformly between the
+        min and max values of the features.
+        - 'quantile': `n_knots` are distributed uniformly along the quantiles
+        of the features.
+        - array-like: Specifies sorted knot positions, including the boundary knots.
+        Internally, additional knots are added before the first knot and after
+        the last knot based on the spline degree.
+
+    extrapolation : {'error', 'constant', 'linear', 'continue', 'periodic'},
+        default='constant'
+        Determines how to handle values outside the min and max values of the
+        training features:
+
+        - 'error': Raises a ValueError.
+        - 'constant': Uses the spline value at the minimum or maximum feature as
+        constant extrapolation.
+        - 'linear': Applies linear extrapolation.
+        - 'continue': Extrapolates as is (equivalent to `extrapolate=True` in
+        `scipy.interpolate.BSpline`).
+        - 'periodic': Uses periodic splines with a periodicity equal to the distance
+        between the first and last knot, enforcing equal function values and
+        derivatives at these knots.
+
+    with_intercept : bool, default=True
+        If True, includes a feature in which all polynomial powers are
+        zero (i.e., a column of ones, acting as an intercept term in a linear
+        model).
+
+    Examples
+    --------
+    >>> from sktime.datasets import load_airline
+    >>> from sktime.forecasting.trend import SplineTrendForecaster
+    >>> y = load_airline()
+    >>> forecaster = SplineTrendForecaster(
+    ...     n_knots=5,
+    ...     degree=2,
+    ...     knots="uniform",
+    ...     extrapolation="constant"
+    ... )
+    >>> forecaster.fit(y)
+    SplineTrendForecaster(...)
+    >>> y_pred = forecaster.predict(fh=[1, 2, 3])
+    """
+
+    _delegate_name = "forecaster_"
+
+    _tags = {
+        "authors": ["jgyasu", "Dehelaan"],
+        "maintainers": ["jgyasu"],
+        "ignores-exogeneous-X": True,
+        "requires-fh-in-fit": False,
+        "handles-missing-data": False,
+        "capability:pred_int": False,
+    }
+
+    def __init__(
+        self,
+        regressor=None,
+        n_knots=5,
+        degree=1,
+        knots="uniform",
+        extrapolation="constant",
+        with_intercept=True,
+    ):
+        self.regressor = regressor
+        self.degree = degree
+        self.n_knots = n_knots
+        self.knots = knots
+        self.extrapolation = extrapolation
+        self.with_intercept = with_intercept
+
+        super().__init__()
+
+        if self.regressor is None:
+            regressor = LinearRegression(fit_intercept=False)
+        else:
+            regressor = clone(self.regressor)
+
+        spline_regressor = make_pipeline(
+            SplineTransformer(
+                n_knots=self.n_knots,
+                degree=self.degree,
+                knots=self.knots,
+                extrapolation=self.extrapolation,
+                include_bias=self.with_intercept,
+            ),
+            regressor,
+        )
+
+        from sktime.forecasting.trend import TrendForecaster
+
+        self.forecaster_ = TrendForecaster(spline_regressor)
+
+    @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``
+        """
+        from sklearn.ensemble import RandomForestRegressor
+
+        params_list = [
+            {},
+            {
+                "n_knots": 5,
+                "degree": 1,
+                "knots": "uniform",
+                "extrapolation": "constant",
+                "with_intercept": False,
+            },
+            {
+                "regressor": RandomForestRegressor(),
+                "n_knots": 4,
+                "degree": 1,
+                "knots": "quantile",
+                "extrapolation": "linear",
+                "with_intercept": True,
+            },
+            {
+                "regressor": RandomForestRegressor(),
+                "n_knots": 3,
+                "degree": 2,
+                "knots": "uniform",
+                "extrapolation": "periodic",
+                "with_intercept": False,
+            },
+        ]
+
+        return params_list
diff --git a/sktime/networks/cnn.py b/sktime/networks/cnn.py
index 663b16c30..b4dce3e99 100644
--- a/sktime/networks/cnn.py
+++ b/sktime/networks/cnn.py
@@ -9,7 +9,7 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNNetwork(BaseDeepNetwork):
     """Establish the network structure for a CNN.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation used in [1]_.
 
     Parameters
     ----------
@@ -31,18 +31,18 @@ class CNNNetwork(BaseDeepNetwork):
     random_state    : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
-
     References
     ----------
     .. [1] Zhao et al. Convolutional neural networks for time series classification,
     Journal of Systems Engineering and Electronics 28(1), 162--169, 2017
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        # packaging info
+        # --------------
+        "authors": ["hfawaz"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/fcn.py b/sktime/networks/fcn.py
index 9626ed965..185fe27a4 100644
--- a/sktime/networks/fcn.py
+++ b/sktime/networks/fcn.py
@@ -9,18 +9,16 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNNetwork(BaseDeepNetwork):
     """Establish the network structure for a FCN.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
+    Implements network in [1]_.
 
     Parameters
     ----------
-    random_state    : int, default = 0
+    random_states : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Network originally defined in:
diff --git a/sktime/networks/inceptiontime.py b/sktime/networks/inceptiontime.py
index 379111e3a..0c2ab1a32 100644
--- a/sktime/networks/inceptiontime.py
+++ b/sktime/networks/inceptiontime.py
@@ -24,7 +24,10 @@ class InceptionTimeNetwork(BaseDeepNetwork):
                     ArXiv}, Year                     = {2019} }
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "JamesLarge", "Withington"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/mcdcnn.py b/sktime/networks/mcdcnn.py
index 6d82745b7..cd1e8f351 100644
--- a/sktime/networks/mcdcnn.py
+++ b/sktime/networks/mcdcnn.py
@@ -1,6 +1,6 @@
 """Multi Channel Deep Convolution Neural Network (MCDCNN)."""
 
-__author__ = ["James Large", "Withington"]
+__author__ = ["James-Large", "Withington"]
 
 from sktime.networks.base import BaseDeepNetwork
 from sktime.utils.dependencies import _check_dl_dependencies
@@ -10,7 +10,7 @@ class MCDCNNNetwork(BaseDeepNetwork):
     """
     Multi Channel Deep Convolutional Neural Network (MCDCNN).
 
-    Adapted from the implementation from Fawaz et. al:
+    Adapted from the implementation of Fawaz et. al:
     https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
 
     Parameters
@@ -35,7 +35,10 @@ class MCDCNNNetwork(BaseDeepNetwork):
         The seed to any random action.
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/mlp.py b/sktime/networks/mlp.py
index 6c5912650..dfbccbda0 100644
--- a/sktime/networks/mlp.py
+++ b/sktime/networks/mlp.py
@@ -9,18 +9,16 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPNetwork(BaseDeepNetwork):
     """Establish the network structure for a MLP.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
+    Implements a simple MLP network, as in [1]_.
 
     Parameters
     ----------
     random_state    : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1]  Network originally defined in:
@@ -31,7 +29,10 @@ class MLPNetwork(BaseDeepNetwork):
     1578--1585}, year={2017}, organization={IEEE} }
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington", "AurumnPegasus"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/resnet.py b/sktime/networks/resnet.py
index 0c5630b1a..53c3f7844 100644
--- a/sktime/networks/resnet.py
+++ b/sktime/networks/resnet.py
@@ -1,6 +1,6 @@
 """Residual Network (ResNet) (minus the final output layer)."""
 
-__author__ = ["James Large", "Withington", "nilesh05apr"]
+__author__ = ["James-Large", "Withington", "nilesh05apr"]
 
 from sktime.networks.base import BaseDeepNetwork
 from sktime.utils.dependencies import _check_dl_dependencies
@@ -9,18 +9,14 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetNetwork(BaseDeepNetwork):
     """Establish the network structure for a ResNet.
 
-    Adapted from the implementations used in [1]
+    Adapted from the implementation in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
 
     Parameters
     ----------
     random_state : int, optional (default = 0)
         The random seed to use random activities.
 
-    Notes
-    -----
-    Adapted from the implementation source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
     .. [1] H. Fawaz, G. B. Lanckriet, F. Petitjean, and L. Idoumghar,
@@ -34,7 +30,10 @@ class ResNetNetwork(BaseDeepNetwork):
     1578--1585}, year={2017}, organization={IEEE} }
     """
 
-    _tags = {"python_dependencies": ["tensorflow", "keras-self-attention"]}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington", "nilesh05apr"],
+        "python_dependencies": ["tensorflow", "keras-self-attention"],
+    }
 
     def __init__(self, random_state=0):
         _check_dl_dependencies(severity="error")
diff --git a/sktime/performance_metrics/detection/__init__.py b/sktime/performance_metrics/detection/__init__.py
new file mode 100644
index 000000000..b8e80b14c
--- /dev/null
+++ b/sktime/performance_metrics/detection/__init__.py
@@ -0,0 +1,7 @@
+"""Metrics for detection tasks."""
+
+from sktime.performance_metrics.detection._chamfer import DirectedChamfer
+from sktime.performance_metrics.detection._count import DetectionCount
+from sktime.performance_metrics.detection._hausdorff import DirectedHausdorff
+
+__all__ = ["DirectedChamfer", "DirectedHausdorff", "DetectionCount"]
diff --git a/sktime/performance_metrics/detection/_base.py b/sktime/performance_metrics/detection/_base.py
new file mode 100644
index 000000000..b802856bd
--- /dev/null
+++ b/sktime/performance_metrics/detection/_base.py
@@ -0,0 +1,147 @@
+"""Base class for detection metrics."""
+# copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
+
+from sktime.datatypes import check_is_scitype, convert_to
+from sktime.performance_metrics.base import BaseMetric
+
+
+class BaseDetectionMetric(BaseMetric):
+    """Base class for defining detection error metrics in sktime."""
+
+    _tags = {
+        "object_type": ["metric_detection", "metric"],
+        "scitype:y": "points",  # or segments
+        "requires_X": False,
+        "requires_y_true": True,  # if False, is unsupervised metric
+        "lower_is_better": True,
+    }
+
+    def __call__(self, y_true=None, y_pred=None, X=None):
+        """Evaluate the desired metric on given inputs.
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+            Not required for unsupervised metrics.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        return self.evaluate(y_true, y_pred, X)
+
+    def evaluate(self, y_true=None, y_pred=None, X=None):
+        """Evaluate the desired metric on given inputs.
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+
+            Not required if unsupervised metric,
+            that is, if tag ``requires_y_true`` is False.
+
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+            Required if tag ``requires_X`` is True.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        # Input checks and conversions
+        y_true_inner, y_pred_inner, X_inner = self._check_ys(y_true, y_pred, X)
+
+        # pass to inner function
+        out = self._evaluate(y_true=y_true_inner, y_pred=y_pred_inner, X=X_inner)
+
+        if not isinstance(out, float):
+            out = float(out)
+        return out
+
+    def _evaluate(self, y_true, y_pred, X):
+        """Evaluate the desired metric on given inputs.
+
+        private _evaluate containing core logic, called from evaluate
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        raise NotImplementedError("Abstract method.")
+
+    def _check_ys(self, y_true, y_pred, X):
+        SCITYPES = ["Series"]
+        INNER_MTYPES = ["pd.DataFrame"]
+
+        def _coerce_to_df(y, var_name="y", allow_none=False):
+            if allow_none and y is None:
+                return None
+            valid, msg, _ = check_is_scitype(
+                y, scitype=SCITYPES, return_metadata=[], var_name=var_name
+            )
+            if not valid:
+                raise TypeError(msg)
+            y_inner = convert_to(y, to_type=INNER_MTYPES)
+            return y_inner
+
+        allow_none_y_true = not self.get_tag("requires_y_true")
+        allow_none_X = not self.get_tag("requires_X")
+
+        # catch the case where y_pred is passed as single positional arg
+        if allow_none_y_true and y_pred is None and y_true is not None:
+            y_pred = y_true
+            y_true = None
+
+        y_true = _coerce_to_df(y_true, var_name="y_true", allow_none=allow_none_y_true)
+        y_pred = _coerce_to_df(y_pred, var_name="y_pred")
+        X = _coerce_to_df(X, var_name="X", allow_none=allow_none_X)
+
+        return y_true, y_pred, X
diff --git a/sktime/performance_metrics/detection/_chamfer.py b/sktime/performance_metrics/detection/_chamfer.py
new file mode 100644
index 000000000..fbca0c849
--- /dev/null
+++ b/sktime/performance_metrics/detection/_chamfer.py
@@ -0,0 +1,121 @@
+"""Directed Chamfer distance between two sets of points."""
+
+import numpy as np
+import pandas as pd
+
+from sktime.performance_metrics.detection._base import BaseDetectionMetric
+from sktime.performance_metrics.detection.utils import _find_closest_elements
+
+
+class DirectedChamfer(BaseDetectionMetric):
+    r"""Directed Chamfer distance between event points.
+
+    For detected time points :math:`A = (a_1, a_2, \ldots, a_n)` and true time points
+    :math:`B = (b_1, b_2, \ldots, b_m)`,
+    the directed (unnormalized) Chamfer distance is defined as:
+
+    .. math::
+
+        d(A, B) = \sum_{i=1}^{n} \left| a_i - b'_i \right|
+
+    where :math:`b'_i` is the true event closest to :math:`a_i`,
+    that is, :math:`b'_i = \arg \min_{b\in B} |a_i - b|`.
+
+    If ``X`` is provided, the time points are taken as the location indices in ``X``.
+    Otherwise, it is assumed that ``X`` has a ``RangeIndex``.
+
+    Parameters
+    ----------
+    normalize : bool, default=False
+        If True, the Chamfer distance is normalized by the number of detected events,
+        i.e., divided by :math:`n`.
+        If unnormalized, making too many detections will be penalized, wherease
+        the normalized distance penalizes only the average distance to the
+        closest true events, regardless of the number of detections.
+    """
+
+    _tags = {
+        "scitype:y": "points",  # or segments
+        "requires_X": False,
+        "lower_is_better": True,
+    }
+
+    def __init__(self, normalize=False):
+        self.normalize = normalize
+
+        super().__init__()
+
+    def _evaluate(self, y_true, y_pred, X=None):
+        """Evaluate the desired metric on given inputs.
+
+        private _evaluate containing core logic, called from evaluate
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        y_true_ilocs = y_true.ilocs
+        y_pred_ilocs = y_pred.ilocs
+
+        if X is not None and not isinstance(X.index, pd.RangeIndex):
+            y_true_locs = X.index[y_true_ilocs]
+            y_pred_locs = X.index[y_pred_ilocs]
+        else:
+            y_true_locs = y_true_ilocs
+            y_pred_locs = y_pred_ilocs
+
+        y_true_locs = y_true_locs.to_numpy()
+        y_pred_locs = y_pred_locs.to_numpy()
+
+        y_true_closest = _find_closest_elements(y_pred_locs, y_true_locs)
+        y_true_closest = np.array(y_true_closest)
+
+        distance = np.sum(np.abs(y_true_closest - y_pred_locs))
+
+        if self.normalize:
+            distance /= len(y_pred_locs)
+
+        return distance
+
+    @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``.
+        """
+        param1 = {}
+        param2 = {"normalize": True}
+
+        return [param1, param2]
diff --git a/sktime/performance_metrics/detection/_count.py b/sktime/performance_metrics/detection/_count.py
new file mode 100644
index 000000000..c29adf0e4
--- /dev/null
+++ b/sktime/performance_metrics/detection/_count.py
@@ -0,0 +1,101 @@
+"""Count of detection, possibly in excess or deviation of a target count."""
+
+from sktime.performance_metrics.detection._base import BaseDetectionMetric
+
+
+class DetectionCount(BaseDetectionMetric):
+    r"""Count of detection, possibly in excess or deviation of a target count.
+
+    Parameters
+    ----------
+    target : int, default=0
+        Target number of detections.
+        If 0, the count is the absolute number of detections.
+        If positive, the count reported is, by default, the absolute
+        difference between the number of detections and the target.
+        If the ``excess_only`` parameter is set to ``True``, the count
+        is the number of detections in excess of the target if larger,
+        otherwise zero.
+    excess_only : bool, default=False
+        If False, the count is the absolute difference between the ``target``
+        and the number of detections.
+        If True, the count is the number of detections in excess of the target
+        if larger, otherwise zero.
+    """
+
+    _tags = {
+        "scitype:y": "points",  # or segments
+        "requires_X": False,
+        "requires_y_true": False,  # this is an unsupervised metric
+        "lower_is_better": True,
+    }
+
+    def __init__(self, target=0, excess_only=False):
+        self.target = target
+        self.excess_only = excess_only
+
+        super().__init__()
+
+    def _evaluate(self, y_true, y_pred, X):
+        """Evaluate the desired metric on given inputs.
+
+        private _evaluate containing core logic, called from evaluate
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        num_detections = len(y_pred)
+
+        score = num_detections - self.target
+
+        if self.excess_only:
+            score = max(score, 0)
+
+        score = abs(score)
+
+        return score
+
+    @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``.
+        """
+        param0 = {}
+        param1 = {"target": 1, "excess_only": True}
+        param2 = {"target": 42}
+
+        return [param0, param1, param2]
diff --git a/sktime/performance_metrics/detection/_hausdorff.py b/sktime/performance_metrics/detection/_hausdorff.py
new file mode 100644
index 000000000..d27acedb9
--- /dev/null
+++ b/sktime/performance_metrics/detection/_hausdorff.py
@@ -0,0 +1,80 @@
+"""Directed Hausdorff distance between two sets of points."""
+
+import numpy as np
+import pandas as pd
+
+from sktime.performance_metrics.detection._base import BaseDetectionMetric
+from sktime.performance_metrics.detection.utils import _find_closest_elements
+
+
+class DirectedHausdorff(BaseDetectionMetric):
+    r"""Directed Hausdorff distance between event points.
+
+    For detected time points :math:`A = (a_1, a_2, \ldots, a_n)` and true time points
+    :math:`B = (b_1, b_2, \ldots, b_m)`,
+    the directed (unnormalized) Hausdorff distance is defined as:
+
+    .. math::
+
+        d(A, B) = \max_i \left| a_i - b'_i \right|
+
+    where :math:`b'_i` is the true event closest to :math:`a_i`,
+    that is, :math:`b'_i = \arg \min_{b\in B} |a_i - b|`.
+
+    If ``X`` is provided, the time points are taken as the location indices in ``X``.
+    Otherwise, it is assumed that ``X`` has a ``RangeIndex``.
+    """
+
+    _tags = {
+        "scitype:y": "points",  # or segments
+        "requires_X": False,
+        "lower_is_better": True,
+    }
+
+    def _evaluate(self, y_true, y_pred, X=None):
+        """Evaluate the desired metric on given inputs.
+
+        private _evaluate containing core logic, called from evaluate
+
+        Parameters
+        ----------
+        y_true : time series in ``sktime`` compatible data container format.
+            Ground truth (correct) event locations, in ``X``.
+            Should be ``pd.DataFrame``, ``pd.Series``, or ``np.ndarray`` (1D or 2D),
+            of ``Series`` scitype = individual time series.
+
+            For further details on data format, see glossary on :term:`mtype`.
+
+        y_pred : time series in ``sktime`` compatible data container format
+            Detected events to evaluate against ground truth.
+            Must be of same format as ``y_true``, same indices and columns if indexed.
+
+        X : optional, pd.DataFrame, pd.Series or np.ndarray
+            Time series that is being labelled.
+            If not provided, assumes ``RangeIndex`` for ``X``, and that
+            values in ``X`` do not matter.
+
+        Returns
+        -------
+        loss : float
+            Calculated metric.
+        """
+        y_true_ilocs = y_true.ilocs
+        y_pred_ilocs = y_pred.ilocs
+
+        if X is not None and not isinstance(X.index, pd.RangeIndex):
+            y_true_locs = X.index[y_true_ilocs]
+            y_pred_locs = X.index[y_pred_ilocs]
+        else:
+            y_true_locs = y_true_ilocs
+            y_pred_locs = y_pred_ilocs
+
+        y_true_locs = y_true_locs.to_numpy()
+        y_pred_locs = y_pred_locs.to_numpy()
+
+        y_true_closest = _find_closest_elements(y_pred_locs, y_true_locs)
+        y_true_closest = np.array(y_true_closest)
+
+        distance = np.max(np.abs(y_true_closest - y_pred_locs))
+
+        return distance
diff --git a/sktime/performance_metrics/detection/utils/__init__.py b/sktime/performance_metrics/detection/utils/__init__.py
new file mode 100644
index 000000000..a588073fb
--- /dev/null
+++ b/sktime/performance_metrics/detection/utils/__init__.py
@@ -0,0 +1,5 @@
+"""Utilities for detection metrics."""
+
+from sktime.performance_metrics.detection.utils._closest import _find_closest_elements
+
+__all__ = ["_find_closest_elements"]
diff --git a/sktime/performance_metrics/detection/utils/_closest.py b/sktime/performance_metrics/detection/utils/_closest.py
new file mode 100644
index 000000000..040f0ce30
--- /dev/null
+++ b/sktime/performance_metrics/detection/utils/_closest.py
@@ -0,0 +1,44 @@
+"""Utility to find all closest elements in sorted list b to sorted list a."""
+
+
+def _find_closest_elements(a, b):
+    """Find the closest element in b for each element in a.
+
+    Parameters
+    ----------
+    a : 1D array-like
+        An ordered (sorted) list of elements.
+    b : 1D array-like
+        Another ordered (sorted) list of elements.
+
+    Returns
+    -------
+    closest : list, same length as a
+        a list of closest elements in ``b`` for each element in ``a``.
+        In case of ties, the first closest element is chosen.
+
+    Examples
+    --------
+    >>> a = [1, 3, 5]
+    >>> b = [2, 3.1, 3.2, 4, 6]
+    >>> pointer = DirectedHausdorff()._find_closest_elements(a, b)
+    """
+    # Pointers for traversing A and B
+    i, j = 0, 0
+    n, m = len(a), len(b)
+
+    # List to store the result
+    result = []
+
+    while i < n:
+        # Move pointer j in b to get the closest value to a[i]
+        while j + 1 < m and abs(b[j + 1] - a[i]) < abs(b[j] - a[i]):
+            j += 1
+
+        # Append the closest value in b for a[i]
+        result.append(b[j])
+
+        # Move to the next element in a
+        i += 1
+
+    return result
diff --git a/sktime/registry/_base_classes.py b/sktime/registry/_base_classes.py
index 9a54e7e12..269dce5f4 100644
--- a/sktime/registry/_base_classes.py
+++ b/sktime/registry/_base_classes.py
@@ -69,6 +69,11 @@ class _BaseScitypeOfObject(BaseObject):
         "mixin": False,  # whether this is a mixin, not full scitype
     }
 
+    @classmethod
+    def get_test_class(cls):
+        """Return test class for the scitype."""
+        return None
+
 
 class object(_BaseScitypeOfObject):
     """Universal type for all objects."""
@@ -84,6 +89,12 @@ class object(_BaseScitypeOfObject):
 
         return BaseObject
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.tests.test_all_estimators import TestAllObjects
+
+        return TestAllObjects
+
 
 class estimator(_BaseScitypeOfObject):
     """Estimator objects, i.e., objects with fit method."""
@@ -100,6 +111,12 @@ class estimator(_BaseScitypeOfObject):
 
         return BaseEstimator
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.tests.test_all_estimators import TestAllEstimators
+
+        return TestAllEstimators
+
 
 class aligner(_BaseScitypeOfObject):
     """Time series aligner or sequence aligner."""
@@ -116,6 +133,12 @@ class aligner(_BaseScitypeOfObject):
 
         return BaseAligner
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.alignment.tests.test_all_aligners import TestAllAligners
+
+        return TestAllAligners
+
 
 class classifier(_BaseScitypeOfObject):
     """Time series classifier."""
@@ -132,6 +155,12 @@ class classifier(_BaseScitypeOfObject):
 
         return BaseClassifier
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.classification.tests.test_all_classifiers import TestAllClassifiers
+
+        return TestAllClassifiers
+
 
 class clusterer(_BaseScitypeOfObject):
     """Time series clusterer."""
@@ -164,6 +193,14 @@ class early_classifier(_BaseScitypeOfObject):
 
         return BaseEarlyClassifier
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.classification.early_classification.tests.test_all_early_classifiers import (  # noqa E501
+            TestAllEarlyClassifiers,  # noqa E501
+        )  # noqa E501
+
+        return TestAllEarlyClassifiers
+
 
 class forecaster(_BaseScitypeOfObject):
     """Time series forecaster."""
@@ -180,6 +217,12 @@ class forecaster(_BaseScitypeOfObject):
 
         return BaseForecaster
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.forecasting.tests.test_all_forecasters import TestAllForecasters
+
+        return TestAllForecasters
+
 
 class global_forecaster(_BaseScitypeOfObject):
     """Global time series forecaster."""
@@ -196,6 +239,14 @@ class global_forecaster(_BaseScitypeOfObject):
 
         return _BaseGlobalForecaster
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.forecasting.tests.test_all_forecasters import (
+            TestAllGlobalForecasters,
+        )
+
+        return TestAllGlobalForecasters
+
 
 class metric(_BaseScitypeOfObject):
     """Performance metric for time series."""
@@ -213,6 +264,30 @@ class metric(_BaseScitypeOfObject):
         return BaseMetric
 
 
+class metric_detection(_BaseScitypeOfObject):
+    """Performance metric for time series detection tasks."""
+
+    _tags = {
+        "scitype_name": "metric_detection",
+        "short_descr": "performance metric for detectors",
+        "parent_scitype": "metric",
+    }
+
+    @classmethod
+    def get_base_class(cls):
+        from sktime.performance_metrics.detection._base import BaseDetectionMetric
+
+        return BaseDetectionMetric
+
+    @classmethod
+    def get_test_class(cls):
+        from sktime.performance_metrics.detection.tests.test_all_metrics_detection import (  # noqa E501
+            TestAllDetectionMetrics,  # noqa E501
+        )  # noqa E501
+
+        return TestAllDetectionMetrics
+
+
 class metric_forecasting(_BaseScitypeOfObject):
     """Performance metric for time series forecasting."""
 
@@ -262,6 +337,12 @@ class param_est(_BaseScitypeOfObject):
 
         return BaseParamFitter
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.param_est.tests.test_all_param_est import TestAllParamFitters
+
+        return TestAllParamFitters
+
 
 class regressor(_BaseScitypeOfObject):
     """Time series regressor."""
@@ -278,6 +359,12 @@ class regressor(_BaseScitypeOfObject):
 
         return BaseRegressor
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.regression.tests.test_all_regressors import TestAllRegressors
+
+        return TestAllRegressors
+
 
 class detector(_BaseScitypeOfObject):
     """Detector of anomalies, outliers, or change points."""
@@ -294,6 +381,12 @@ class detector(_BaseScitypeOfObject):
 
         return BaseDetector
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.detection.tests.test_all_detectors import TestAllDetectors
+
+        return TestAllDetectors
+
 
 class splitter(_BaseScitypeOfObject):
     """Time series splitter."""
@@ -310,6 +403,12 @@ class splitter(_BaseScitypeOfObject):
 
         return BaseSplitter
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.split.tests.test_all_splitters import TestAllSplitters
+
+        return TestAllSplitters
+
 
 class transformer(_BaseScitypeOfObject):
     """Time series transformer."""
@@ -326,6 +425,14 @@ class transformer(_BaseScitypeOfObject):
 
         return BaseTransformer
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.transformations.tests.test_all_transformers import (
+            TestAllTransformers,
+        )
+
+        return TestAllTransformers
+
 
 class transformer_pairwise(_BaseScitypeOfObject):
     """Pairwise transformer for tabular data, distance or kernel."""
@@ -342,6 +449,14 @@ class transformer_pairwise(_BaseScitypeOfObject):
 
         return BasePairwiseTransformer
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.dists_kernels.tests.test_all_dist_kernels import (
+            TestAllPairwiseTransformers,
+        )
+
+        return TestAllPairwiseTransformers
+
 
 class transformer_pairwise_panel(_BaseScitypeOfObject):
     """Pairwise transformer for panel data, distance or kernel."""
@@ -358,6 +473,14 @@ class transformer_pairwise_panel(_BaseScitypeOfObject):
 
         return BasePairwiseTransformerPanel
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.dists_kernels.tests.test_all_dist_kernels import (
+            TestAllPanelTransformers,
+        )
+
+        return TestAllPanelTransformers
+
 
 class distribution(_BaseScitypeOfObject):
     """Pandas-like probability distribution."""
@@ -580,6 +703,12 @@ class series_annotator(_BaseScitypeOfObject):
 
         return BaseDetector
 
+    @classmethod
+    def get_test_class(cls):
+        from sktime.detection.tests.test_all_detectors import TestAllDetectors
+
+        return TestAllDetectors
+
 
 class transformer_series_to_primitives(_BaseScitypeOfObject):
     """LEGACY - time series to primitives transformer."""
diff --git a/sktime/registry/_tags.py b/sktime/registry/_tags.py
index ff8f152e9..11081854c 100644
--- a/sktime/registry/_tags.py
+++ b/sktime/registry/_tags.py
@@ -1932,6 +1932,12 @@ ESTIMATOR_TAG_REGISTER = [
         "bool",
         "does metric require a predictive benchmark?",
     ),
+    (
+        "requires_y_true",
+        "metric",
+        "bool",
+        "does metric require ground truth? If False, unsupervised metric",
+    ),
     (
         "scitype:y_pred",
         "metric",
diff --git a/sktime/regression/deep_learning/cnn.py b/sktime/regression/deep_learning/cnn.py
index de9a0a8f6..a0037ad02 100644
--- a/sktime/regression/deep_learning/cnn.py
+++ b/sktime/regression/deep_learning/cnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNRegressor(BaseDeepRegressor):
     """Time Series Convolutional Neural Network (CNN), as described in [1].
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -77,7 +80,8 @@ class CNNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["AurumnPegasus", "achieveordie"],
+        "authors": ["hfawaz", "AurumnPegasus", "achieveordie"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["AurumnPegasus", "achieveordie"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/regression/deep_learning/cntc.py b/sktime/regression/deep_learning/cntc.py
index 830c9dfa6..03d51830f 100644
--- a/sktime/regression/deep_learning/cntc.py
+++ b/sktime/regression/deep_learning/cntc.py
@@ -12,6 +12,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNTCRegressor(BaseDeepRegressor):
     """Contextual Time-series Neural Regressor (CNTC), as described in [1].
 
+    Adapted from the implementation from Fullah et. al
+    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -38,11 +41,6 @@ class CNTCRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizer, default=keras.optimizers.Adam(),
     metrics         : list of strings, default=["accuracy"],
 
-    Notes
-    -----
-    Adapted from the implementation from Fullah et. al
-    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
-
     References
     ----------
     .. [1] Network originally defined in:
@@ -63,7 +61,12 @@ class CNTCRegressor(BaseDeepRegressor):
     """
 
     _tags = {
-        "authors": ["James-Large", "Withington", "TonyBagnall", "AurumnPegasus"],
+        "authors": [
+            "AmaduFullah",
+            "James-Large",
+            "Withington",
+            "AurumnPegasus",
+        ],
         "maintainers": ["James-Large", "Withington", "AurumnPegasus", "nilesh05apr"],
         "python_dependencies": ["tensorflow", "keras-self-attention"],
     }
diff --git a/sktime/regression/deep_learning/fcn.py b/sktime/regression/deep_learning/fcn.py
index 244de161b..ed3d81dcb 100644
--- a/sktime/regression/deep_learning/fcn.py
+++ b/sktime/regression/deep_learning/fcn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNRegressor(BaseDeepRegressor):
     """Fully Connected Neural Network (FCN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -38,11 +41,6 @@ class FCNRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -52,7 +50,7 @@ class FCNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/inceptiontime.py b/sktime/regression/deep_learning/inceptiontime.py
index f2b704125..6cd95fce7 100644
--- a/sktime/regression/deep_learning/inceptiontime.py
+++ b/sktime/regression/deep_learning/inceptiontime.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class InceptionTimeRegressor(BaseDeepRegressor):
     """InceptionTime Deep Learning Regressor.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/InceptionTime/blob/master/classifiers/inception.py
+
     Parameters
     ----------
     n_epochs : int, default=1500
@@ -39,15 +42,12 @@ class InceptionTimeRegressor(BaseDeepRegressor):
     -----
     ..[1] Fawaz et. al, InceptionTime: Finding AlexNet for Time Series
     Classification, Data Mining and Knowledge Discovery, 34, 2020
-
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/InceptionTime/blob/master/classifiers/inception.py
     """
 
     _tags = {
         # packaging info
         # --------------
-        "authors": ["james-large"],
+        "authors": ["hfawaz", "james-large"],
         "maintainers": ["james-large", "niles05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/mcdcnn.py b/sktime/regression/deep_learning/mcdcnn.py
index 01ea12725..3b235d718 100644
--- a/sktime/regression/deep_learning/mcdcnn.py
+++ b/sktime/regression/deep_learning/mcdcnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MCDCNNRegressor(BaseDeepRegressor):
     """Multi Channel Deep Convolutional Neural Regressor, adopted from [1]_.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
+
     Parameters
     ----------
     n_epochs : int, optional (default=120)
@@ -56,11 +59,6 @@ class MCDCNNRegressor(BaseDeepRegressor):
     random_state : int, optional (default=0)
         The seed to any random action.
 
-    Notes
-    -----
-    Adapted from the implementation of Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
-
     References
     ----------
     .. [1] Zheng et. al, Time series classification using multi-channels deep
@@ -80,7 +78,7 @@ class MCDCNNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large"],
+        "authors": ["hfawaz", "James-Large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/mlp.py b/sktime/regression/deep_learning/mlp.py
index ead20dbd3..ea752b81c 100644
--- a/sktime/regression/deep_learning/mlp.py
+++ b/sktime/regression/deep_learning/mlp.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPRegressor(BaseDeepRegressor):
     """Multi Layer Perceptron Network (MLP), as described in [1]_.
 
+    Adapted from the implementation by hfawaz in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -38,11 +41,6 @@ class MLPRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1] Wang et. al, Time series classification from
@@ -64,7 +62,7 @@ class MLPRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/resnet.py b/sktime/regression/deep_learning/resnet.py
index 2a8ce52aa..557b2dc49 100644
--- a/sktime/regression/deep_learning/resnet.py
+++ b/sktime/regression/deep_learning/resnet.py
@@ -14,6 +14,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetRegressor(BaseDeepRegressor):
     """Residual Neural Network Regressor adopted from [1].
 
+    Adapted from the implementation by hfawaz in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
+
     Parameters
     ----------
     n_epochs       : int, default = 1500
@@ -37,12 +40,6 @@ class ResNetRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
         .. [1] Wang et. al, Time series classification from
@@ -62,7 +59,8 @@ class ResNetRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "Withington"],
+        "authors": ["hfawaz", "James-Large", "Withington"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["Withington"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/split/instance.py b/sktime/split/instance.py
index c36b72c80..678163538 100644
--- a/sktime/split/instance.py
+++ b/sktime/split/instance.py
@@ -2,7 +2,7 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """Splitter that uses an sklearn splitter to split by instance."""
 
-__author__ = ["fkiraly"]
+__author__ = ["fkiraly", "ksharma6"]
 
 __all__ = [
     "InstanceSplitter",
@@ -10,11 +10,11 @@ __all__ = [
 
 from typing import Optional
 
-import numpy as np
 import pandas as pd
 
 from sktime.split.base import BaseSplitter
 from sktime.split.base._common import ACCEPTED_Y_TYPES, SPLIT_GENERATOR_TYPE
+from sktime.utils.multiindex import apply_split
 
 
 class InstanceSplitter(BaseSplitter):
@@ -62,15 +62,10 @@ class InstanceSplitter(BaseSplitter):
             y = pd.MultiIndex.from_arrays([zeros, y])
 
         inst_ix = y.droplevel(-1).unique()
-        iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)
 
         for y_train_inst_iloc, y_test_inst_iloc in self.cv.split(inst_ix):
-            y_train_inst_loc = inst_ix[np.array(y_train_inst_iloc)]
-            y_test_inst_loc = inst_ix[np.array(y_test_inst_iloc)]
-            tr_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_train_inst_loc]
-            tt_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_test_inst_loc]
-            y_train_iloc = np.concatenate(tr_np)
-            y_test_iloc = np.concatenate(tt_np)
+            y_train_iloc = apply_split(y, y_train_inst_iloc)
+            y_test_iloc = apply_split(y, y_test_inst_iloc)
             yield y_train_iloc, y_test_iloc
 
     def get_n_splits(self, y: Optional[ACCEPTED_Y_TYPES] = None) -> int:
diff --git a/sktime/utils/multiindex.py b/sktime/utils/multiindex.py
index 38d23175b..a02acc0c0 100644
--- a/sktime/utils/multiindex.py
+++ b/sktime/utils/multiindex.py
@@ -4,6 +4,7 @@
 __author__ = ["fkiraly"]
 __all__ = []
 
+import numpy as np
 import pandas as pd
 
 
@@ -83,3 +84,46 @@ def rename_multiindex(idx, feature_names_out, idx_name="index"):
             'must be one of "flat", "multiindex", "original", "auto", '
             f"but found {feature_names_out}"
         )
+
+
+def apply_split(y, iloc_ix):
+    """Generate iloc indices to split according to first MultiIndex level.
+
+    Applies iloc_ix to the leftmost (0-th) level of a MultiIndex y.
+
+    Parameters
+    ----------
+    y : pd.MultiIndex or pd.Index
+        Index to split, coerced to MultiIndex if not already
+    iloc_ix: 1D np.ndarray of integer
+        iloc indices to apply to the first level of y
+
+    Returns
+    -------
+    y_iloc : ndarray
+        iloc indices for y after applying iloc_ix to the first level
+
+    Examples
+    --------
+    >>> import numpy as np
+    >>> import pandas as pd
+    >>> from sktime.utils.multiindex import apply_split
+    >>> y = pd.MultiIndex.from_tuples([(0, 0), (0, 1), (1, 0), (1, 1)])
+    >>> iloc_ix = np.array([1, 0])
+    >>> apply_split(y, iloc_ix)
+    array([2, 3, 0, 1])
+    """
+    if not isinstance(y, pd.MultiIndex):
+        zeros = [0] * len(y)
+        y = pd.MultiIndex.from_arrays([zeros, y])
+
+    if not isinstance(iloc_ix, np.ndarray):
+        iloc_ix = np.array(iloc_ix)
+
+    inst_ix = y.droplevel(-1).unique()
+    iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)
+
+    y_loc = inst_ix[np.array(iloc_ix)]
+    y_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_loc]
+    y_iloc = np.concatenate(y_np)
+    return y_iloc


Test patch:
diff --git a/sktime/detection/tests/test_all_detectors.py b/sktime/detection/tests/test_all_detectors.py
index 71948219e..13ae66282 100644
--- a/sktime/detection/tests/test_all_detectors.py
+++ b/sktime/detection/tests/test_all_detectors.py
@@ -5,6 +5,7 @@ __all__ = []
 
 import pandas as pd
 
+from sktime.detection._datatypes._check import _is_valid_detection
 from sktime.tests.test_all_estimators import BaseFixtureGenerator, QuickTester
 from sktime.utils._testing.detection import make_detection_problem
 from sktime.utils.validation.detection import check_learning_type, check_task
@@ -54,9 +55,21 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
         X_test = make_detection_problem(
             n_timepoints=10, estimator_type=estimator.get_tag("distribution_type")
         )
-        y_test = estimator.predict(X_test)
-        assert isinstance(y_test, pd.DataFrame)
-        assert isinstance(y_test.index, pd.RangeIndex)
+        y_pred = estimator.predict(X_test)
+
+        detector_type = estimator.get_tag("task")
+        if detector_type in ["anomaly_detection", "change_point_detection"]:
+            expected_y_pred_type = "points"
+        elif detector_type == "segmentation":
+            expected_y_pred_type = "segments"
+        else:
+            raise ValueError(
+                f"Unknown task tag of {estimator_instance}: {detector_type}, "
+                "expected one of ['anomaly_detection', 'change_point_detection', "
+                f"'segmentation'], but found {detector_type}"
+            )
+
+        assert _is_valid_detection(y_pred, type=expected_y_pred_type), y_pred
 
     def test_transform_output_type(self, estimator_instance):
         """Test output type for the transform method."""
@@ -84,10 +97,7 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
             estimator_type=estimator_instance.get_tag("distribution_type"),
         )
         y_pred = estimator_instance.predict_points(X_test)
-        assert isinstance(y_pred, pd.DataFrame)
-        assert isinstance(y_pred.index, pd.RangeIndex)
-        assert "ilocs" in y_pred.columns
-        assert pd.api.types.is_integer_dtype(y_pred["ilocs"].dtype), y_pred
+        assert _is_valid_detection(y_pred, type="points"), y_pred
 
     def test_predict_segments(self, estimator_instance):
         X_train = make_detection_problem(
@@ -101,12 +111,7 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
             estimator_type=estimator_instance.get_tag("distribution_type"),
         )
         y_pred = estimator_instance.predict_segments(X_test)
-        assert isinstance(y_pred, pd.DataFrame)
-        assert isinstance(y_pred.index, pd.RangeIndex)
-        assert "ilocs" in y_pred.columns
-        ilocs_dtype = y_pred["ilocs"].dtype
-        assert isinstance(y_pred["ilocs"].dtype, pd.IntervalDtype)
-        assert pd.api.types.is_integer_dtype(ilocs_dtype.subtype)
+        assert _is_valid_detection(y_pred, type="segments"), y_pred
 
     def test_detector_tags(self, estimator_class):
         """Check the learning_type and task tags are valid."""
diff --git a/sktime/detection/tests/test_base.py b/sktime/detection/tests/test_base.py
index 4b9a8b129..101998826 100644
--- a/sktime/detection/tests/test_base.py
+++ b/sktime/detection/tests/test_base.py
@@ -11,6 +11,7 @@ from sktime.detection.base import BaseDetector
 from sktime.tests.test_switch import run_test_for_class
 
 
+@pytest.mark.xfail(reason="Changed interface, need to update test")
 @pytest.mark.skipif(
     not run_test_for_class(BaseDetector),
     reason="run test only if softdeps are present and incrementally (if requested)",
@@ -118,6 +119,7 @@ def test_change_points_to_segments(change_points, expected_segments, start, end)
     testing.assert_series_equal(actual_segments, expected_segments)
 
 
+@pytest.mark.xfail(reason="Changed interface, need to update test")
 @pytest.mark.skipif(
     not run_test_for_class(BaseDetector),
     reason="run test only if softdeps are present and incrementally (if requested)",
@@ -142,6 +144,7 @@ def test_segments_to_change_points(segments, expected_change_points):
     )
 
 
+@pytest.mark.xfail(reason="Changed interface, need to update test")
 @pytest.mark.skipif(
     not run_test_for_class(BaseDetector),
     reason="run test only if softdeps are present and incrementally (if requested)",
diff --git a/sktime/detection/tests/test_hmm.py b/sktime/detection/tests/test_hmm.py
index 5fb082772..b3d13b5da 100644
--- a/sktime/detection/tests/test_hmm.py
+++ b/sktime/detection/tests/test_hmm.py
@@ -42,7 +42,7 @@ def test_hmm_basic_gauss():
         transition_matrix[ind, ind] = 1 - (1 / (s_len / 14))
     gauss_test = HMM(emi_funcs, transition_matrix)
     gauss_test.fit(gauss_data)
-    predicted_labels = gauss_test.predict(gauss_data)
+    predicted_labels = gauss_test.transform(gauss_data)
     predicted_labels = predicted_labels.iloc[:, 0]
     assert len(predicted_labels == labels) >= 0.95 * len(predicted_labels)
 
@@ -94,7 +94,7 @@ def test_hmm_behaves_as_expected_on_simple_input():
     # generate synthetic data (or of course use your own!)
     obs = asarray([3.7, 3.2, 3.4, 3.6, -5.1, -5.2, -4.9])
     hmm_est = hmm_est.fit(obs)
-    labels = hmm_est.predict(obs)
+    labels = hmm_est.transform(obs)
     labels = labels.values.flatten()
     ground_truth = asarray([0, 0, 0, 0, 1, 1, 1])
     assert array_equal(labels, ground_truth)
diff --git a/sktime/detection/tests/test_hmm_learn.py b/sktime/detection/tests/test_hmm_learn.py
index c8e611f7b..a18e3943f 100644
--- a/sktime/detection/tests/test_hmm_learn.py
+++ b/sktime/detection/tests/test_hmm_learn.py
@@ -27,7 +27,7 @@ def test_GaussianHMM_wrapper():
     hmmlearn_model.fit(X=data)
     sktime_model.fit(X=data)
     hmmlearn_predict = hmmlearn_model.predict(X=data)
-    sktime_predict = sktime_model.predict(X=data).values.flatten()
+    sktime_predict = sktime_model.transform(X=data).values.flatten()
     assert array_equal(hmmlearn_predict, sktime_predict)
 
 
@@ -48,7 +48,7 @@ def test_GMMHMM_wrapper():
     hmmlearn_model.fit(X=data)
     sktime_model.fit(X=data)
     hmmlearn_predict = hmmlearn_model.predict(X=data)
-    sktime_predict = sktime_model.predict(X=data).values.flatten()
+    sktime_predict = sktime_model.transform(X=data).values.flatten()
     assert array_equal(hmmlearn_predict, sktime_predict)
 
 
@@ -69,5 +69,5 @@ def test_PoissonHMM_wrapper():
     hmmlearn_model.fit(X=data)
     sktime_model.fit(X=data)
     hmmlearn_predict = hmmlearn_model.predict(X=data)
-    sktime_predict = sktime_model.predict(X=data).values.flatten()
+    sktime_predict = sktime_model.transform(X=data).values.flatten()
     assert array_equal(hmmlearn_predict, sktime_predict)
diff --git a/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py b/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
index 1f6d5c928..760818b69 100644
--- a/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
+++ b/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
@@ -212,3 +212,34 @@ def test_level_one_data(forecasters, default):
         def_pred = def_frcstr.predict()
         msg = "Node default predictions do not match"
         assert np.all(actual_pred.loc[def_pred.index] == def_pred), msg
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(HierarchyEnsembleForecaster),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_get_fitted_params():
+    """Tests that get_fitted_params works as expected.
+
+    Checks absence of bug #7418.
+    """
+    from sktime.forecasting.compose import HierarchyEnsembleForecaster
+    from sktime.forecasting.naive import NaiveForecaster
+    from sktime.forecasting.trend import PolynomialTrendForecaster, TrendForecaster
+    from sktime.utils._testing.hierarchical import _bottom_hier_datagen
+
+    y = _bottom_hier_datagen(no_bottom_nodes=7, no_levels=2, random_seed=123)
+
+    forecasters = [
+        ("naive", NaiveForecaster(), 0),
+        ("trend", TrendForecaster(), 1),
+    ]
+    forecaster = HierarchyEnsembleForecaster(
+        forecasters=forecasters,
+        by="level",
+        default=PolynomialTrendForecaster(degree=2),
+    )
+    forecaster.fit(y, fh=[1, 2, 3])
+
+    assert forecaster.get_fitted_params()["naive"].is_fitted
+    assert forecaster.get_fitted_params()["trend"].is_fitted
diff --git a/sktime/performance_metrics/detection/tests/__init__.py b/sktime/performance_metrics/detection/tests/__init__.py
new file mode 100644
index 000000000..951487535
--- /dev/null
+++ b/sktime/performance_metrics/detection/tests/__init__.py
@@ -0,0 +1,1 @@
+"""Tests for detection metrics."""
diff --git a/sktime/performance_metrics/detection/tests/test_all_metrics_detection.py b/sktime/performance_metrics/detection/tests/test_all_metrics_detection.py
new file mode 100644
index 000000000..414324fd5
--- /dev/null
+++ b/sktime/performance_metrics/detection/tests/test_all_metrics_detection.py
@@ -0,0 +1,76 @@
+"""Tests for all sktime detection metrics."""
+
+import pandas as pd
+import pytest
+
+from sktime.tests.test_all_estimators import BaseFixtureGenerator, QuickTester
+
+
+class DetectionMetricFixtureGenerator(BaseFixtureGenerator):
+    """Fixture generator for time series detection metric tests.
+
+    Fixtures parameterized
+    ----------------------
+    estimator_class: estimator inheriting from BaseObject
+        ranges over estimator classes not excluded by EXCLUDE_ESTIMATORS, EXCLUDED_TESTS
+    estimator_instance: instance of estimator inheriting from BaseObject
+        ranges over estimator classes not excluded by EXCLUDE_ESTIMATORS, EXCLUDED_TESTS
+        instances are generated by create_test_instance class method
+    scenario: instance of TestScenario
+        ranges over all scenarios returned by retrieve_scenarios
+    """
+
+    # note: this should be separate from TestAllDetectionMetrics
+    #   additional fixtures, parameters, etc should be added here
+    #   TestAllDetectionMetrics should contain the tests only
+
+    estimator_type_filter = "metric_detection"
+
+    fixture_sequence = [
+        "estimator_class",
+        "estimator_instance",
+        "fitted_estimator",
+        "scenario",
+    ]
+
+
+class TestAllDetectionMetrics(DetectionMetricFixtureGenerator, QuickTester):
+    """Module level tests for all sktime detection metrics."""
+
+    def test_evaluate_output(self, estimator_instance):
+        """Test expected output type of evaluate_output."""
+        y_pred = pd.DataFrame({"ilocs": [0, 1, 3, 4, 5]})  # locs are 1, 2, 5, 42, 43
+        y_true = pd.DataFrame({"ilocs": [0, 2, 3]})  # locs are 1, 4, 5
+        X = pd.DataFrame({"foo": [8, 4, 3, 7, 10, 12]}, index=[1, 2, 4, 5, 42, 43])
+
+        metric = estimator_instance
+
+        requires_X = metric.get_tag("requires_X")
+        requires_y_true = metric.get_tag("requires_y_true")
+
+        # test full signature
+        loss = metric(y_true, y_pred, X)
+        assert isinstance(loss, float)
+
+        # test without X
+        if not requires_X:
+            loss_no_X = metric(y_true, y_pred)
+            assert isinstance(loss_no_X, float)
+        else:
+            with pytest.raises(TypeError):
+                metric(y_true, y_pred)
+
+        # test without y_true
+        if not requires_y_true:
+            loss_no_y_true_kwarg = metric(y_pred=y_pred)
+            assert isinstance(loss_no_y_true_kwarg, float)
+
+            loss_no_y_true_posarg = metric(y_pred)
+            assert isinstance(loss_no_y_true_posarg, float)
+
+            assert loss_no_y_true_kwarg == loss_no_y_true_posarg
+        else:
+            with pytest.raises(TypeError):
+                metric(y_pred)
+            with pytest.raises(TypeError):
+                metric(y_pred=y_pred)
diff --git a/sktime/performance_metrics/detection/tests/test_chamfer.py b/sktime/performance_metrics/detection/tests/test_chamfer.py
new file mode 100644
index 000000000..90a8d3017
--- /dev/null
+++ b/sktime/performance_metrics/detection/tests/test_chamfer.py
@@ -0,0 +1,33 @@
+"""Tests for the directed Chamfer distance."""
+
+import pandas as pd
+import pytest
+
+from sktime.performance_metrics.detection._chamfer import DirectedChamfer
+from sktime.tests.test_switch import run_test_for_class
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(DirectedChamfer),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_chamfer():
+    """Test the directed Chamfer distance."""
+    y_pred = pd.DataFrame({"ilocs": [0, 1, 3, 4, 5]})  # locs are 1, 2, 5, 42, 43
+    y_true = pd.DataFrame({"ilocs": [0, 2, 3]})  # locs are 1, 4, 5
+    X = pd.DataFrame({"foo": [8, 4, 3, 7, 10, 12]}, index=[1, 2, 4, 5, 42, 43])
+
+    metric = DirectedChamfer()
+
+    loss1 = metric(y_true, y_pred)
+    assert isinstance(loss1, float)
+    # closest ilocs are 0, 0, 3, 3, 3
+    # absolute distance is 0 + 1 + 0 + 1 + 2 = 4
+    assert loss1 == 4
+
+    loss2 = metric(y_true, y_pred, X)
+    assert isinstance(loss2, float)
+    # predicted locs are 1, 2, 5, 42, 43
+    # closest locs are 1, 1, 5, 5, 5
+    # distances are 0 + 1 + 0 + 37 + 38 = 76
+    assert loss2 == 76
diff --git a/sktime/performance_metrics/detection/tests/test_hausdorff.py b/sktime/performance_metrics/detection/tests/test_hausdorff.py
new file mode 100644
index 000000000..a1954c1e2
--- /dev/null
+++ b/sktime/performance_metrics/detection/tests/test_hausdorff.py
@@ -0,0 +1,33 @@
+"""Tests for the directed Hausdorff distance."""
+
+import pandas as pd
+import pytest
+
+from sktime.performance_metrics.detection._hausdorff import DirectedHausdorff
+from sktime.tests.test_switch import run_test_for_class
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(DirectedHausdorff),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_hausdorff():
+    """Test the directed Hausdorff distance."""
+    y_pred = pd.DataFrame({"ilocs": [0, 1, 3, 4, 5]})  # locs are 1, 2, 5, 42, 43
+    y_true = pd.DataFrame({"ilocs": [0, 2, 3]})  # locs are 1, 4, 5
+    X = pd.DataFrame({"foo": [8, 4, 3, 7, 10, 12]}, index=[1, 2, 4, 5, 42, 43])
+
+    metric = DirectedHausdorff()
+
+    loss1 = metric(y_true, y_pred)
+    assert isinstance(loss1, float)
+    # closest ilocs are 0, 0, 3, 3, 3
+    # absolute distance is max(0, 1, 0, 1, 2) = 2
+    assert loss1 == 2
+
+    loss2 = metric(y_true, y_pred, X)
+    assert isinstance(loss2, float)
+    # predicted locs are 1, 2, 5, 42, 43
+    # closest locs are 1, 1, 5, 5, 5
+    # absolute distance is max(0, 1, 0, 37, 38) = 38
+    assert loss2 == 38
diff --git a/sktime/tests/_config.py b/sktime/tests/_config.py
index c3b3fd8ac..511a236cc 100644
--- a/sktime/tests/_config.py
+++ b/sktime/tests/_config.py
@@ -246,19 +246,6 @@ EXCLUDED_TESTS = {
         "test_persistence_via_pickle",
         "test_save_estimators_to_file",
     ],
-    # The following detectors are not interface compliant. See PR 6958
-    "PoissonHMM": [
-        "test_predict_points",
-        "test_predict_segments",
-        "test_transform_output_type",
-        "test_output_type",
-    ],
-    "HMM": [
-        "test_predict_points",
-        "test_predict_segments",
-        "test_transform_output_type",
-        "test_output_type",
-    ],
     "ClaSPSegmentation": [
         "test_predict_points",
         "test_predict_segments",
@@ -287,18 +274,6 @@ EXCLUDED_TESTS = {
         "test_predict_segments",
         "test_transform_output_type",
     ],
-    "GaussianHMM": [
-        "test_predict_points",
-        "test_predict_segments",
-        "test_transform_output_type",
-        "test_output_type",
-    ],
-    "GMMHMM": [
-        "test_predict_points",
-        "test_predict_segments",
-        "test_transform_output_type",
-        "test_output_type",
-    ],
 }
 
 # exclude tests but keyed by test name
@@ -340,7 +315,6 @@ EXCLUDED_TESTS_BY_TEST = {
         "FittedParamExtractor",
         "ForecastingOptunaSearchCV",
         "FreshPRINCE",
-        "GaussianHMM",
         "GreedyGaussianSegmentation",
         "HCrystalBallAdapter",
         "HIVECOTEV1",
@@ -380,7 +354,6 @@ EXCLUDED_TESTS_BY_TEST = {
         "PlateauFinder",
         "PluginParamsForecaster",
         "PluginParamsTransformer",
-        "PoissonHMM",
         "Prophet",
         "ProphetPiecewiseLinearTrendForecaster",
         "Prophetverse",
diff --git a/sktime/tests/test_class_register.py b/sktime/tests/test_class_register.py
index 3aae18ba2..275561720 100644
--- a/sktime/tests/test_class_register.py
+++ b/sktime/tests/test_class_register.py
@@ -20,51 +20,18 @@ def get_test_class_registry():
         test class registry
         keys are scitypes, values are test classes TestAll[Scitype]
     """
-    from sktime.alignment.tests.test_all_aligners import TestAllAligners
-    from sktime.classification.early_classification.tests.test_all_early_classifiers import (  # noqa E501
-        TestAllEarlyClassifiers,
-    )
-    from sktime.classification.tests.test_all_classifiers import TestAllClassifiers
-    from sktime.detection.tests.test_all_detectors import TestAllDetectors
-    from sktime.dists_kernels.tests.test_all_dist_kernels import (
-        TestAllPairwiseTransformers,
-        TestAllPanelTransformers,
-    )
-    from sktime.forecasting.tests.test_all_forecasters import (
-        TestAllForecasters,
-        TestAllGlobalForecasters,
-    )
-    from sktime.param_est.tests.test_all_param_est import TestAllParamFitters
-    from sktime.regression.tests.test_all_regressors import TestAllRegressors
-    from sktime.split.tests.test_all_splitters import TestAllSplitters
-    from sktime.tests.test_all_estimators import TestAllEstimators, TestAllObjects
-    from sktime.transformations.tests.test_all_transformers import TestAllTransformers
-
-    testclass_dict = dict()
-    # every object in sktime inherits from BaseObject
-    # "object" tests are run for all objects
-    testclass_dict["object"] = TestAllObjects
-    # fittable objects inherit from BaseEstimator
-    # "estimator" tests are run for all estimators
-    # estimators are also objects
-    testclass_dict["estimator"] = TestAllEstimators
-    # more specific base classes
-    # these inherit either from BaseEstimator or BaseObject,
-    # so also imply estimator and object tests, or only object tests
-    testclass_dict["aligner"] = TestAllAligners
-    testclass_dict["classifier"] = TestAllClassifiers
-    testclass_dict["detector"] = TestAllDetectors
-    testclass_dict["early_classifier"] = TestAllEarlyClassifiers
-    testclass_dict["forecaster"] = TestAllForecasters
-    testclass_dict["global_forecaster"] = TestAllGlobalForecasters
-    testclass_dict["param_est"] = TestAllParamFitters
-    testclass_dict["regressor"] = TestAllRegressors
-    # todo 1.0.0 - remove series-annotator
-    testclass_dict["series-annotator"] = TestAllDetectors
-    testclass_dict["splitter"] = TestAllSplitters
-    testclass_dict["transformer"] = TestAllTransformers
-    testclass_dict["transformer-pairwise"] = TestAllPairwiseTransformers
-    testclass_dict["transformer-pairwise-panel"] = TestAllPanelTransformers
+    from sktime.registry._base_classes import _get_base_classes
+
+    base_classes = _get_base_classes()
+
+    testclass_dict = {}
+
+    for base_class in base_classes:
+        scitype_str = base_class.get_class_tag("scitype_name")
+        test_class = base_class.get_test_class()
+
+        if test_class is not None:
+            testclass_dict[scitype_str] = test_class
 
     return testclass_dict
 
diff --git a/sktime/utils/tests/test_multiindex.py b/sktime/utils/tests/test_multiindex.py
index 2023f4d5d..b2b5bbc56 100644
--- a/sktime/utils/tests/test_multiindex.py
+++ b/sktime/utils/tests/test_multiindex.py
@@ -1,10 +1,11 @@
 """Testing multiindex utilities."""
 
+import numpy as np
 import pandas as pd
 import pytest
 
 from sktime.tests.test_switch import run_test_module_changed
-from sktime.utils.multiindex import flatten_multiindex, rename_multiindex
+from sktime.utils.multiindex import apply_split, flatten_multiindex, rename_multiindex
 
 
 @pytest.mark.skipif(
@@ -79,3 +80,21 @@ def test_rename_multiindex():
 
     assert isinstance(orig, pd.Index)
     assert (expected_orig == orig).all()
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.utils.multiindex"]),
+    reason="Run if multiindex module has changed.",
+)
+def test_apply_split():
+    """Test apply_split() and check shapes"""
+    mi = pd.MultiIndex.from_product([["a", "b"], [0, 42]])
+
+    iloc_ix = [1]
+
+    result = apply_split(mi, iloc_ix)
+
+    expected = np.array([2, 3])
+
+    assert isinstance(result, np.ndarray)
+    assert np.array_equal(result, expected)