見出し画像

【統計学修士の備忘録】#3 同じモデルを色んなデータで試してみる

こんにちは、ぽむぽむです。試験日が近づいているので、鬼のスピードで復習しています。

今回は、リサンプリングについてです。名前の通りトレーニングデータから何回もサンプリングして再度モデルをフィットしていくことで、そのモデルを良いものに仕上げたり、精度を推定したりします。

主に使用されるリサンプリング方法は、Cross Validation(CV、交差検証)と Bootstrap です。

Cross Validation

XとYのデータが100個あったとします。XをもとにYを予想するモデルを作るときに、この100個のデータ全てを使ってモデルをフィットしても良いのでしょうか?答えはNOです。このままでは、このモデルをテストするためのデータがないため、モデルの精度を測ることができない&オーバーフィットしてしまいます。ここで一部のデータを抜き取って、残りのデータで一旦モデルをフィットしてから、取っておいたデータでテストする、というのが Validation の基本的な考え方です。

じゃあデータを半分に分けて、50個でトレーニング、残り50個でテストすれば良いじゃん、となるかもしれませんが、トレーニングのための情報が半減してしまっているので、かなり精度の悪いモデルになってしまいます。また、別の50個を選んで分け方を変えてみると、トレーニングに含まれる情報がかなり変わるので、テストした時の MSE もまた違う値になってきます(variable MSE)。それを解決しようとするのが CV です。

まずは Leave-one-out cross validation(LOOCV)から。こちらも名前の通りですが、全データのうち1個だけを Validation のために使って、残りは全てトレーニングに回すという方法です。そうすると、validation data の選び方は n(データの数)通りあるので、それぞれの場合で計算した MSE を全て足し合わせて n で割ったもの(普通に平均ですね)がモデル全体の MSE となり、これを$${CV_{n}(\hat{f})}$$と書きます。

$$
CV_{n}(\hat{f}) = \cfrac{1}{n} \sum_{i}^{n} MSE_{i}
$$

LOOCV は見方を変えてみると、n個のデータをnグループに分けて(1グループにつきデータ1個)、validation data の役割を与えるグループをローテーションしていると捉えることができます(1周するのにn回かかる)。これをnグループからKグループにするのが、K-fold CV です。K-pop じゃなくて K-fold ですポムよ。グループの個数がnからKに変わったので、1グループのデータの数も1からn/Kに変わりますが、validation data の役割をローテしてMSEを平均するところまで全て同じです。

じゃあどれを使えば良いのか。LOOCVとK-fold CVの性質について考えてみます。まず、LOOCVは計算コストが非常に大きいです。LOOCVではn回もMSEを計算しますからね。でも良いこともあって、全体のデータから1個だけを抜いたn-1個のデータでトレーニングするので、バイアスは小さくなります。一方、バイアスと分散のトレードオフで分散は大きくなりますが…。

※バイアスと分散のトレードオフについてはこちら参照です

一方で K-fold CV はこの反対で、計算コストはやや低く分散も小さい代わりに、全体の$${\cfrac{K-1}{K}}$$のデータしかトレーニングに使えないのでバイアスは大きくなります。

このように悩ましいトレードオフがあるのですが、実際にはK=5か10を使うことが多い様です。

色々と書いていたら長くなってしまったので、Bootstrap は次回説明したいと思います。

補足

LOOCVで出てきた$${CV_{(n)}(\hat{f})}$$ですが、

$$
\begin{equation*}
\begin{split}
CV_{(n)}(\hat{f}) &= \cfrac{1}{n} \sum_{i}^{n} MSE_{i} \\
&= \cfrac{1}{n} \sum_{i=1}^{n}(y_{i} - \hat{f}^{(-i)}(x_{i}))^{2} \\
&= \cfrac{1}{n} \sum_{i=1}^{n} (\cfrac{y_{i} - \hat{f}(x_{i})}{1-S_{ii}})^{2}
\end{split}
\end{equation*}
$$

($${S_{ii}}$$は、$${\hat{y} = Sy}$$の形で$${y}$$を$${\hat{y} }$$に変換する行列Sのii成分)

という変換がほとんどの線形モデルの場合成り立つので、

$$
GCV(\hat{f}) = \cfrac{1}{n} \sum_{i=1}^{n} (\cfrac{y_{i} - \hat{f}(x_{i})}{1-trace(S)/n})^{2}
$$

で近似できるという裏技があります!

例えば線形回帰モデルの最小二乗推定量は$${\beta=(X^{T}X)^{-1}X^{T}Y}$$なので、

$$
\hat{Y} = X\hat{\beta} = X(X^{T}X)^{-1}X^{T}Y \\
S = X(X^{T}X)^{-1}X^{T}
$$

です。

$$
\begin{equation*}
\begin{split}
trace(S) &= trace(X(X^{T}X)^{-1}X^{T}) \\
&= trace((X^{T}X)^{-1}X^{T}X) \\
&= trace(I_{p}) \\
&= p
\end{split}
\end{equation*}
$$

なので、$${S_{ii}}$$を求めるよりも$${trace(S)}$$を求める方が簡単!ということでGCVを使うのです。(ちなみに先ほどの式からも分かるように、$${trace(S)}$$はパラメータの数になっています)


この記事が気に入ったらサポートをしてみませんか?