時系列ライブラリDartsを用いてSOTAモデルを簡単に実装しよう！

# 1. はじめに


この記事では、最先端の時系列予測モデルを手軽に実装する方法を紹介します。
Pythonで時系列予測やデータ処理を行うための強力なオープンソースライブラリ、Dartsを活用して、時系列データセットにおけるSOTAモデル（＋他のモデルも）を簡単に実装しましょう！
Dartsは、**時系列データ分析におけるscikit-learn**とも言えるライブラリです。

https://unit8co.github.io/darts/

# 2. 時系列ライブラリDarts

Dartsは、Pythonで時系列予測や時系列データの処理を行うためのオープンソースライブラリです。機械学習モデルや統計モデルを使った時系列予測を容易に行えるように設計されており、さまざまなモデルを同じインターフェースで使用できます。Dartsは主に以下の機能を提供しています。

1.  **時系列データの前処理**: Dartsは、時系列データの前処理や操作を容易にするための機能を提供しています。例えば、データの欠損値を埋める、データの補間、トレンドや季節性の除去、データのスケーリングなどが可能です。
    
2.  **予測モデル**: Dartsは、多くの統計的および機械学習モデルを提供しています。これには、自己回帰モデル（ARIMA、SARIMAなど）、指数平滑法、状態空間モデル（ETS）、Prophet、ニューラルネットワークベースのモデル（LSTM、N-Beats、TCNなど）が含まれます。これらのモデルはすべて同じインターフェースで使用できるため、異なるモデルを簡単に比較することができます。
    
3.  **モデルの評価**: Dartsは、時系列予測モデルの性能を評価するための機能も提供しています。予測誤差を測定するための様々な指標（例えば、平均絶対誤差（MAE）、平均二乗誤差（MSE）、平均二乗対数誤差（MSLE）など）が利用可能です。
    
4.  **バックテスト**: Dartsでは、時系列予測モデルの性能をバックテストする機能も提供されています。これにより、モデルが過去のデータでどのように機能するかを評価し、将来の予測の信頼性を確認できます。
    
5.  **アンサンブル学習**: Dartsは、複数の時系列予測モデルを組み合わせてアンサンブル学習を行う機能も提供しています。これにより、異なるモデルの強みを活かした予測が可能になります。
    


# 3. 時系列予測のSOTA

時系列予測のSOTAモデルはPaper With Code のTime Series Forecastingのページで確認できます。
10種類の時系列データセットが用意されていますが、なんとその半分でNLinearというモデルがSOTAとなっています。（2023/05/10現在）

https://paperswithcode.com/task/time-series-forecasting

上記のページでは、最新の研究成果やトップの手法がランキング形式で表示され、各手法の性能を様々なデータセットや評価指標で比較することができます。また、関連する論文のPDFや、GitHubリポジトリへのリンクが提供されており、研究や実装の参考にすることができます。


- [N-Linearの論文](https://arxiv.org/abs/2205.13504)

- [DartsにおけるN-Linearのドキュメント](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nlinear.html)


# 4. 時系列ライブラリDartsを用いてSOTAモデルを簡単に実装

**Dartsのインストール**

Dartsをインストールするには、Python 3.7以上が必要です。以下のコマンドを実行して、Dartsをインストールしてください。

`pip install darts`

もしくは

`conda install -c conda-forge -c pytorch u8darts-all`



**ソースコード**

全体のソースコードは下記のGitHubにも置いています。

https://github.com/Isaka-code/darts_handson



1.  必要なライブラリのインポート
    
    Dartsから必要なライブラリをインポートします。
    ```python
    import pandas as pd
    from darts import TimeSeries 
    from darts.datasets import AirPassengersDataset
    from darts.metrics import mape
    ```
    
2.  データのロードと可視化
    
    データのロードはcsvから行うこともできますが、今回はAirPassengersDatasetを用います。
    
    ```python
    series = AirPassengersDataset().load()
    series.plot()
    ```
    
   
    
3.  データの分割
    
    データセットをトレーニングデータと検証データに分割します。
    
    ```python
    train, val = series.split_before(pd.Timestamp("19580101"))
    train.plot(label="training")
    val.plot(label="validation")
    ```
    
 
    
4.  学習と評価
    
    適切な予測モデルを選択し、トレーニングデータを用いて学習を行います。
    また、学習したモデルを使って予測を行い、MAPEを用いてモデルの性能を評価します。
    今回は、SOTAモデルであるN-Linearに加えて、ExponentialSmoothing、NBEATSModel、Facebook Prophetでも試してみます。
    
    
    ```python
    # N-Linear
    from darts.models.forecasting.nlinear import NLinearModel
    
    nlinear_model = NLinearModel(input_chunk_length=24, output_chunk_length=12)
    nlinear_model.fit(train)
    nlinear_forecast = nlinear_model.predict(36)
    
    series.plot(label="actual")
    nlinear_forecast.plot(label="N-Linear forecast")
    
    print("MAPE:", mape(nlinear_forecast, val))
    ```

    ```python
    # ExponentialSmoothing
    from darts.models import ExponentialSmoothing
    
    exponential_smoothing_model = ExponentialSmoothing() 
    exponential_smoothing_model.fit(train)
    exponential_smoothing_forecast = exponential_smoothing_model.predict(36)
    
    series.plot(label="actual")
    exponential_smoothing_forecast.plot(label="ExponentialSmoothing forecast")
    
    print("MAPE:", mape(exponential_smoothing_forecast, val))
    ```

    ```python
    # NBEATSModel
    from darts.models import NBEATSModel
    
    nbeats_model = NBEATSModel(input_chunk_length=24, output_chunk_length=12)
    nbeats_model.fit(train)
    nbeats_forecast = nbeats_model.predict(36)
    
    series.plot(label="actual")
    nbeats_forecast.plot(label="N-BEATS forecast")
    
    print("MAPE:", mape(nbeats_forecast, val))
    ```

    ```python
    # Facebook Prophet
    from darts.models import Prophet
    
    prophet_model = Prophet()
    prophet_model.fit(train)
    prophet_forecast = prophet_model.predict(36)
    
    series.plot(label="actual")
    prophet_forecast.plot(label="Prophet forecast")
    
    print("MAPE:", mape(prophet_forecast, val))
    ```

    

# 5. まとめ

この記事では、時系列データセットにおけるSOTAモデルを簡単に実装する方法を紹介しました。実装には、Pythonで時系列予測や時系列データの処理を行うためのオープンソースライブラリであるDartsを使用しました。

Dartsは、機械学習モデルや統計モデルを使った時系列予測を容易に行えるように設計されており、今回紹介したもの以外にも、非常に充実したクイックスタートや時系列予測におけるTransformerモデルのチュートリアルなど素晴らしいドキュメントが用意されています。良かったら見てみてください！

**クイックスタート**

https://unit8co.github.io/darts/quickstart/00-quickstart.html

**Transformerモデルのチュートリアル**

https://unit8co.github.io/darts/examples/06-Transformer-examples.html