johannfaouzi / pyts

A Python package for time series classification

Home Page:https://pyts.readthedocs.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Expose Markov Transition Matrix from pyts.image.MarkovTransitionField.

y-he2 opened this issue · comments

The Markov Transition Matrix contained in the MTF transformer could be useful in many cases.
It shouldnt be too much work to expose it (as well as the quantile boundaries) by storing it in the transformer once its fitted. This also means that the computation of the Markov Transition Matrix should be done in the fit pass instead of each time the transform is called. i.e. move:
in pyts/pyts/image/mtf.py

    def transform(self, X):
...
        X = check_array(X)
        n_samples, n_timestamps = X.shape
        image_size = self._check_params(n_timestamps)

        discretizer = KBinsDiscretizer(n_bins=self.n_bins,
                                       strategy=self.strategy)
        X_binned = discretizer.fit_transform(X)

        X_mtm = _markov_transition_matrix(X_binned, n_samples,
                                          n_timestamps, self.n_bins)
        sum_mtm = X_mtm.sum(axis=2)
        np.place(sum_mtm, sum_mtm == 0, 1)
        X_mtm /= sum_mtm[:, :, None]
...

into

    def fit(self, X=None, y=None):
        """Pass.
        Parameters
        ----------
        X
            Ignored
        y
            Ignored
        Returns
        -------
        self : object
        """
        return self

Is it possible to implement this?

If there would be a single Markov transition matrix for the whole training set of time series, then it would be computed in the fit method and would be exposed as an attribute.

However, a Markov transition matrix is computed for every time series in the training set, because the bin edges and the transition probabilities are independently computed using the values of each time series. This is what is proposed in the paper introducing this method and thus what is implemented in this package. Did you think that a single Markov transition matrix was computed for the whole training set?

It's not the first time that this issue / question is reported / suggested. Maybe I should highlight this point in the documentation and possibly enable the other behavior (computing a single Markov transition matrix for the whole training set).

Hi, sry for a very late reply.

I understand ur logic that if the matrices are computed once for any input time series, then theres no need to "fit" them as a pre-step.
Still since u inherited the fit, transform structure, kinda makes me urge to make some use of the fit function. Maybe lets some for some specific (prob weird) reason that i want to fit the the transformer once, to a fixed count of time series, store and reuse the underlaying matrices, to transform an other list (same count) of time series. Would this make sense to be implemented instead?
Ofc this would mean that once fit, the transformer's shape would be fixed.

If all of these doesn't make sense, would it still be possible to expose all of the underlaying GMF/MTF matrices?

The fit method is actually needless when you are just using a single estimator, but it's actually needed if you want to use tools from scikit-learn for cross-validation (e.g., sklearn.model_selection.GridSearchCV) or pipelines (e.g., sklearn.pipeline.Pipeline).

Since a lot of transformers in pyts apply the transformation on each time series (i.e., row) independently instead of feature (i.e., column) independently, the fit transform does nothing because doing fit followed by transform would be less efficient than doing just transform (because some piece of code would be run twice to obtain the same results).

Moreover, I think that limiting the transform method to be applied on the same input data than the fit method would be confusing for a lot of people because that's not what is done in standard machine learning: you fit an estimator on the training data and you transform not only the training data but also the validation / test data (basically any sample).

Still since u inherited the fit, transform structure, kinda makes me urge to make some use of the fit function. Maybe lets some for some specific (prob weird) reason that i want to fit the the transformer once, to a fixed count of time series, store and reuse the underlaying matrices, to transform an other list (same count) of time series. Would this make sense to be implemented instead?
Ofc this would mean that once fit, the transformer's shape would be fixed.

For me, it would only make sense if the estimator would learn a single Markov Transition Matrix for all the time series when calling fit. Then, any time series could be transformed into a Markov Transition Field using this single Markov Transition Matrix.

If all of these doesn't make sense, would it still be possible to expose all of the underlaying GMF/MTF matrices?

I'm not sure to understand what you mean. The transform method returns the Gramian Angular Field (GAF) / Markov Transition Field (MTF) for each time series. For GAF, there are no underlying matrices. For MTF, there are the underlying Markov Transition Matrices (MTM) (one for each time series) that are not exposed indeed. Do you want to get the Markov Transition Matrices?

Sorry again for a very late reply.

Its indeed a bit tricky with the whole "fit, transform" scenario. My OP was not coming from the ML fields actually, more like probability analysis.
So, I guess now I see it more clearly that if I would have requested like below in the beginning it had probably made more sense:

  • Yes, what I wanted was the Markov Transition Matrix, so maybe a feature to compute just that, for a single one or set of (produce one for whole set of same scale) time series, as a separate function.
  • As for the GAFs I guess i meant a function to turn them series into the polar coords, although I prob shouldnt have mentioned GAF as the OP was titled MTF/MTMs.

So yeah, what I really wanted was more like functions to compute the intermediate data objects rather than to expose them during the transformation. Although this topic could also belong to a separate feature request instead, or what do you think?