LongxingTan / Time-series-prediction

tfts: Time Series Deep Learning Models in TensorFlow
https://time-series-prediction.readthedocs.io/en/latest/
MIT License
825 stars 164 forks source link
deep-learning forecasting keras-forecasting keras-prediction keras-time-series machine-learning neural-network prediction seq2seq tensorflow tf2 time-series time-series-forecast time-series-forecasting timeseries transformer wavenet


[![LICENSE][license-image]][license-url] [![PyPI Version][pypi-image]][pypi-url] [![Build Status][build-image]][build-url] [![Lint Status][lint-image]][lint-url] [![Docs Status][docs-image]][docs-url] [![Code Coverage][coverage-image]][coverage-url] [![Contributing][contributing-image]][contributing-url] **[Documentation](https://time-series-prediction.readthedocs.io)** | **[Tutorials](https://time-series-prediction.readthedocs.io/en/latest/tutorials.html)** | **[Release Notes](https://time-series-prediction.readthedocs.io/en/latest/CHANGELOG.html)** | **[中文](https://github.com/LongxingTan/Time-series-prediction/blob/master/README_CN.md)** **TFTS** (TensorFlow Time Series) is an easy-to-use time series package, supporting the classical and latest deep learning methods in TensorFlow or Keras. - Support sota performance for time series task (prediction, classification, anomaly detection) - Provide advanced deep learning models for industry, research and competition - Documentation lives at [time-series-prediction.readthedocs.io](https://time-series-prediction.readthedocs.io) ## Tutorial **Installation** - python >= 3.7 - tensorflow >= 2.4 ```shell pip install tfts ``` **Quick start** [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1LHdbrXmQGBSQuNTsbbM5-lAk5WENWF-Q?usp=sharing) [![Open in Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://www.kaggle.com/code/tanlongxing/tensorflow-time-series-starter-tfts/notebook) ```python import matplotlib.pyplot as plt import tfts from tfts import AutoModel, AutoConfig, KerasTrainer train_length = 24 predict_length = 8 (x_train, y_train), (x_valid, y_valid) = tfts.get_data("sine", train_length, predict_length, test_size=0.2) model_name_or_path = 'seq2seq' config = AutoConfig.for_model(model_name_or_path) model = AutoModel.from_config(config, predict_length=predict_length) trainer = KerasTrainer(model) trainer.train((x_train, y_train), (x_valid, y_valid), n_epochs=3) pred = trainer.predict(x_valid) trainer.plot(history=x_valid, true=y_valid, pred=pred) plt.show() ``` **Prepare your own data** You could train your own data by preparing 3D data as inputs, for both inputs and targets - option1 `np.ndarray` - option2 `tf.data.Dataset` Encoder only model inputs ```python import numpy as np from tfts import AutoConfig, AutoModel, KerasTrainer train_length = 49 predict_length = 10 n_feature = 2 x_train = np.random.rand(1, train_length, n_feature) # inputs: (batch, train_length, feature) y_train = np.random.rand(1, predict_length, 1) # target: (batch, predict_length, 1) x_valid = np.random.rand(1, train_length, n_feature) y_valid = np.random.rand(1, predict_length, 1) config = AutoConfig.for_model('rnn') model = AutoModel.from_config(config, predict_length=predict_length) trainer = KerasTrainer(model) trainer.train(train_dataset=(x_train, y_train), valid_dataset=(x_valid, y_valid), n_epochs=1) ``` Encoder-decoder model inputs ```python # option1: np.ndarray import numpy as np from tfts import AutoConfig, AutoModel, KerasTrainer train_length = 49 predict_length = 10 n_encoder_feature = 2 n_decoder_feature = 3 x_train = ( np.random.rand(1, train_length, 1), # inputs: (batch, train_length, 1) np.random.rand(1, train_length, n_encoder_feature), # encoder_feature: (batch, train_length, encoder_features) np.random.rand(1, predict_length, n_decoder_feature), # decoder_feature: (batch, predict_length, decoder_features) ) y_train = np.random.rand(1, predict_length, 1) # target: (batch, predict_length, 1) x_valid = ( np.random.rand(1, train_length, 1), np.random.rand(1, train_length, n_encoder_feature), np.random.rand(1, predict_length, n_decoder_feature), ) y_valid = np.random.rand(1, predict_length, 1) config = AutoConfig.for_model("seq2seq") model = AutoModel.from_config(config, predict_length=predict_length) trainer = KerasTrainer(model) trainer.train((x_train, y_train), (x_valid, y_valid), n_epochs=1) ``` ```python # option2: tf.data.Dataset import tensorflow as tf from tfts import AutoConfig, AutoModel, KerasTrainer class FakeReader(object): def __init__(self, predict_length): train_length = 49 n_encoder_feature = 2 n_decoder_feature = 3 self.x = np.random.rand(15, train_length, 1) self.encoder_feature = np.random.rand(15, train_length, n_encoder_feature) self.decoder_feature = np.random.rand(15, predict_length, n_decoder_feature) self.target = np.random.rand(15, predict_length, 1) def __len__(self): return len(self.x) def __getitem__(self, idx): return { "x": self.x[idx], "encoder_feature": self.encoder_feature[idx], "decoder_feature": self.decoder_feature[idx], }, self.target[idx] def iter(self): for i in range(len(self.x)): yield self[i] predict_length = 10 train_reader = FakeReader(predict_length=predict_length) train_loader = tf.data.Dataset.from_generator( train_reader.iter, ({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32), ) train_loader = train_loader.batch(batch_size=1) valid_reader = FakeReader(predict_length=predict_length) valid_loader = tf.data.Dataset.from_generator( valid_reader.iter, ({"x": tf.float32, "encoder_feature": tf.float32, "decoder_feature": tf.float32}, tf.float32), ) valid_loader = valid_loader.batch(batch_size=1) config = AutoConfig.for_model("seq2seq") model = AutoModel.from_config(config, predict_length=predict_length) trainer = KerasTrainer(model) trainer.train(train_dataset=train_loader, valid_dataset=valid_loader, n_epochs=1) ``` **Prepare custom model config** ```python import tensorflow as tf import tfts from tfts import AutoModel, AutoConfig config = AutoConfig.for_model('rnn') print(config) config.rnn_hidden_size = 128 model = AutoModel.from_config(config, predict_length=7, ) ``` **Build your own model**
Full list of model tfts supported using AutoModel - rnn - tcn - bert - nbeats - seq2seq - wavenet - transformer - informer
You could build the custom model based on tfts, especially - add custom-defined embeddings for categorical variables - add custom-defined head layers for classification or anomaly task ```python import tensorflow as tf from tensorflow.keras.layers import Input, Dense from tfts import AutoModel, AutoConfig def build_model(): train_length = 24 train_features = 15 predict_length = 16 inputs = Input([train_length, train_features]) config = AutoConfig.for_model("seq2seq") backbone = AutoModel.from_config(config, predict_length=predict_length) outputs = backbone(inputs) outputs = Dense(1, activation="sigmoid")(outputs) model = tf.keras.Model(inputs=inputs, outputs=outputs) model.compile(loss="mse", optimizer="rmsprop") return model ``` ## Examples - [TFTS-Bert](https://github.com/LongxingTan/KDDCup2022-Baidu) wins the **3rd place** in KDD Cup 2022-wind power forecasting - [TFTS-Seq2seq](https://github.com/LongxingTan/Data-competitions/tree/master/tianchi-enso-prediction) wins the **4th place** in Tianchi-ENSO prediction 2021 For other DL frameworks, try [pytorch-forecasting](https://github.com/jdb78/pytorch-forecasting), [gluonts](https://github.com/awslabs/gluonts), [paddlets](https://github.com/PaddlePaddle/PaddleTS) ## Citation If you find tfts project useful in your research, please consider cite: ``` @misc{tfts2020, author = {Longxing Tan}, title = {Time series prediction}, year = {2020}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/longxingtan/time-series-prediction}}, } ```