MINIROCKET Pytorch

A Very Fast (Almost) Deterministic Transform for Time Series Classification.

This is a Pytorch implementation of MiniRocket developed by Malcolm McLean and Ignacio Oguiza based on:

Dempster, A., Schmidt, D. F., & Webb, G. I. (2020). MINIROCKET: A Very Fast (Almost) Deterministic Transform for Time Series Classification. arXiv preprint arXiv:2012.08791.

Original paper: https://arxiv.org/abs/2012.08791

Original code: https://github.com/angus924/minirocket


source

MiniRocketFeatures


def MiniRocketFeatures(
    c_in, seq_len, num_features:int=10000, max_dilations_per_kernel:int=32, random_state:NoneType=None
):

This is a Pytorch implementation of MiniRocket developed by Malcolm McLean and Ignacio Oguiza

MiniRocket paper citation: @article{dempster_etal_2020, author = {Dempster, Angus and Schmidt, Daniel F and Webb, Geoffrey I}, title = {{MINIROCKET}: A Very Fast (Almost) Deterministic Transform for Time Series Classification}, year = {2020}, journal = {arXiv:2012.08791} } Original paper: https://arxiv.org/abs/2012.08791 Original code: https://github.com/angus924/minirocket


source

get_minirocket_features


def get_minirocket_features(
    o, model, chunksize:int=1024, use_cuda:NoneType=None, to_np:bool=True
):

Function used to split a large dataset into chunks, avoiding OOM error.


source

MiniRocketHead


def MiniRocketHead(
    c_in, c_out, seq_len:int=1, bn:bool=True, fc_dropout:float=0.0
):

Classification/regression head for MiniRocket features.


source

MiniRocket


def MiniRocket(
    c_in, c_out, seq_len, num_features:int=10000, max_dilations_per_kernel:int=32, random_state:NoneType=None,
    bn:bool=True, fc_dropout:int=0
):

PyTorch MiniRocket model with online feature extraction and a linear head.

from tsai.imports import default_device
from fastai.metrics import accuracy
from fastai.callback.tracker import ReduceLROnPlateau
from tsai.data.all import *
from tsai.learner import *
# Offline feature calculation
dsid = 'ECGFiveDays'
X, y, splits = get_UCR_data(dsid, split_data=False)
mrf = MiniRocketFeatures(c_in=X.shape[1], seq_len=X.shape[2]).to(default_device())
X_train = X[splits[0]]  # X_train may either be a np.ndarray or a torch.Tensor
mrf.fit(X_train)
X_tfm = get_minirocket_features(X, mrf)
tfms = [None, TSClassification()]
batch_tfms = TSStandardize(by_var=True)
dls = get_ts_dls(X_tfm, y, splits=splits, tfms=tfms, batch_tfms=batch_tfms, bs=256)
learn = ts_learner(dls, MiniRocketHead, metrics=accuracy)
learn.fit(1, 1e-4, cbs=ReduceLROnPlateau(factor=0.5, min_lr=1e-8, patience=10))
epoch train_loss valid_loss accuracy time
0 0.693147 0.530879 0.752613 00:00
# Online feature calculation
dsid = 'ECGFiveDays'
X, y, splits = get_UCR_data(dsid, split_data=False)
tfms = [None, TSClassification()]
batch_tfms = TSStandardize()
dls = get_ts_dls(X, y, splits=splits, tfms=tfms, batch_tfms=batch_tfms, bs=256)
learn = ts_learner(dls, MiniRocket, metrics=accuracy)
learn.fit_one_cycle(1, 1e-2)
epoch train_loss valid_loss accuracy time
0 0.693147 0.713297 0.502904 00:06