時系列データの交差検証(クロスバリデーション)は交差検証とはいえないし、良い方法でもないらしい

> この記事は、以下のzenn.devのリンク先の内容と同一です
> https://zenn.dev/skata/articles/20241204-tscv

## 概要

時系列データ、あるいは**独立かつ同一の分布** (i.i.d.) の仮定が成立しない、観測点どうしで自己相関のあるデータに対する予測モデルの交差検証(クロスバリデーション)について書きます。情報量規準との関連まで書きたかったけど時間がないので時系列データとクロスバリデーションについてだけ書きます。

本文ではまず、最初のセクション1では交差検証がなんであるかを確認したうえで、時系列データは交差検証法の想定しているものではなく、そのまま使うことが難しいことを直感的に説明します。次のセクション2では、これまで提案された様々な時系列データに対する予測誤差の評価方法を紹介します。セクション3では、これらの性能を実験で検証した研究の紹介をします。この実験からは、**検索するとよく出てくる、「時系列予測の交差検証法」として紹介されている方法が、あまり良い方法でないことが示唆**されています。最後のセクション4は参考文献に対する読書感想文です。

### (補足) この分野に自信のある人向けの概要

主に Bergmeir 他 (2018) と Cerqueira 他 (2020) を参考にしました。これらを知っているなら読まなくてもいいです。

## 1. なぜ今この話が必要なのか

### 交差検証法の再確認

まずは**交差検証法**(**クロスバリデーション**)が何かを確認する。予測モデルの評価には、交差検証法がしばしば使われる。より単純な評価方法には、学習に使用できるデータを、訓練データと評価データに完全に分離する**ホールドアウト検証** (OOS、サンプル外検証) がある[^1]。それに対して交差検証は、N件のデータをK個に分割する。分割後の単位をfoldといい、K個のfoldのうちK-1個を訓練に使い、残り1foldで当てはまりを評価する。この分け方はK通りあるので、同じ操作をfoldの割り当てを変えてK回評価し、総合して評価する。大抵の場合は、それぞれの評価データで計算したメトリクス(例えば平均二乗誤差とか、平均絶対誤差とか)の平均値で評価する。データの1つ1つの点をどのfoldに分割するかは、ランダムに決める事が多い。これが典型的な**K分割交差検証法** ($K$-fold cross validation)である。なお、foldの数 $K$ を極限まで増やし、1foldに1点だけにした場合、つまり$N=K$にした場合は、**Leave-one-out** (**LOO**) 交差検証と呼ばれる。

![通常の10分割クロスバリデーションのデータ分割の模式図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/33f5c82f-4b60-b0ee-0b31-572b0a099138.png)

*通常の10分割クロスバリデーションのデータ分割の模式図*

### 交差検証は時系列データの特性と矛盾する

しかし、時系列予測を扱うモデルに対しては、交差検証法は不適当だと考えられている事が多い。時系列データとは、 $y_0, y_1, \cdots, y_N$ というふうに時系列に並んだ数値であり、 多くの場合は各 $y_t$ と自身の過去の値 $y_{t-1}, y_{t-2},\cdots$ には何らかの相関がある。そして当然ながら、 $s+1$ 時点の $y_{s+1}$ を予測する時点では $t=0,1,\cdots,s$ までのデータしか使用できない。そのため、K分割交差検証法をそのまま適用すると、評価データに $y_{s+1}$ があるにもかかわらず、訓練データに $y_{s+2}, y_{s+3},\cdots$ が含まれてしまう可能性が十分にある。何も考えずに訓練データをそのまま学習するようなモデルなら、本来入手不可能な未来の値をもとに未来の値を予測するという、実際には使えない予測モデルになってしまう。さらに、時系列データには多くの場合、自己相関がある。自己相関があるというのは厄介で、機械学習の分野で提案されるデータの多くは、データの各点が独立かつ同一の分布に従っているという仮定で考案されたものが多い。このような不適切な特徴量は、予測対象の $y_t$ と強く相関し、モデルの見かけ上の「予測性能」を向上させる要因になりうる。つまり、典型的なデータの**リーク** (leakage) が発生している。

### ネット上でしばしば「時系列予測の交差検証法」と呼ばれているもの

この問題に対して、HyndmanとAthanasopoulosのオンラインテキスト *Forecasting: Principles and Practice* では、時系列予測モデルの交差検証は、時系列順に並べてやるべきだと紹介している。[^2][^3]具体的には、ランダムにK分割するのではなく、時系列上のリークが起こらないよう、$y_{s+1}$ の予測評価に対しては、 $y_0,\cdots y_{s}$ までのデータだけを訓練に使うように教えている。この予測対象を1時点ずつずらすことで、複数回の訓練と評価を行い、各結果の平均を取る。よって、全てのデータを均等に分割しているわけではないが、それ以外の点ではLOO交差検証と類似している。

![Hyndman式の交差検証法、1期先予測](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/ba9f2394-3166-3663-0509-7b6f27b9dad0.png)

*Hyndman式の交差検証法、1期先予測*

上記の方法は、1期先予測を繰り返していることになるが、もう少し先の予測に関心があるのなら、$y_0,\cdots,y_{s}$ までの訓練データで学習して $y_{s+4}$ で評価してもよいだろう、としている。(そして1期先や4期先以外でも使えるだろう, ということを言いたいのだろう)

![Hyndman式の交差検証法、4期先予測](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/1952714c-75ad-bd14-2dcc-ba49b63af4c0.png)

*Hyndman式の交差検証法、4期先予測*

Hyndmanは、この方法を time series cross validation と呼び、 *tsCV* と表記されることもある。ネット上の日本語情報[^4]も、ここまでとだいたい同じ内容である。これは英語で検索しても似たような状況である。[Scikit-Learn のドキュメントの交差検証に関するページ](https://scikit-learn.org/1.5/modules/cross_validation.html)も、時系列モデルの評価方法に関する記述は `TimeSeriesSplit` クラスの紹介のみで、このクラスにできることは Hyndman の方法の範囲におさまっている。(Scikit-Learnは時系列モデルを扱うクラスがほとんどないので必然ではある)

### 本当にそれでいいのか

この方法はなんとなく良さそうに見える。しかし、このアイディアに対して、私は以前から**疑わしく思っていた**。

1.  明確な理論的根拠が引用されていない
2.  交差検証といいながら、foldが交差しておらず、大部分が重複し、なおかつ使われずに除外される箇所が多い
3.  訓練データのランダム性がない

**テストを採点する人が、何をもって正解とするかの採点方法を知らなくては、テストの点数が意味をなさないだろう。**「意図やどういう結果がでるのかは知らないが、誰かがやれと言っていたからやる」程度の認識で計算した数字を、予測モデルの精度だと主張するのはおかしいだろう。**交差検証法とは汎化性能を推定するための手法**なので、適切に推定できるかどうかがある程度は理論的に保証されていなければ意味がない。1から説明すると長くなるので大雑把に要約すると、交差検証とは「訓練に使うデータあえて一部しか使わないことで、過学習を防ぎ、汎化性能をより正確に推定する」 方法である。そして、彼らはこの方法を交差検証と呼んでいるが、交差検証法と共通している要素があまりないように思える、というのが私の問題意識だ。

まず、他の不特定多数の検索結果は言うまでもなく、 Hyndman の教科書ですら、この方法でうまくいくという理論的に詳細な根拠も、直接提案したものが誰のどの研究なのかも明示しておらず[^5]、単に「この方法で計算したRMSEが最も小さいモデルを見つけることが、最良の予測モデルを見つける良い方法だ」としか言っていない。おそらく、他のネット上の情報はこういった教科書の内容を又聞きで書いただけであろうが、ちゃんとした教科書にも詳細が書かれていないのは残念だ。

(2)は、交差検証といいつつ、提案されたやり方は前後関係が逆転しないように分割しているだけであり、K分割交差検証法のようにランダムに、なおかつ重複のないように分割しているわけではないし、LOO-CVともやり方が異なる、ということである。すでに提示した図を見れば、tsCVでは試行回数の大きいものが試行回数の小さいもののデータを覆ってしまっているとわかるだろう。これでは「過学習を防ぐために訓練に使うデータをあえて抜いた」というより単に「時系列的なリークが発生して訓練に使えないデータがあった、入れ替えられなかった」と言っているだけのように見える。名前にこだわるのは必ずしも本質ではないが、現に話を理解していない人が、tsCVがあたかも交差検証法と同じ恩恵のある手法である、あるいはこの方法さえ採用すれば良いと誤解していると思われる例も見ている。私にはこれは交差検証法というより、「1期先予測誤差のスライド平均」とでも呼ぶのが適切に見える。

(3)は、純粋に汎化誤差の推定方法としての是非というより、むしろ応用上の観点での問題である。K分割交差検証法は、使用するデータをランダムに入れ替えることによる性質が便利であるということである。今どきはモデルを最初から1つだけ決めて、1回学習して終わり、ということはまずない。特徴量をどうするかとか、ハイパーパラメータの探索とか、モデルを少しずつ変えて何度も試すのが当たり前になっている。これは、既に紹介したScikit-Learn のドキュメントのページを見てもわかるだろう。もし純粋なホールドアウト法だけで評価していていると、必然的に評価データに選んだ期間のデータに過剰適合する。そういう意味でも、データを毎回ランダムにシャッフルすることで、多少なりとも過剰適合を抑制することは必要になる。しかし、このtsCVはこのような応用上の課題に対して何も答えていない。

こういった予想から、時系列予測の交差検証法として巷で紹介されている tsCV は交差検証の特徴を受け継いだ手法とは言えず、時系列予測モデルのテスト誤差 (=汎化性能) をうまく推定できる保証はないのではないか、と疑問を感じている。

ただし、時系列データはそもそもi.i.d.の仮定を満たさない事が多いため、交差検証が意味をなすための前提が崩れている可能性がある。よって、問題の解決のためには、ただランダムにすれば良いわけではなく、i.i.d.の仮定を満たさない原因も取り除く必要があるだろう。

### 今回の問題意識のまとめ

改めて私が何を問題視しているのかを整理する。上記のようなランダム性のない検証法、通常のK分割交差検証法、あるいはLOO交差検証法を時系列予測モデルに適用する場合、理論上3つの問題に気をつける必要があるのではないかと予想している。

1.  「未来のデータを持ち込んでしまう」データをランダムにシャッフルし、なおかつ入力データから特徴量を自動選択するような構成のモデルであれば、未来のデータを予測するには未来のデータが必要という、現実的でないモデルが発生する可能性がある
    - 仮にそれで良い結果が出たとしても、テストデータやオンライン予測には使用できないため、実用的でない
2.  「データを十分に活用できていない」上記のような、シャッフルのない交差検証法では、検証に使用しないデータが多く、モデルの評価に使える情報を十分に使用できていない可能性がある
3.  「時系列データの分布が交差検証の想定と根本的に合わない」データをシャッフルしても、多くの時系列データは自己相関があるため、データ生成分布は i.i.d. ではない
    - よって、交差検証法が誤差を適切に推定できるための前提条件が崩れている可能性がある

そういうわけで、データはシャッフルしない、fold間の相関も考慮していないというこの方法は、大きな過ちを犯してはいないが、汎化性能をより適切に推定するための工夫も特にしていない、というふうに私には見える。しかし、かと言って、通常の交差検証法をそのまま時系列予測に適用してもうまくいくようには見えない。では、どうすればよいのか。

## 2. どういう方法があるのか

論文を漁れば、時系列予測の検証方法についてもう少し興味深い話が見つかる。英語で検索するといろいろ見つかる。Cerqueira らは、かなりの数の既存の評価方法をサーベイし、いろいろなデータセットでどれくらい時系列予測モデルを評価できているかを研究している。そのため、今回はこの論文で挙げられている方法を中心に紹介する。

### ホールドアウト法

**ホールドアウト** (hold out)法、**サンプル外** (OOS, out-of-sample) 検証とも呼ばれるこの方法は一番単純な考え方である。つまり、データを訓練用と評価用の2つへと完全に分離し、互いに使い回さないことで過剰適合を回避する。時系列予測モデルでなくともよく使われる方法である。しかし、すでに書いたように、ホールドアウト法だけしか使えないのでは良い予測モデルを作るのに不足だと私は感じる。

![ホールドアウト法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/1e355a05-ffb7-3b1a-9e4f-ccf5e6ae4dc4.png)

*ホールドアウト法のデータ分割の図*

### 繰り返しホールドアウト法

ホールドアウト法に少しだけランダムの要素を与えたのが繰り返しホールドアウト法である。訓練データと評価データを分ける点を a として、訓練データや評価データが現実的なサイズになる範囲で、点 a をランダムに選んで訓練・評価データに分割し、モデルを評価するということを複数回繰り返す。それぞれの結果を統合して評価するのが**繰り返し** (repeated) **ホールドアウト法**である。

![繰り返しホールドアウト法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/ce7dd57b-b663-0065-0a18-847bf8b5047e.png)

*繰り返しホールドアウト法のデータ分割の図*

### プリクエンシャル (prequential) な方法

ホールドアウト法よりも発展的ではあるが、データの選び方にランダム性のない、プリクエンシャル (prequential) な方法[^6]というのがある。プリクエンシャルなアプローチは、「各観測値はまずモデルの検証に使われ、それからモデルの訓練に使われる」というものである。プリクエンシャルな方法は、確率的な要素のない繰り返しホールドアウト法の亜種であるとも見なせる。このような評価を、データを等間隔のブロックに分割して計算するため、**プリクエンシャルブロック法**と呼ぶ。

図にすると、以下のようになる。これ以降の図では1ブロック=1時点であるかのように書いているが、複数時点を含むブロックにも一般化できる。

![プリクエンシャルブロック法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/762aa196-3a2b-3775-38a2-432c7e21a796.png)

*プリクエンシャルブロック法のデータ分割の図*

例えば、時系列データを時系列順に5個のブロックに分けたとき、予測モデルを第1ブロックで学習し、第2ブロックでモデルを評価する。次に、第1、第2ブロックを訓練データとして、第3ブロックを評価データとして同じように繰り返し、最終的に第1ブロック以外のすべてのブロックが評価に使われる、つまり時系列データの終端に到達するまでこれを繰り返す。つまりこの例ならば4回繰り返し行い、一般にはKブロックあれば K-1回繰り返すことになる。通常のクロスバリデーションとは異なり、データの並びをランダムに変えたりはしない。そのため、Cerqueira らの研究では、冒頭で紹介した、**よく知られているであろう時系列予測モデルの交差検証法 (tsCV) は、プリクエンシャルブロック法**ということになる。

ちなみに、Cerquiraらはプリクエンシャルブロック法を提案した論文として、Modha と Masryの研究を引用している。しかしこの論文では、データがi.i.d.を仮定した場合の理論的性質にしか触れていなかったため、やはり時系列データに広く適用できるとは断言できない。

プリクエンシャルな方法にはいくつかの派生形も提案されている。例えば、繰り返しの試行を重ねるごとに訓練データが結合され増えていくのではなく、訓練データの大きさを一定にする方法が考えられる。これを便宜的に**プリクエンシャルスライディングブロック法**と呼ぶ。過去のあまりに古いデータを学習すると、かえって良くない場合があるだろう、という想定で考案されている。

![スライディングブロック法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/ea0654d3-da03-a51f-3ee0-30cc70914748.png)

*スライディングブロック法のデータ分割の図*

さらに、訓練データと評価データを分割するのではなく、間にどちらにも使わない区間を入れる、**ブロックギャップ法**も考えられる。自己相関のある時系列データを扱うときに、このような方法が必要な場面もあるかもしれない。

![ブロックギャップ法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/bd2769b2-c7b0-e2a8-6b6b-9f7a5b8988a4.png)

*ブロックギャップ法のデータ分割の図*

### 時系列の交差検証法

既に述べたように、時系列データは観測点どうしが依存しているため、通常の交差検証を適用できない。そこで、この問題を回避する交差検証法がいろいろ議論されている。ここでも、主にCerqueira らが挙げているものを紹介する。

まず、交差検証法を最もそのまま適用したのが**ブロック交差検証法** (Blocked CV) である。これは、K分割をランダムに行うのではなく、時系列順に等間隔に分割したものをFoldとみなして交差検証する、というものである。この方法では、各ブロック内ではデータの時系列順が維持されるが、評価ブロックは訓練データの前や間にくることもあるため、ブロック間では時系列順は維持されない。

![ブロック交差検証法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/6b8b33d2-5e23-99ad-b32e-6419a6767ccd.png)

*ブロック交差検証法のデータ分割の図*

ブロック交差検証法も、結局ランダムにシャッフルしていない。しかし、既に書いたように単純なシャッフルの場合は訓練データと評価データで時系列が逆転する可能性が残る。そこで、**修正交差検証法** (Modified CV) では、訓練データにテストデータと相関している、あるいはリークになりうる観測点が含まれていた場合は除外する。一方で、この方法ではランダムに除外したデータは一切使われないため、依然として情報を無駄に欠落させている可能性がある。

![修正交差検証法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/d2e113fe-38b9-fc6b-97c5-ef149c3c357f.png)

*修正交差検証法のデータ分割の図*

さらに別の修正方法は、訓練と評価の間に使用しない期間を空ける**hvブロック交差検証** である。こちらはブロック交差検証法と同じようにシャッフルをぜずに分割してから、ギャップブロック法のように評価データに隣接する訓練データを除外することで自己相関を回避する意図があるようだ。

![hvブロック交差検証法のデータ分割の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236849/392a6698-f10d-57cb-966d-832eb1819fec.png)

*hvブロック交差検証法のデータ分割の図*

### 理論的な補強

Bergmeir らは、ARモデルに限定しているが、交差検証法が時系列データに対しても理論上良い方法であることを示している。全てのモデルや時系列データに対して当てはまるわけではないが、時系列データでの考え方を整理するのに良い内容だったので紹介する。

まず、彼らの研究では、 予測モデルを任意の自己回帰 (AR) モデルに限定している。いわゆる線形ARではなく、非線形も含めているため、 $y_t = g(y_{t-1}, y_{t-1}, \cdots, y_{t-p}) + \varepsilon_t$ と書ける。このとき、$y_{t-1}, y_{t-1}, \cdots, y_{t-p}$ をp次元の特徴量ベクトルとみなして、$\boldsymbol{x}_t$ と表す。よって、以下のように表せる。

$$
\boldsymbol{x}_t = \begin{bmatrix} y\_{t-1} & y\_{t-1} & \cdots & y\_{t-p}\\ \end{bmatrix}^\prime
$$

これで時系列データを $(y_t, \boldsymbol{x}_t)$ という過去の値を参照しないペアに変換できるので、以降は**時系列的なリークの心配をすることなく、通常の交差検証として考えられる**。馴染身がない人に対して付け足しておくと、こういう変換の考え方は、時系列モデルの**状態空間表現**を考えるときにもよく使う。

これで「未来の情報を持ち込まない」ことは達成できたが、観測点どうしの相関の問題は残っている。著者らは、ARモデルが一定の条件を満たせば、理論上この問題を解決できるとしている。この条件を満たせば、データの分布に対する仮定をi.i.d.より緩くしても、交差検証法で得た平均誤差は未来の予測誤差に対する一致推定になるため、交差検証法で誤差を確認すれば適切なモデルを学習できるためである。その条件も、時系列データを扱っている人にとっては馴染みのあるものだ。

(なぜできるのかを説明すると長くなる。こういった話の解説を日本語でしている資料はあまりないので、ヒントのみ紹介する。[私が昔個人ブログに書いた中心極限定理の話](https://ill-identified.hatenablog.com/entry/2021/03/31/212337)を見ると良いかもしれない。ここで紹介しているように、大数の法則や中心極限定理は、一定の定常性が成り立つだけでも適用できる。これは i.i.d.の仮定よりもゆるく、データに自己相関があっても成り立つ。この記事でも、AR(1)過程で中心極限定理が成り立つ例を示している。この性質を利用すれば、自己相関のある時系列モデルでも交差検証法で計算した誤差が信頼できることを証明できる。)

そして、上記の変換により、このARモデルで $y_t$ の予測値を求めるには、同じ時間インデックスの $\boldsymbol{x}_t$ だけでよく、時系列データを $(y_t, \boldsymbol{x}_t)$ 単位のデータとして扱えば、通常のK分割交差検証法またはLOO交差検証法が使用でき、LOOの場合は $n-p-1$ 回の繰り返しになる。元の $y_t$ の単位に戻すなら、各ブロックの大きさが $p$ 以上であるブロック交差検証法に近い方法ということになる。ただし、各ブロックが互いに素ではなく、重複して含まれる観測点があるということが上記のブロック交差検証法とは異なる。

さらに、著者らはモンテカルロシミュレーションを行い、5分割交差検証法であってもホールドアウト検証よりも誤差をうまく推定できていることを示している。

ところで、この論文の著者には冒頭で出てきた Hyndman が含まれている。この論文は彼のオンライン教科書の初版公開の翌年のものである。~~オンライン教科書なら更新してくれてもいいのに‥。~~

## 3. 結局どれが良いのか

Cerqueira らの研究の話に戻る。著者らは周期性と自己回帰要素を含んだ疑似データと、複数の現実のデータセットを使用して、ここまでに紹介したホールドアウト法、ブロック法、交差検証法を比較している。データセットは、非定常なものも含まれている。正則化付きのGLM、ランダムフォレスト、RBRの3種類のアルゴリズムで実験した。各アルゴリズムはRパッケージの実装である、 glmnet, ranger, Cubist を使用したという。それぞれのアルゴリズムとデータの組み合わせについて、ここまでに紹介した各検証方法による「予測誤差の誤差」についてホールドアウト検証を行う。つまり、データセットを訓練データとテストデータに分割し、訓練データに対しては、(適宜評価データに分割して) 各検証法 $v$ でそれぞれ、モデル $m$ の訓練誤差 $\hat{L}_i^{(m, v)}$ を求める。この誤差はモデル $m$ のテストデータに対する誤差の推定値であるべきなので、次にモデル $m$ のテストデータに対する予測値から実際の誤差 $L^{(m,\mathit{test})}$ を直接計算し、両者の誤差を比較することで、誤差の推定方法としてどれだけ優れているかを確認した。このとき、誤差の誤差を測定するメトリクスには、絶対予測的中誤差 (APAE) $|\hat{L}_i^{(m,v)} - L_m^{(\mathit{test})}|$ または予測的中誤差 (PAE) で、各検証方法が、誤差の推定方法としてどれだけ優れているかを確認した。つまり、モデル $m$ と検証法 $v$ の誤差推定の誤差は以下で計算する。

$$
\begin{aligned}
\mathit{APAE} = & |\hat{L}_i^{(m,v)} - L_m^{(\mathit{m,test})}|\\\\
\mathit{PAE} = & \hat{L}_i^{(m,v)} - L_m^{(\mathit{m,test})}
\end{aligned}
$$

となる。モデルの予測誤差のメトリクスにはRMSEを使用している。

疑似データは、以下の3通りのモデルに基づく乱数データである。

1. 安定的なAR(3)過程
1. 転換可能なMA(1)過程
1. 季節性AR(12,1)過程

実験に使ったコードやデータはここにあるようだ。

https://github.com/vcerqueira/performance_estimation


#### 実験結果の要約

結果を要約すると、以下のようになる。

1. 擬似的に生成した定常データと、現実の非定常データで、傾向に大きな違いがあった
1. 擬似的に生成した定常データの場合
    1. 多くの場合で平均してブロック交差検証法が最も優れ、次いでhvブロック交差検証法が優れていた
    1. 上記2つ以外の交差検証法と、プリクエンシャルな検証法は、多くの場合で平均してホールドアウト検証よりも成績が悪かった
    1. データ生成分布が単純なケースでは、プリクエンシャルスライドブロック法が最も良い成績になることがあった
    1. 平均だけでなく分散も計算しており、上記の結果に対して疑念が生まれるほど分散の差がない
1. 現実の非定常データの場合
    1. 繰り返しホールドアウト法が最も良い結果になる事が多い
    1. ブロック交差検証法とhvブロック交差検証法はその次に優れていた
1. 単純な交差検証法と修正交差検証法は、どのケースでも総じて最も成績が悪く、分布を見ても、誤差を過少推定する方向の外れ値が多い
1. サンプルサイズを変えても、優劣の順位はほとんど変わらなかった

## 4. 感想

以下は個人の感想です。

プリクエンシャルブロック法、**つまりネット上でよく「時系列予測モデルの交差検証法」として紹介される方法は、誤差の推定方法としてあまり良くない**。この実験ではいくつかの優れた性能を発揮したケースもあるが、それらは単純なシミュレーションデータに対してだけなので、単純なシミュレーションだけで判定しているとプリクエンシャルブロック法を過大評価してしまう可能性がありそうだ(単純なシミュレーションのみでの判断は自分もやりかねないので自戒)。今回に限らず、適切なものだという根拠をよく調べず鵜呑みにするのは良くないと思った。


この実験結果および、Bergmeir と Hyndman の論文の理論から、**時系列予測の交差検証法は、自己相関や時系列のリークを回避することよりも、時系列データの同時分布を、定常的な分布に合わせて分割して交差検証することが重要なのではないかと感じた**。定常データでは、Hyndmanらが理論的に示したことや実験結果から、ブロック交差検証法は良い評価方法である。しかし非定常の場合は、理論からも、実験結果からも、裏付けがない。これらの結果から、交差検証法はおそらく、i.i.d.の仮定に強く依存しており、条件を満たさないデータに対しては汎化性能を評価するのに適していない。しかし、実はi.i.d.の仮定を緩和して定常的な分布に広げても、ある程度うまくいくのかもしれない。(このへんの理論研究をあまり勉強していないので適当)

プリクエンシャルブロック法は評価に使わないデータが多いため、サンプルサイズが小さいほど誤差の推定の精度が低下するのではないかと思っていたが、あまり影響がないという結果だった (これは Cerqueira らも本文中で指摘している。

Cerqueiraらの結果は、いくつかのデータセットに基づいた実験であるが、興味深い。プリクエンシャルブロック法に対する直感的な予想や、Bergmeir らの理論とも矛盾していないが、あくまで有限なデータでの実験である。そして、ランダム性を取り入れた繰り返しホールドアウト検証は、ただのホールドアウト検証より優れているというのは予想できたが、非定常データの場合はさらに、他の交差検証法よりも優れているのは興味深かった。今後の理論面での裏付けに期待したい。

それから、応用上の観点での感想を言う。ブロック交差検証法は、現実の時系列データが前提条件を満たしていることはあまりないという点に注意しなければならない。つまり、時系列データの多くは非定常である。トレンド定常なデータであれば対処は難しくないが、より厄介な確率トレンドを含む時系列データも、現実には多く存在する。とはいっても、時系列データが定常的か非定常的かというのは見た目の時点でもわかりやすいことが多いし、仮説検定など、それなりに厳密な判定方法も存在する。よって、応用のレベルでは、問題に応じて繰り返しホールドアウト検証とブロック交差検証法を使い分ける、という運用方法でも問題ないかもしれない。 あるいは、Bergmeirらの研究のように、ARを定常な時系ベクトル列とみなす方法を拡張して対処する。

一方で、これらの研究だけでは答えがわからない問題も残った。例えば、予測モデルが $y_{t+1}=f(y_{t},y_{t-1},\cdots,y_{t-p})$ のように、複数期間の過去の値の入力が必要だとすると、$p$ がブロックのサイズに対して大きい場合はどうなるのか、という問題は触れられていない。また、この実験では、モデルを何度も調整して試行錯誤する際に発生しうる過剰適合に対してどう対処するかはという問いには答えていないため、それは別に考える必要がある。

それに、問題設定の細かな違いによって、適した方法は変わるかもしれない。この問題では、未来のデータ全体 (理論上は、無限に先の未来まで) の汎化性能を推定することが焦点となっている一方で、時系列予測ではごく直近の予測だけを目的とする「短期予測」が重要な場面もよくある。短期予測が重要な場面では、むしろ1期先予測を繰り返し計算しているプリクエンシャルブロック(tsCV)のほうが適している場面も、もしかしたらあるかもしれない。

## 参考文献

1. Vitor Cerqueira, Luis Torgo, and Igor Mozetič (2020) _Evaluating time series forecasting models: an empirical study on performance estimation methods,_ Machine Learning, Vol. 109, pp. 1997–2028 DOI: [10.1007/s10994-020-05910-7](https://doi.org/10.1007/s10994-020-05910-7)
1. Christoph Bergmeir, Rob J. Hyndman, and Bonsoo Koo (2018) _A note on the validity of cross-validation for evaluating autoregressive time series prediction,_ Computational Statistics & Data Analysis, Vol. 120, pp. 70-83, DOI: [10.1016/j.csda.2017.11.003](https://doi.org/10.1016/j.csda.2017.11.003)
3.  Modha, Dharmendra S. and Eilas Masry (1998). *Prequential and cross-validated regression estimation,* Machine Learning, 33(1), 5–39.

----

[^1]: 使用可能なデータの役割の呼び方はいろいろある。ここでは私は、モデル構築に使えるデータ全体を「学習データ」と呼び、そのうち最終確認に使う部分を「テストデータ」と呼ぶ。残りの部分は、モデルの学習に自由に使える部分で、この部分は「訓練データ」と呼ぶことが多い。しかし、今回はクロスバリデーションやホールドアウト検証の話が主題なので、学習データからテストデータを除いた部分だけに焦点を当てる。そのため、モデルの学習用途で実際に入力するデータに限定して「訓練データ」と呼び、テストデータで最終評価を下す前の評価に使う、訓練データから切り出したデータを「評価データ」と呼んでいる。

[^2]: https://otexts.com/fpp3/tscv.html

[^3]: 2025/1/29追記: このテキストの日本語訳が公開されているのを見つけた。第3版を原典としているため、今回の話題であるtsCVのページも訳されている。 https://otexts.com/fppjp/

[^4]: Googleで「時系列データ クロスバリデーション」で検索した結果の1ページ目しか確認していない。だが、2ページ目以降も大差ないだろう。

[^5]: この教科書では各章末に参考文献が挙げられているが、章内の記述のどれに対応しているかは明示されていない。教科書によくある形式ではある。

[^6]: prequential は predictive と sequential の合成語である。定着した訳語はなさそう。