04.1.2 高校生向け
学習データとテストデータの区切り(高校生向け)
こんな場面を想像してみよう #
模試の前に問題集で練習するとします。本番の問題が練習した問題とまったく同じだったら、満点でも「実力」とは言えませんよね。予測モデルも同じで、練習に使っていない問題で採点しないと本当の力はわかりません。
時系列ではもう 1 つ条件が増えます。「来月の売上を予測する」モデルの実力を測るのに、来月のデータを練習に混ぜていたらカンニングです。だから区切りは必ず時間の順に 1 本だけ入れます。
240 日分のうち前の 180 日が青い学習データ、後ろの 60 日が赤いテストデータです。点線より右はモデルから見れば「まだ来ていない未来」。モデルは青い部分だけで作られ、赤い部分を予測し、実際の赤い線とのズレで採点されます。
仕組み:時間順に切って、後ろを隠す #
まず、日付順に並べます。時系列は順番そのものが情報なので、並べ替えやシャッフルはしません。次に区切りの日を決めます。図では「最後の 60 日をテストにする」と決め、その境目に点線を引きました。本番で予測したい長さ(来月なら 30 日)以上をテストに取るのが目安です。それから青い部分だけでモデルを作ります。モデルは点線の右側を一度も見ません。そのうえで赤い 60 日分を予測させ、実際の値と比べます。ズレ(誤差)の大きさが、このモデルの「本番での実力」の見積もりになります。最後に区切りをずらしてくり返します——区切りを 1 か月ずつ後ろに動かして同じことを何回も行うと、「たまたま簡単な期間だった」偶然を減らせます。これが時系列版の交差検証(ウォークフォワード検証)です。
区切りの計算そのものは、リストを前後に切るだけです。10 日分の値から後ろ 3 日をテストに取ると、学習は 7 個、テストは 3 個になります。
| |
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
いちばん大事なのは、ランダムに分けると成績が良すぎることです。折れ線は 1 日ごとに少しずつ動くので、100 日目と 102 日目を知っていれば 101 日目はほぼ当たります。ランダムに抜いたテストはこの「両隣を知っている」状態で、本番ではあり得ない好成績が出ます。二つ目は、テスト期間が特殊だと評価が偏ること。テストが年末だけだと、その時期特有の動きで点数が決まるので、区切りをずらして複数回評価すると偏りが見えます。三つ目は、検証データも時間順に切ること。モデルの設定を選ぶ検証データを追加するときも「学習 → 検証 → テスト」と時間順に並べ、テストデータは最後に 1 回だけ使います。最後に、未来の情報はこっそり混ざります——「今日の売上」を予測するのに「今日の天気の実績」を使うのもリークなので、予測の時点で手に入る情報(天気予報)だけを使えているか確かめましょう。
やってみよう #
最初の課題は、自分の 30 日分の記録(歩数・勉強時間など)を日付順に並べ、前の 24 日だけを見て後ろの 6 日を予想し、実際の値とのズレを紙で計算することです。二つ目は、身の回りで「予測の時点ではまだ手に入らない情報」を 2 つ挙げ、それが混ざるとなぜ成績が良く見えるか説明すること。試合の結果や当日の来客数などが例です。三つ目は、課題 1 の 30 日から、ランダムに 6 日を隠して予想したらどれくらい簡単になるか試し、隣の日が見えていることがどう助けになったかを言葉にすることです。
つぎに読む #
iloc での分割と axvline で境界を描くコードは 標準版の学習データとテストデータの区切り で扱っています。区切る前に 240 日の売上を折れ線にして全体像をつかむ方法は 日次データの基本プロット(高校生向け) で説明しています。章全体の流れは 時系列の基礎 へ。