ラーニングカーブ(Learning Curve)

Eval

ラーニングカーブ(Learning Curve)

作成日: 最終更新: 読了時間: 1 分
まとめ
  • Learning Curve は学習データ量とモデルスコアの関係を可視化する診断手法です。
  • learning_curve を使ってサンプル数ごとの訓練・検証スコアを描画し、バイアスやバリアンスの兆候を確認します。
  • データ収集やモデル調整の意思決定に生かす読み方と注意点を整理します。

1. Learning Curve とは #

Learning Curve(学習曲線)は、学習に用いるサンプル数を徐々に増やした際の 訓練スコア検証スコア を並べたグラフです。次のような問いに答えるのに役立ちます。

  • モデルが表現力不足(高バイアス)か、もしくは学習しすぎ(高バリアンス)か。
  • 追加でデータを集めた場合、性能が向上する余地があるか。
  • ハイパーパラメータやモデル構造を見直すべきかどうか。

2. Python 3.13 での例 #

下記のスクリプトでは回帰問題を題材に、Ridge 回帰の Learning Curve を描画します。

from __future__ import annotations

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import Ridge
from sklearn.model_selection import learning_curve
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


def plot_learning_curve_for_ridge() -> None:
    """訓練サンプル数ごとの RMSE を描画して保存する。"""
    features, targets = make_regression(
        n_samples=1500,
        n_features=25,
        n_informative=8,
        noise=12.0,
        random_state=42,
    )

    model = make_pipeline(StandardScaler(), Ridge(alpha=10.0))
    train_sizes, train_scores, valid_scores = learning_curve(
        estimator=model,
        X=features,
        y=targets,
        train_sizes=np.linspace(0.1, 1.0, 8),
        cv=5,
        scoring="neg_mean_squared_error",
        shuffle=True,
        random_state=42,
        n_jobs=None,
    )

    train_rmse = np.sqrt(-train_scores.mean(axis=1))
    valid_rmse = np.sqrt(-valid_scores.mean(axis=1))
    train_std = np.sqrt(train_scores.var(axis=1))
    valid_std = np.sqrt(valid_scores.var(axis=1))

    plt.figure(figsize=(7, 5))
    plt.plot(train_sizes, train_rmse, color="#1d4ed8", label="Train RMSE")
    plt.fill_between(
        train_sizes,
        train_rmse - train_std,
        train_rmse + train_std,
        alpha=0.2,
        color="#1d4ed8",
    )
    plt.plot(train_sizes, valid_rmse, color="#ea580c", label="Validation RMSE")
    plt.fill_between(
        train_sizes,
        valid_rmse - valid_std,
        valid_rmse + valid_std,
        alpha=0.2,
        color="#ea580c",
    )
    plt.xlabel("学習サンプル数")
    plt.ylabel("RMSE")
    plt.title("Learning Curve for Ridge Regression (RMSE)")
    plt.legend(loc="upper right")
    plt.grid(alpha=0.3)


plot_learning_curve_for_ridge()
Ridge 回帰の Learning Curve

サンプル数を増やすと訓練 RMSE が徐々に悪化し、検証 RMSE と近づく。十分なデータ量では検証スコアが安定し、これ以上のデータ追加効果が小さいことが分かる。

3. グラフの読み取り #

  • 高バリアンス(過学習)の兆候:訓練スコアは非常に良い一方で検証スコアが離れている。ハイパーパラメータを強める・特徴量を減らす・データを増やすなどで改善を図る。
  • 高バイアス(学習不足)の兆候:訓練スコアも検証スコアも悪い。モデルを複雑にする、特徴量を増やす、表現力の高いアルゴリズムへ変更する等が検討事項。
  • 収束している状態:訓練・検証スコアが近づき、追加データを入れても大きく改善しない。別のモデルや特徴量設計を試すタイミング。

4. 実務での活用ポイント #

  • データ収集の投資判断:Learning Curve がまだ下降中であれば追加データの価値が高い。収束していれば別施策に工数を割り当てる。
  • モデル容量・正則化の調整:曲線を確認してから木の深さや正則化強度を調整すると、過学習と学習不足を効率的に切り分けられる。
  • 特徴量エンジニアリングの優先度:訓練・検証スコアが高い位置で平行に走っている場合は、特徴量の改善が必要なサイン。
  • 他の診断ツールとの併用:Validation Curve や検証スコアの時系列と組み合わせると、改善サイクルの方向性を議論しやすくなる。

まとめ #

  • Learning Curve は訓練・検証スコアをサンプル数に対してプロットし、過学習・学習不足を見分ける。
  • learning_curve 関数を使えば簡単に図を生成でき、追加データやモデル調整の意思決定を後押しする。
  • その他の診断手法と併用しつつ、データとモデルのバランスを継続的にチェックしよう。