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 *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
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
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.
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.
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.
# 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 |