交差検証
Cross-Validation ・ こうさけんしょう
データを分割して訓練と評価を繰り返し、モデルの汎化性能を見積もる手法
✦ 30秒で試す — 航海テスト用のデータを取っておかなくても、本番の誤差は見積もれるこうして見積もった誤差は、本番の誤差より?予想してみる概要
交差検証は、手元のデータを分割して「学習に使う部分」と「評価に使う部分」を入れ替えながら訓練と評価を繰り返し、モデルが未知のデータでどれくらいの性能を出せるか(汎化性能)を見積もる手法です。もっとも広く使われるk分割交差検証では、データをk個のブロックに分け、そのうち1つを評価用に残して残りで学習する、という手順をk回繰り返して評価結果を平均します。
学習に使ったデータでモデルを評価すると、過学習したモデルほど良い成績に見えてしまいます。だからこそ「評価は学習に使っていないデータで行う」ことが鉄則なのですが、データを評価用に取り分けると学習に使える量が減ってしまいます。交差検証は、全データを一度ずつ評価に回すことでこのジレンマを和らげる、モデル評価・モデル選択の標準手法です。
なぜ生まれたか
もっとも素朴な方法は、データを最初に訓練用と評価用の2つに割るホールドアウト法です。しかしこの方法には2つの不満がありました。第一に、評価用に取り分けた分だけ学習データが減り、特にデータが貴重な場面ではモデルの質が落ちます。第二に、評価結果が「どの部分をたまたま評価用にしたか」という分割の偶然に左右され、標本抽出のゆらぎがそのまま評価のゆらぎになります。評価用データが小さければ、その見積もりは一度きりの不安定な観測にすぎません。
交差検証はこの2つを同時に解決します。分割を入れ替えて全データを一度ずつ評価に使うため、評価はk回分の平均となって安定し、しかもどの回でも全体の大部分(k=5なら8割、k=10なら9割)を学習に使えます。計算をk回繰り返すコストと引き換えに、限られたデータから安定した汎化性能の見積もりを得る——この考え方は1970年代半ばにストーンやガイサーによって予測の評価法として定式化され、計算機の性能向上とともにこの交換が安いものになると、交差検証はモデル評価の事実上の標準になりました。
詳細
k分割交差検証の手順
k分割交差検証(k-fold cross-validation)では、まずデータをランダムにk個の同じ大きさのブロック(fold)に分けます。1回目はブロック1を評価用に残し、残りのk−1個で学習して、ブロック1で性能を測ります。2回目はブロック2を評価用にして同じことを行い、これをk回繰り返すと、すべてのデータがちょうど一度ずつ「学習に使われていないデータ」として評価に参加したことになります。k回分の評価スコアの平均が汎化性能の見積もりで、ばらつきを見れば見積もりの安定度も分かります。kは5か10が定番です。
分割の「運」がどれほど効くかは、実際に回してみると分かります。下の部品では、30点のデータに直線を当てはめる同じ課題を、ホールドアウト(1回だけ分割)と k 分割交差検証で何度も評価し直します。ホールドアウトのスコアは、どの点がたまたま検証に回ったかで大きく揺れますが、k 分割の平均はほとんど動きません。
「k分割で1周回す」を押してください。金の窓(検証用の区画)が横にずれながら、残りの点で直線を学習 → 窓の中の点で誤差を測る、を k 回くり返します。
誤差 = 検証点での RMSE(二乗平均平方根誤差)。破線 = 全データで学習したモデルの、新しいデータでの実際の誤差(参考)
ただし、k 分割で安定するのは「分割の運」によるぶれだけです。手元のデータそのものが母集団からたまたま偏って取れていれば、その偏りは何度分割し直しても消えません。交差検証の数値は「このデータから見積もった汎化性能」であり、データが小さいほど、その見積もり自体に誤差が残ることは忘れないでおきましょう。
バリエーションと使い分け
kを標本サイズと同じにした極端な形が一つ抜き交差検証(leave-one-out)で、毎回1件だけを評価に使います。学習データを最大限使えるためバイアスの小さい見積もりになりますが、計算回数が標本サイズ分だけ必要で、見積もりのばらつきも大きくなりがちです。逆にk=2に近づけるほど計算は軽い一方、学習データが減るぶん性能を低めに見積もります。この「kの選択」自体がバイアスとバリアンスのトレードオフになっており、k=5〜10がバランスの良い妥協点として定着しています。ほかに、分類問題でクラス比率を各ブロックで揃える層化k分割、時系列データで「未来のデータで学習して過去を予測する」ことを防ぐために時間順に分割する時系列分割など、データの構造に応じた変種があります。見落とされやすいのがグループ分割です。同じ患者の複数回の検査、同じ店舗の毎日の売上のように、互いに似たレコードの束があるとき、ランダムに分割すると同じ患者のデータが訓練と評価の両方に入り、モデルは「その患者らしさ」を覚えるだけで当たってしまいます。実際に予測したいのが「新しい患者」なら、患者単位でまとめてブロックに割り振る(グループk分割)のが正しい分割です。分割のしかたは「本番でモデルが出会うデータと、学習に使ったデータの関係」を再現するように選ぶ、というのが一貫した原則です。
モデル選択とハイパーパラメータ調整
交差検証の最大の使いどころはモデル選択です。多項式の次数、正則化の強さ、決定木の深さといった「モデルの複雑さを決めるつまみ(ハイパーパラメータ)」は、訓練誤差では選べません。複雑なほど訓練誤差は下がるからです。そこで候補ごとに交差検証のスコアを計算し、最も良い設定を選びます。検証誤差が最小になる複雑さを探すこの手続きは、過学習と未学習の境目をデータに教えてもらう作業だと言えます。
落とし穴 — 検証への情報漏れ
交差検証は正しく実施しないと、実力より高い性能を報告してしまいます。代表的な失敗がデータリークで、たとえば全データを使って特徴量の標準化や変数選択をしてから分割すると、評価用ブロックの情報が学習側に漏れます。前処理を含むすべての手順を、各回の訓練ブロックだけで行うのが原則です。
もう一つの落とし穴は、交差検証で多数の設定を比較して最良を選んだとき、その最良スコアをそのまま性能として報告することです。多数の候補から最大値を選ぶ操作は、偶然に有利だった候補を拾ってしまうため、選ばれたスコアは楽観的に偏ります。これは多重比較と同じ構造で、スコアを見ながら設定を何十回も試せばp値ハッキングと同じく「良すぎる数字」が生まれます。対策は、選択と評価を分けることです。データに余裕があれば、選択にいっさい使わないテストデータを最後まで取り置きます。データが少なければ入れ子の交差検証(nested cross-validation)を使います。外側のループで評価用ブロックを取り分け、内側のループでは残りのデータだけで交差検証をしてハイパーパラメータを選び、選んだ設定を外側の評価用ブロックで一度だけ測る——これを外側のブロックの数だけ繰り返すと、「選ぶ手続きまで含めたモデル作り」の性能を偏りなく見積もれます。なお交差検証は性能の「数値」を見積もる手法であり、モデルの仮定が妥当かを調べるモデル診断や、推定量のばらつきを見積もるブートストラップ法と組み合わせて使うことで、モデル評価は多面的になります。
試問
30点のデータに直線を当てはめるモデルの、本番での誤差を見積もります。k分割交差検証は、データを k 個に分け、1つを検証用に取り置いて残りで直線を学習し、取り置いた点で誤差を測る——これを取り置く区画を替えながら k 回くり返して平均する方法です。破線は、30点すべてで学習した直線を新しいデータで測った「実際の誤差」(ふつうは知りえない答え)です。分割数 k を選んで k分割交差検証の見積もりを積み上げ、破線と比べてください。
「k分割で1周回す」を押してください。金の窓(検証用の区画)が横にずれながら、残りの点で直線を学習 → 窓の中の点で誤差を測る、を k 回くり返します。
誤差 = 検証点での RMSE(二乗平均平方根誤差)。破線 = 全データで学習したモデルの、新しいデータでの実際の誤差(参考)
