Repository: sktime/sktime

Issue:
[BUG] `LSTMFCNClassifier` `load_model` error: object has no attribute 'model_'
**Describe the bug**
error : 'LSTMFCNClassifier' object has no attribute 'model_'


**To Reproduce**
<!--
Add a Minimal, Complete, and Verifiable example (for more details, see e.g. https://stackoverflow.com/help/mcve

If the code is too long, feel free to put it in a public gist and link it in the issue: https://gist.github.com
-->

```python
from sktime.classification.deep_learning.lstmfcn import LSTMFCNClassifier
from sktime.utils import mlflow_sktime  
from sktime.datasets import load_italy_power_demand
X_train, y_train = load_italy_power_demand(split="train", return_type="numpy3D")
X_new, _ = load_italy_power_demand(split="test", return_type="numpy3D")
classifier=LSTMFCNClassifier(verbose=2,n_epochs=5)
classifier.fit(X_train,y_train)
mlflow_sktime.save_model(sktime_model=classifier,path='classifier')
classifier=mlflow_sktime.load_model(model_uri='classifier') 
classifier.predict(X_new)
```



**Versions**
sktime 0.22.0

<!-- Thanks for contributing! -->


Discussion:

Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index d14d64c52..3e1edaf2c 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -2376,6 +2376,15 @@
         "code"
       ]
     },
+    {
+      "login": "sz85512678",
+      "name": "Zhen Shao",
+      "avatar_url": "https://avatars.githubusercontent.com/sz85512678",
+      "profile": "https://github.com/sz85512678",
+      "contributions": [
+        "code"
+      ]
+    },
     {
       "login": "Vasudeva-bit",
       "name": "Vasudeva Kilaru",
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index fd80fae90..e14c2c8e4 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -2,7 +2,7 @@ Contributors
 ============
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-239-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-240-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!
@@ -270,15 +270,16 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
     <tr>
       <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/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>
-      <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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chizzi25"><img src="https://avatars3.githubusercontent.com/u/67911243?v=4?s=100" width="100px;" alt="chizzi25"/><br /><sub><b>chizzi25</b></sub></a><br /><a href="#blog-chizzi25" title="Blogposts">📝</a></td>
@@ -287,9 +288,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/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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/matteogales"><img src="https://avatars0.githubusercontent.com/u/9269326?v=4?s=100" width="100px;" alt="matteogales"/><br /><sub><b>matteogales</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=matteogales" title="Code">💻</a> <a href="#design-matteogales" title="Design">🎨</a> <a href="#ideas-matteogales" title="Ideas, Planning, & Feedback">🤔</a></td>
       <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>
@@ -298,9 +299,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/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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedazeren"><img src="https://avatars3.githubusercontent.com/u/63582874?v=4?s=100" width="100px;" alt="vedazeren"/><br /><sub><b>vedazeren</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vincent-nich12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="vincent-nich12"/><br /><sub><b>vincent-nich12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vincent-nich12" title="Code">💻</a></td>
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index 268a3bbb6..0053b0290 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -253,7 +253,7 @@ Benchmarking, Metrics, Splitters
 Forecasting
 ^^^^^^^^^^^
 
-* [BUG] fix ``STLForecaster`` tag ``ignores-exogenous-X`` to be correctly set for composites (:pr:`5365`) :user:`yarnabrina`
+* [BUG] fix ``STLForecaster`` tag ``ignores-exogeneous-X`` to be correctly set for composites (:pr:`5365`) :user:`yarnabrina`
 * [BUG] ``statsforecast 1.6.0`` compatibility - in ``statsforecast`` adapter, fixing ``RuntimeError: dictionary changed size during iteration`` (:pr:`5317`) :user:`arnaujc91`
 * [BUG] ``statsforecast 1.6.0`` compatibility - fix argument differences between ``sktime`` and ``statsforecast`` (:pr:`5393`) :user:`luca-miniati`
 * [BUG] Fix ``ARCH._check_predict_proba`` (:pr:`5384`) :user:`Vasudeva-bit`
diff --git a/sktime/forecasting/compose/_pipeline.py b/sktime/forecasting/compose/_pipeline.py
index a86242c75..b802dfa38 100644
--- a/sktime/forecasting/compose/_pipeline.py
+++ b/sktime/forecasting/compose/_pipeline.py
@@ -843,6 +843,21 @@ class TransformedTargetForecaster(_Pipeline):
         self.clone_tags(self.forecaster_, tags_to_clone)
         self._anytagis_then_set("fit_is_empty", False, True, self.steps_)
 
+        # above, we cloned the ignores-exogeneous-X tag,
+        # but we also need to check whether X is used as y in some transformer
+        # in this case X is not ignored by the pipe, even if the forecaster ignores it
+        # logic below checks whether there is at least one such transformer
+        # if there is, we override the ignores-exogeneous-X tag to False
+        # also see discussion in bug issue #5518
+        pre_ts = self.transformers_pre_
+        post_ts = self.transformers_post_
+        pre_use_y = [est.get_tag("y_inner_mtype") != "None" for _, est in pre_ts]
+        post_use_y = [est.get_tag("y_inner_mtype") != "None" for _, est in post_ts]
+        any_t_use_y = any(pre_use_y) or any(post_use_y)
+
+        if any_t_use_y:
+            self.set_tags(**{"ignores-exogeneous-X": False})
+
     @property
     def forecaster_(self):
         """Return reference to the forecaster in the pipeline.
diff --git a/sktime/transformations/panel/signature_based/_augmentations.py b/sktime/transformations/panel/signature_based/_augmentations.py
index 0a3d2305e..77508cb9e 100644
--- a/sktime/transformations/panel/signature_based/_augmentations.py
+++ b/sktime/transformations/panel/signature_based/_augmentations.py
@@ -43,11 +43,11 @@ def _make_augmentation_pipeline(augmentation_list):
     if augmentation_list is not None:
         if isinstance(augmentation_list, str):
             augmentation_list = (augmentation_list,)
-    assert all(
-        [x in list(AUGMENTATIONS.keys()) for x in augmentation_list]
-    ), "augmentation_list must only contain string elements from {}. Given: {}.".format(
-        list(AUGMENTATIONS.keys()), augmentation_list
-    )
+        if not [x in list(AUGMENTATIONS.keys()) for x in augmentation_list]:
+            raise ValueError(
+                "augmentation_list must only contain string elements from "
+                f" {list(AUGMENTATIONS.keys())}. Found: {augmentation_list}"
+            )
 
     # Setup pipeline
     if augmentation_list is not None:
diff --git a/sktime/transformations/panel/signature_based/_compute.py b/sktime/transformations/panel/signature_based/_compute.py
index c75269b8e..9d2ee3fa2 100644
--- a/sktime/transformations/panel/signature_based/_compute.py
+++ b/sktime/transformations/panel/signature_based/_compute.py
@@ -45,6 +45,7 @@ class _WindowSignatureTransform(BaseTransformer):
         sig_tfm=None,
         sig_depth=None,
         rescaling=None,
+        backend=None,
     ):
         super().__init__()
         self.window_name = window_name
@@ -54,6 +55,7 @@ class _WindowSignatureTransform(BaseTransformer):
         self.sig_tfm = sig_tfm
         self.sig_depth = sig_depth
         self.rescaling = rescaling
+        self.backend = backend
 
         self.window = _window_getter(
             self.window_name, self.window_depth, self.window_length, self.window_step
@@ -62,6 +64,9 @@ class _WindowSignatureTransform(BaseTransformer):
     def _transform(self, X, y=None):
         import esig
 
+        if self.backend == "iisignature":
+            esig.set_backend("iisignature")
+
         depth = self.sig_depth
         data = np.swapaxes(X, 1, 2)
 
diff --git a/sktime/transformations/panel/signature_based/_signature_method.py b/sktime/transformations/panel/signature_based/_signature_method.py
index 0ef27595f..2271f064e 100644
--- a/sktime/transformations/panel/signature_based/_signature_method.py
+++ b/sktime/transformations/panel/signature_based/_signature_method.py
@@ -9,6 +9,8 @@ from sktime.transformations.panel.signature_based._augmentations import (
 from sktime.transformations.panel.signature_based._compute import (
     _WindowSignatureTransform,
 )
+from sktime.utils.validation._dependencies import _check_soft_dependencies
+from sktime.utils.warnings import warn
 
 
 class SignatureTransformer(BaseTransformer):
@@ -19,19 +21,34 @@ class SignatureTransformer(BaseTransformer):
 
     Parameters
     ----------
-    augmentation_list: tuple of strings, contains the augmentations to be
-        applied before application of the signature transform.
-    window_name: str, The name of the window transform to apply.
-    window_depth: int, The depth of the dyadic window. (Active only if
-        `window_name == 'dyadic'`).
-    window_length: int, The length of the sliding/expanding window. (Active
-        only if `window_name in ['sliding, 'expanding']`.
-    window_step: int, The step of the sliding/expanding window. (Active
-        only if `window_name in ['sliding, 'expanding']`.
-    rescaling: str or None, The method of signature rescaling.
-    sig_tfm: str, String to specify the type of signature transform. One of:
-        ['signature', 'logsignature']).
-    depth: int, Signature truncation depth.
+    augmentation_list: list or tuple of strings, possible strings are
+        ['leadlag', 'ir', 'addtime', 'cumsum', 'basepoint']
+        Augmentations to apply to the data before computing the signature.
+        The order of the augmentations is the order in which they are applied.
+        default: ('basepoint', 'addtime')
+    window_name: str, one of ``['global', 'sliding', 'expanding', 'dyadic']``
+        default: 'dyadic'
+        Type of the window to use for the signature transform.
+    window_depth: int, default=3
+        The depth of the dyadic window.
+        Ignored unless ``window_name`` is ``'dyadic'``.
+    window_length: None (default) or int
+        The length of the sliding/expanding window. (Active
+        Ignored unless ``window_name`` is one of ``['sliding, 'expanding']``.
+    window_step: None (default) or int
+        The step of the sliding/expanding window.
+        Ignored unless ``window_name`` is one of ``['sliding, 'expanding']``.
+    rescaling: None (default) or str, "pre" or "post",
+        None: No rescaling is applied.
+        "pre": rescale the path last signature term should be roughly O(1)
+        "post": Rescales the output signature by multiplying the depth-d term by d!.
+            Aim is that every term becomes ~O(1).
+    sig_tfm: str, one of ``['signature', 'logsignature']``. default: ``'signature'``
+        The type of signature transform to use, plain or logaritmic.
+    depth: int, default=4
+        Signature truncation depth.
+    backend: str, one of: ``'esig'`` (default), or ``'iisignature'``.
+        The backend to use for signature computation.
 
     Attributes
     ----------
@@ -62,6 +79,7 @@ class SignatureTransformer(BaseTransformer):
         rescaling=None,
         sig_tfm="signature",
         depth=4,
+        backend="esig",
     ):
         self.augmentation_list = augmentation_list
         self.window_name = window_name
@@ -71,8 +89,27 @@ class SignatureTransformer(BaseTransformer):
         self.rescaling = rescaling
         self.sig_tfm = sig_tfm
         self.depth = depth
+        self.backend = backend
 
         super().__init__()
+
+        if backend == "esig":
+            _check_soft_dependencies("esig")
+        elif backend == "iisignature":
+            _check_soft_dependencies("iisignature")
+            warn(
+                "iisignature backend of SignatureTransformer is experimental "
+                "and not systematically tested, due to lack of stable installation "
+                "process for iisignature via pip. Kindly exercise caution, "
+                "and report any issues on the sktime issue tracker.",
+                stacklevel=2,
+            )
+        else:
+            raise ValueError(
+                "Error in SignatureTransformer, backend "
+                "must be one of 'esig' or 'iisignature'"
+            )
+
         self.setup_feature_pipeline()
 
     def setup_feature_pipeline(self):
@@ -86,6 +123,7 @@ class SignatureTransformer(BaseTransformer):
             sig_tfm=self.sig_tfm,
             sig_depth=self.depth,
             rescaling=self.rescaling,
+            backend=self.backend,
         )
 
         # The so-called 'signature method' as defined in the reference paper
diff --git a/sktime/utils/mlflow_sktime.py b/sktime/utils/mlflow_sktime.py
index 2fe1f6c8c..ebc6f1086 100644
--- a/sktime/utils/mlflow_sktime.py
+++ b/sktime/utils/mlflow_sktime.py
@@ -28,12 +28,12 @@ mlflow.pyfunc
     `{"predict_method": {"predict": {}, "predict_interval": {"coverage": [0.1, 0.9]}}`.
     `Dict[str, list]`, with default parameters in predict method, for example
     `{"predict_method": ["predict", "predict_interval"}` (Note: when including
-    `predict_proba` method the former approach must be followed as `quantiles`
+    `predict_proba` method the former appraoch must be followed as `quantiles`
     parameter has to be provided by the user). If no prediction config is defined
     `pyfunc.predict()` will return output from sktime `predict()` method.
 """
 
-__author__ = ["benjaminbluhm"]
+__author__ = ["benjaminbluhm", "achieveordie"]
 __all__ = [
     "get_default_pip_requirements",
     "get_default_conda_env",
@@ -44,18 +44,15 @@ __all__ = [
 
 import logging
 import os
-import pickle
 
 import pandas as pd
 import yaml
 
 import sktime
 from sktime import utils
+from sktime.base._serialize import load
 from sktime.utils.multiindex import flatten_multiindex
-from sktime.utils.validation._dependencies import (
-    _check_mlflow_dependencies,
-    _check_soft_dependencies,
-)
+from sktime.utils.validation._dependencies import _check_mlflow_dependencies
 
 if _check_mlflow_dependencies(severity="warning"):
     from mlflow import pyfunc
@@ -261,7 +258,7 @@ def save_model(
     if input_example is not None:
         _save_example(mlflow_model, input_example, path)
 
-    model_data_subpath = "model.pkl"
+    model_data_subpath = "model"
     model_data_path = os.path.join(path, model_data_subpath)
     _save_model(
         sktime_model, model_data_path, serialization_format=serialization_format
@@ -526,22 +523,12 @@ def _save_model(model, path, serialization_format):
     from mlflow.exceptions import MlflowException
     from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
 
-    with open(path, "wb") as out:
-        if serialization_format == SERIALIZATION_FORMAT_PICKLE:
-            pickle.dump(model, out)
-        elif serialization_format == SERIALIZATION_FORMAT_CLOUDPICKLE:
-            _check_soft_dependencies("cloudpickle", severity="error")
-            import cloudpickle
-
-            cloudpickle.dump(model, out)
-        else:
-            raise MlflowException(
-                message="Unrecognized serialization format: "
-                "{serialization_format}".format(
-                    serialization_format=serialization_format
-                ),
-                error_code=INTERNAL_ERROR,
-            )
+    if serialization_format not in SUPPORTED_SERIALIZATION_FORMATS:
+        raise MlflowException(
+            message="Unrecognized serialization format: " f"{serialization_format}.",
+            error_code=INTERNAL_ERROR,
+        )
+    model.save(path=path, serialization_format=serialization_format)
 
 
 def _load_model(path, serialization_format):
@@ -562,14 +549,7 @@ def _load_model(path, serialization_format):
             error_code=INVALID_PARAMETER_VALUE,
         )
 
-    with open(path, "rb") as pickled_model:
-        if serialization_format == SERIALIZATION_FORMAT_PICKLE:
-            return pickle.load(pickled_model)
-        elif serialization_format == SERIALIZATION_FORMAT_CLOUDPICKLE:
-            _check_soft_dependencies("cloudpickle", severity="error")
-            import cloudpickle
-
-            return cloudpickle.load(pickled_model)
+    return load(path)
 
 
 def _load_pyfunc(path):


Test patch:
diff --git a/sktime/forecasting/compose/tests/test_pipeline.py b/sktime/forecasting/compose/tests/test_pipeline.py
index 334c445d7..294abf0c4 100644
--- a/sktime/forecasting/compose/tests/test_pipeline.py
+++ b/sktime/forecasting/compose/tests/test_pipeline.py
@@ -705,3 +705,47 @@ def test_featurizer_forecastingpipeline_logic():
 
     forecaster.fit(y_train, X=X_train, fh=[1])  # try to forecast next year
     forecaster.predict(X=X_test)  # dummy X to predict next year
+
+
+def test_exogenousx_ignore_tag_set():
+    """Tests that TransformedTargetForecaster sets X tag for feature selection.
+
+    If the forecaster ignores X, but the feature selector does not, then the
+    ignores-exogeneous-X tag should be correctly set to False, not True.
+
+    This is the failure case in bug report #5518.
+
+    More generally, the tag should be set to True iff all steps in the pipeline
+    ignore X.
+    """
+    from sktime.forecasting.compose import YfromX
+    from sktime.transformations.series.feature_selection import FeatureSelection
+
+    fcst_does_not_ignore_x = YfromX.create_test_instance()
+    fcst_ignores_x = NaiveForecaster()
+
+    trafo_ignores_x = ExponentTransformer()
+    trafo_does_not_ignore_x = FeatureSelection()
+
+    # check that ignores-exogeneous-X tag is set correctly
+    pipe1 = trafo_ignores_x * fcst_does_not_ignore_x
+    pipe2 = trafo_ignores_x * fcst_ignores_x
+    pipe3 = trafo_does_not_ignore_x * fcst_does_not_ignore_x
+    pipe4 = trafo_does_not_ignore_x * fcst_ignores_x
+    pipe5 = trafo_ignores_x * trafo_does_not_ignore_x * fcst_does_not_ignore_x
+    pipe6 = trafo_ignores_x * trafo_does_not_ignore_x * fcst_ignores_x
+    pipe7 = trafo_ignores_x * trafo_ignores_x * fcst_does_not_ignore_x
+    pipe8 = trafo_ignores_x * fcst_ignores_x * trafo_does_not_ignore_x
+    pipe9 = trafo_does_not_ignore_x * fcst_ignores_x * trafo_ignores_x
+    pipe10 = trafo_ignores_x * fcst_ignores_x * trafo_ignores_x
+
+    assert not pipe1.get_tag("ignores-exogeneous-X")
+    assert pipe2.get_tag("ignores-exogeneous-X")
+    assert not pipe3.get_tag("ignores-exogeneous-X")
+    assert not pipe4.get_tag("ignores-exogeneous-X")
+    assert not pipe5.get_tag("ignores-exogeneous-X")
+    assert not pipe6.get_tag("ignores-exogeneous-X")
+    assert not pipe7.get_tag("ignores-exogeneous-X")
+    assert not pipe8.get_tag("ignores-exogeneous-X")
+    assert not pipe9.get_tag("ignores-exogeneous-X")
+    assert pipe10.get_tag("ignores-exogeneous-X")
diff --git a/sktime/utils/tests/test_mlflow_sktime_model_export.py b/sktime/utils/tests/test_mlflow_sktime_model_export.py
index 6143ae5ea..6bed6a1ee 100644
--- a/sktime/utils/tests/test_mlflow_sktime_model_export.py
+++ b/sktime/utils/tests/test_mlflow_sktime_model_export.py
@@ -1,6 +1,6 @@
 """Tests for mlflow-sktime custom model flavor."""
 
-__author__ = ["benjaminbluhm"]
+__author__ = ["benjaminbluhm", "achieveordie"]
 
 import os
 import sys
@@ -11,7 +11,7 @@ import numpy as np
 import pandas as pd
 import pytest
 
-from sktime.datasets import load_airline, load_longley
+from sktime.datasets import load_airline, load_arrow_head, load_longley
 from sktime.forecasting.arima import AutoARIMA
 from sktime.forecasting.naive import NaiveForecaster
 from sktime.split import temporal_train_test_split
@@ -77,6 +77,14 @@ def test_data_longley():
     return y_train, y_test, X_train, X_test
 
 
+@pytest.fixture(scope="module")
+def test_data_arrow_head():
+    """Create sample data for univariate classification."""
+    X_train, y_train = load_arrow_head(split="TRAIN")
+    X_test, y_test = load_arrow_head(split="TEST")
+    return y_train.astype(int), y_test.astype(int), X_train, X_test
+
+
 @pytest.fixture(scope="module")
 def auto_arima_model(test_data_airline):
     """Create instance of fitted auto arima model."""
@@ -85,6 +93,22 @@ def auto_arima_model(test_data_airline):
     )
 
 
+@pytest.mark.skipif(
+    not _check_soft_dependencies("tensorflow", severity="none"),
+    reaons="skip test if required soft dependency is not available.",
+)
+@pytest.fixture(scope="module")
+def cnn_model(test_data_arrow_head):
+    """Create an instance of fitted ResNet Classifier model."""
+    from sktime.classification.deep_learning.cnn import CNNClassifier
+
+    y_train, _, X_train, _ = test_data_arrow_head
+
+    return CNNClassifier(n_epochs=1, n_conv_layers=1, kernel_size=3).fit(
+        X_train, y_train
+    )
+
+
 @pytest.fixture(scope="module")
 def naive_forecaster_model_with_regressor(test_data_longley):
     """Create instance of fitted naive forecaster model."""
@@ -168,6 +192,31 @@ def test_auto_arima_model_pyfunc_output(
     np.testing.assert_array_equal(model_predictions.values, pyfunc_predict.values)
 
 
+@pytest.mark.skipif(
+    not _check_soft_dependencies("mlflow", severity="none"),
+    reason="skip test if required soft dependency not available",
+)
+@pytest.mark.parametrize("serialization_format", ["pickle", "cloudpickle"])
+def test_cnn_model_save_and_load(
+    cnn_model, test_data_arrow_head, model_path, serialization_format
+):
+    """Test saving and loading of DL sktime estimator."""
+    from sktime.utils import mlflow_sktime
+
+    mlflow_sktime.save_model(
+        sktime_model=cnn_model,
+        path=model_path,
+        serialization_format=serialization_format,
+    )
+    loaded_model = mlflow_sktime.load_model(model_uri=model_path)
+
+    _, _, _, X_test = test_data_arrow_head
+
+    np.testing.assert_array_almost_equal(
+        cnn_model.predict(X_test), loaded_model.predict(X_test)
+    )
+
+
 @pytest.mark.skipif(
     not _check_soft_dependencies("mlflow", severity="none"),
     reason="skip test if required soft dependency not available",