まとめ
- 回帰タスクで用いる評価指標の全体像と選び方を整理します。
- 誤差系・決定係数系・確率/区間系の指標をコード例とともに比較します。
- ビジネス要件やデータ特性に応じた指標セットの組み立て方と注意点をまとめます。
Chapter 2 #
回帰評価指標の全体像 #
回帰タスクでは「予測値がどれだけ実測値に近いか」を測る指標が多数存在します。指標によって重視する観点(誤差の絶対値、二乗誤差、割合、確率的保証など)が異なり、用途に応じた選択が不可欠です。この章では、代表的な指標の位置づけと使い分けのヒントをまとめます。
指標カテゴリの整理 #
誤差ベース指標 #
- 平均絶対誤差 (MAE) — 外れ値に比較的ロバストで、単位が元データと同じ。
- 二乗平均平方根誤差 (RMSE) — 大きな誤差を強く罰する指標。モデルが「大外し」を避ける必要があるときに有効。
- 平均絶対パーセント誤差 (MAPE) / 荷重平均パーセント誤差 (WAPE) — 需要予測など比率の感覚が重要な場面で活躍。
- 平均絶対スケール誤差 (MASE) — 季節性時系列でベースライン(Naïve 予測)と比較する際に便利。
- 対数誤差 (RMSLE) — 需要が0に近い場合や成長率を重視したいときに。
決定係数・分散説明系 #
- 決定係数 (R²) — モデルが分散をどれだけ説明できたかを測る基本指標。負の値になることもある点を理解しておく。
- 自由度調整済み決定係数 (Adjusted R²) — 特徴量追加による過学習を補正。
- 説明分散 (Explained Variance) — 予測誤差の分散に着目したバリアンス系の指標。
区間・確率・分布系 #
- ピンボール損失 — 予測分位(Quantile Regression)の誤差評価に利用。
- PICP (Prediction Interval Coverage Probability) — 予測区間がどれだけ実測値をカバーできたか。
- PINAW (Prediction Interval Normalized Average Width) — 予測区間の幅をどれだけ狭くできているか。
指標選択のワークフロー #
- ビジネス要件を定義:絶対誤差なのか割合誤差なのか、過大予測と過小予測のどちらを避けたいのかを明確化。
- データの特性を確認:値が 0 をまたぐか、外れ値が多いか、季節性が強いかなどを確認。
- ベースラインを設定:Naïve 予測、単純回帰、平均などの基準を決め、指標で比較できるようにする。
- 複数指標で評価:MAE + RMSE、R² + Adjusted R² など補完関係にある指標を組み合わせて判断。
参考: 指標ごとの数値比較例 #
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
n = 200
y_true = rng.normal(loc=100, scale=15, size=n)
noise = rng.normal(scale=10, size=n)
baseline = y_true.mean() + rng.normal(scale=12, size=n)
model = y_true + noise
robust_model = y_true + np.clip(noise, -8, 8)
def mae(y, y_hat):
return np.mean(np.abs(y - y_hat))
def rmse(y, y_hat):
return np.sqrt(np.mean((y - y_hat) ** 2))
def mape(y, y_hat):
return np.mean(np.abs((y - y_hat) / y)) * 100
scores = {
"MAE": [mae(y_true, baseline), mae(y_true, model), mae(y_true, robust_model)],
"RMSE": [rmse(y_true, baseline), rmse(y_true, model), rmse(y_true, robust_model)],
"MAPE (%)": [mape(y_true, baseline), mape(y_true, model), mape(y_true, robust_model)],
}
labels = ["Baseline", "Model", "Robust"]
x = np.arange(len(labels))
width = 0.25
fig, ax = plt.subplots(figsize=(7, 4.5))
for idx, (metric, values) in enumerate(scores.items()):
ax.bar(x + idx * width, values, width=width, label=metric)
ax.set_xticks(x + width)
ax.set_xticklabels(labels)
ax.set_ylabel("Score")
ax.set_title("Comparison of regression metrics across models")
ax.legend()
ax.grid(axis="y", alpha=0.3)
plt.tight_layout()

同じデータでも指標によって優位なモデルが変わる。MAE では Robust モデルが最も低いが、RMSE では外れ値に弱い Baseline が大きく劣化している。
MAE は外れ値の影響が小さいためロバストモデルが優位に見えますが、RMSE は大きな誤差を強く罰するので外れ値を多く出したモデルが劣勢になります。複数指標を併用し、意図通りのモデルが選ばれているか確認しましょう。
指標サマリー #
| カテゴリ | 指標 | 主な用途 | 注意点 |
|---|---|---|---|
| 誤差 | MAE | 外れ値に強い、単位に馴染みがある | 0 付近で割合を評価したい場合は不向き |
| 誤差 | RMSE | 大きな誤差を重く扱いたいとき | 外れ値が多いと過大評価になりやすい |
| 誤差 | RMSLE | 桁差の大きいデータや指数成長 | 0 以下の値に適用できない |
| 誤差 | MAPE / WAPE | 需要予測など割合が重要なとき | 0 を含むと定義できない/過小予測を過大評価 |
| 誤差 | MASE | 時系列でナイーブ予測と比較 | 季節周期の設定を誤ると解釈しにくい |
| 誤差 | PINBALL LOSS | 予測分位の評価 | 分位ごとの最適化が必要 |
| 決定係数 | R² | モデルの分散説明力の把握 | 負の値になることがある |
| 決定係数 | Adjusted R² | 特徴量数が異なるモデルの比較 | サンプル数が少ないと不安定 |
| 決定係数 | 説明分散 | 出力のばらつきをどこまで再現できたか | スケール依存/誤差そのものは見えない |
| 区間 | PICP | 予測区間の信頼性評価 | 区間幅の広さも同時に確認する |
| 区間 | PINAW | 予測区間の幅を評価 | カバレッジとセットで見る必要 |
実務でのチェックリスト #
- デプロイ前:全データ・期間で指標が期待通りか、異常値が突発的に生じていないかを確認。
- モニタリング:ドリフトが起きた際に指標がどの程度変化するか、しきい値を明文化。
- 可視化の活用:残差プロット、予測 vs 実測チャート、分位プロットなどと組み合わせて解釈をサポート。
- ステークホルダー説明:ビジネス側に馴染みのある指標(MAE = 「平均で何〇〇円外すか」など)で補足し、意思決定に直結する説明を心掛ける。