7.1-7.2 モデル評価と選択 - バイアス・バリアンスとモデル複雑度

機械学習で最も重要な問いの一つ:「このモデルは、まだ見ぬデータに対してどれくらいうまく予測できるのか?」

訓練データでの性能は信用できない。なぜなら、モデルはそのデータを「見て」学習したから。本当に知りたいのは、未知のデータへの予測能力 ── これを汎化性能と呼ぶ。

この章では、汎化性能を理解するための核心概念「バイアス・バリアンス分解」を学ぶ。シンプルすぎるモデルは的外れ(高バイアス)、複雑すぎるモデルはノイズまで学習(高バリアンス)。この2つのバランスこそが、良いモデルを作る鍵となる。

この章を読み終えると:

  • 訓練誤差とテスト誤差の違いが理解できる
  • なぜモデルの複雑さがU字カーブを描くのかわかる
  • バイアス・バリアンス分解の意味が直感的にわかる
  • 適切なデータ分割の方法を知ることができる

見えないデータへの予測 ── なぜ訓練誤差は信用できないのか

あなたは今、データサイエンティストとして働いているとしましょう。上司から「明日の売上を予測するモデルを作れ」と言われました。

過去1年分のデータを使って、複雑なモデルを作りました。訓練データでの予測は完璧 ── 誤差はほぼゼロ。「これは素晴らしいモデルだ!」と思って上司に報告しました。

ところが翌日、実際の売上と予測を比べてみると...全然当たっていない。何が起きたのでしょうか?

これは機械学習で最もよくある落とし穴です。訓練データでうまくいくことと、未知のデータでうまくいくことは、まったく別の話なのです。

訓練データでの成功が新しいデータでは失敗する様子

訓練データでモデルを評価することは、試験問題を事前に見せてから試験を受けさせるようなもの。当然、良い点数が取れます。でも、それは本当の実力を測れていません。

本当に知りたいのは、まだ見たことのないデータに対する予測能力。これを汎化性能(generalization performance)と呼びます。

損失関数 ── 「間違い」を数値で測る

モデルの予測がどれくらい「間違っている」かを測りたい。でも、「間違っている」とは具体的にどういうことでしょうか?

ここで損失関数(loss function)の出番です。損失関数は、予測値と実際の値のズレを数値に変換する関数です。

最も代表的なのが二乗誤差損失

$$L(Y, \hat{f}(X)) = (Y - \hat{f}(X))^2$$

各記号の意味:
$Y$:実際の値(真の答え)
$\hat{f}(X)$:モデルの予測値
この差を二乗したものが「損失」

なぜ二乗するのでしょうか?2つの理由があります:

二乗誤差と絶対値誤差の関数形状の違い

もう一つよく使われるのが絶対値誤差損失

$$L(Y, \hat{f}(X)) = |Y - \hat{f}(X)|$$

こちらは外れ値に対して寛容です。どちらを使うかは、問題の性質によります。

テスト誤差と訓練誤差 ── 2つの異なる「誤差」

さて、損失関数を使って誤差を測る準備ができました。でも、どのデータで測るかで意味がまったく変わります。

訓練誤差(training error)は、モデルの学習に使ったデータでの誤差です。言葉で書くと「訓練データすべての誤差を足して、データ数で割った平均」:

$$\overline{\text{err}} = \frac{1}{N} \sum_{i=1}^{N} L(y_i, \hat{f}(x_i))$$

これは「試験問題を事前に見せた上での点数」。当然、良い値が出やすい。

一方、テスト誤差(test error)は、学習に使わなかった新しいデータでの誤差です。

訓練誤差とテスト誤差の計算対象の違い

ここで「期待値」という言葉が出てきます。これは「平均的な値」と考えてOKです。テスト誤差を言葉で書くと「新しいデータをたくさん持ってきて、それぞれの誤差を計算し、その平均を取ったもの」:

$$\text{Err}_{\mathcal{T}} = E[L(Y, \hat{f}(X)) | \mathcal{T}]$$

$\mathcal{T}$:訓練データのセット
この式は「訓練データ $\mathcal{T}$ でモデルを作った後、新しいデータに対する誤差の平均」という意味です。
縦棒 $|$ は「〜という条件のもとで」を表します。

さらに、訓練データ自体のランダム性も考慮した期待予測誤差

$$\text{Err} = E[L(Y, \hat{f}(X))] = E[\text{Err}_{\mathcal{T}}]$$

これが、モデルの真の性能を表す指標です。

U字カーブ ── モデル複雑度と誤差の関係

ここで、機械学習で最も重要なグラフの一つを見てみましょう。

横軸にモデルの複雑さ(パラメータ数、多項式の次数など)、縦軸に誤差を取ります。

訓練誤差は、モデルが複雑になるほど単調に減少します。なぜなら、複雑なモデルほど訓練データに完璧にフィットできるから。極端な話、各データ点を丸暗記することもできます。

一方、テスト誤差は違う振る舞いをします:

  1. 最初は複雑さを増すと減少(より良いパターンを学習)
  2. ある点を過ぎると増加に転じる(ノイズまで学習してしまう)

この結果、テスト誤差はU字カーブを描きます。

モデル複雑度と訓練/テスト誤差の関係を示すU字カーブ

U字の底にあるのが「ちょうど良い複雑さ」。これより左はアンダーフィッティング(モデルが単純すぎる)、右はオーバーフィッティング(モデルが複雑すぎる)。

バイアス・バリアンス分解 ── 誤差の正体を暴く

テスト誤差がU字カーブを描くのはなぜでしょうか?その答えがバイアス・バリアンス分解です。

ある入力点 $x_0$ での期待予測誤差は、次のように分解できます:

$$\text{Err}(x_0) = \sigma^2_\varepsilon + \text{Bias}^2(\hat{f}(x_0)) + \text{Var}(\hat{f}(x_0))$$
誤差を3つの成分に分解する様子

3つの項を一つずつ見ていきましょう:

1. 既約誤差 $\sigma^2_\varepsilon$(Irreducible Error)

実は、データには「真の関係」以外に、測定誤差や偶然の変動が含まれています。

例えば、同じ身長の人でも体重は人それぞれ。身長から体重を予測するモデルを作っても、この「人それぞれ」の部分は予測できません。

どんなに完璧なモデルを作っても、この「予測不可能な変動」は残ります。だから「既約(減らせない)誤差」と呼ばれます。天気予報が完璧になれないのと同じ理由です。

2. バイアス二乗 $\text{Bias}^2(\hat{f}(x_0))$

ここで記号を整理しましょう:

「モデルの平均的な予測」とは、別の訓練データでモデルを作り直したら予測値が変わる、という考え方です。何度も訓練し直したときの予測値の平均が $E[\hat{f}(x_0)]$

バイアスは、この「平均的な予測」と「真の答え」のズレです:

$$\text{Bias}(\hat{f}(x_0)) = E[\hat{f}(x_0)] - f(x_0)$$

シンプルなモデルは、複雑な現実を捉えきれないため、バイアスが大きくなります。

3. バリアンス $\text{Var}(\hat{f}(x_0))$

これは「訓練データが変わると予測がどれくらいブレるか」。複雑なモデルはデータのノイズにも敏感に反応するため、バリアンスが大きくなります。

バイアスとバリアンスのトレードオフ

ここで核心に迫ります。バイアスとバリアンスは、通常トレードオフの関係にあります。

シンプルなモデル(例:直線)の場合:

複雑なモデル(例:高次多項式)の場合:

シンプル→複雑への変化でバイアスとバリアンスが逆方向に動く様子

これがU字カーブの正体です:

良いモデルを作るとは、このバランスを見つけること。「ちょうど良い複雑さ」を探す旅が、機械学習の核心なのです。

的当ての例え ── バイアスとバリアンスを直感的に理解する

バイアスとバリアンスをもっと直感的に理解するために、的当てに例えてみましょう。

あなたは弓矢で的を狙っています。何度も矢を放ちます。

高バイアス・低バリアンスの場合:
矢は毎回ほぼ同じ場所に当たる(ばらつきが小さい)。でも、的の中心から離れている(系統的にズレている)。

低バイアス・高バリアンスの場合:
平均すると的の中心を狙えている。でも、矢がばらばらに散らばる(ばらつきが大きい)。

的当ての例えでバイアスとバリアンスを視覚化

理想的な状態
矢が毎回、的の中心付近に集中している。これが低バイアス・低バリアンスの状態です。

機械学習のモデルも同じ。私たちが目指すのは、「的の中心(真の値)に、安定して当たる」モデルです。

モデル選択とモデル評価 ── 2つの異なる目標

ここまでの話を踏まえて、実践的な問題に移りましょう。

機械学習のプロジェクトでは、2つの異なる目標があります:

モデル選択(Model Selection)
複数の候補モデルから最良のものを選ぶ。
「決定木とランダムフォレスト、どちらがこのデータに適しているか?」

モデル評価(Model Assessment)
選んだモデルの汎化性能を見積もる。
「このモデルを本番環境で使ったら、どれくらいの精度が期待できるか?」

モデル選択と評価の違いを示すフロー図

この2つを混同すると、大きな問題が起きます。

例えば、モデル選択に使ったデータで最終的な性能を報告すると、楽観的すぎる推定値になります。なぜなら、そのデータに対してうまくいくモデルを選んだのだから。

データ分割 ── 訓練・検証・テスト

では、モデル選択と評価を「別々のデータで」行うには、どうすればいいでしょうか?

答えはシンプル:最初にデータを分けておくことです。

典型的な分割は3つ:

データを訓練・検証・テストの3つに分割する様子

重要なのは、テストデータは一度しか使わないこと。

検証データは何度も使ってOK。複数のモデルを試し、ハイパーパラメータを調整し、最良のモデルを選ぶ。この過程で検証データへの性能は最適化される。

だから、最終的な性能評価は「初めて見る」テストデータで行う必要があります。

典型的な分割比率は:

データが少ない場合は、クロスバリデーション(次章で解説)という手法を使います。

まとめ ── 汎化性能への道

この章で学んだことを振り返りましょう。

  1. 訓練誤差は信用できない:見たことのあるデータでの性能は、真の実力を反映しない
  2. テスト誤差がU字カーブを描く理由
    • シンプルすぎるモデル → 高バイアス(的外れ)
    • 複雑すぎるモデル → 高バリアンス(不安定)
  3. バイアス・バリアンス分解
    $$\text{Err}(x_0) = \sigma^2_\varepsilon + \text{Bias}^2 + \text{Var}$$
  4. モデル選択と評価は別物
    • 選択:検証データで最良モデルを選ぶ
    • 評価:テストデータで最終性能を測る
  5. データを賢く分割:訓練・検証・テストの3分割が基本
章の主要概念を順に示すサマリーアニメーション

次の章では、交差検証やブートストラップなど、限られたデータを最大限活用する手法を学びます。

汎化性能を理解する鍵:

$$\text{Err}(x_0) = \sigma^2_\varepsilon + \text{Bias}^2(\hat{f}(x_0)) + \text{Var}(\hat{f}(x_0))$$