バイアスとバリアンスのトレードオフ
やさしく深掘りする機械学習の核心
📅 2025-04-28
📊 機械学習解説シリーズ
📌 1. 用語をざっくり定義
用語 | ざっくり意味 | イメージ |
---|---|---|
バイアス (Bias) | モデルの"かたより" 真値からどれだけズレているか |
ダーツが的の外周にまとまって外れている |
バリアンス (Variance) | 予測の"ばらつき" データが変わると結果がどれだけ動くか |
ダーツがあちこちに散らばる |
直感
高バイアス = 頭が固い → 学習不足(Underfitting)
高バリアンス = 神経質 → 学習しすぎ(Overfitting)
🎯
🎯
🎯
🎯
高バイアス
🎯
🎯
🎯
🎯
高バリアンス
🧮 2. 数式で見る関係 — MSE の分解
MSE
平均二乗誤差
=
(Bias)²
かたより
+
Variance
ばらつき
+
σ²
観測ノイズ
Bias²
モデルの構造的ズレ
Variance
学習データが変わるたびの不安定さ
σ²
どうにもできないノイズ
📍 ゴール:
Bias² と Variance を同時に最小化。
ただし片方を下げるともう片方が上がりやすい
=トレードオフ
🔄 3. モデル複雑度との関係
シンプル
(線形回帰)
(線形回帰)
最適領域
複雑
(高次数多項式)
(高次数多項式)
高バイアス
低バリアンス
低バリアンス
ベストバランス
低バイアス
高バリアンス
高バリアンス
モデル複雑度の影響:
左端: 直線で全部表そうとして外しまくる → 高バイアス
右端: 全点を通る多項式で"記憶"→新データに弱い → 高バリアンス
真ん中あたりに 最適解 がある
🧪 4. 実験で体感してみる(Python)
# 疑似データ: sin波 + ノイズ
X = np.linspace(0, 2*np.pi, 100)[:, None]
y = np.sin(X).ravel() + rng.normal(scale=0.3, size=X.shape[0])
# データ分割
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.5)
# 多項式次数を変えて誤差を計測
degrees = range(1, 16)
train_err, test_err = [], []
for d in degrees:
model = make_pipeline(PolynomialFeatures(d), LinearRegression())
model.fit(Xtr, ytr)
train_err.append(mean_squared_error(ytr, model.predict(Xtr)))
test_err.append(mean_squared_error(yte, model.predict(Xte)))
実験から得られる知見:
低次数(1–2): Train/Test とも誤差大 → 高バイアス
高次数(11–15): Train 誤差ほぼ 0、Test は急上昇 → 高バリアンス
中間(4–6) が最適領域
🛠 5. バイアスとバリアンスを調整する5つの手段
手段 | バイアス | バリアンス | コアアイデア |
---|---|---|---|
モデルを複雑に | ↓ | ↑ | 非線形層を追加、深い NN |
正則化 (L1/L2, Dropout) | ↑ | ↓ | 重みを縛り過学習抑制 |
データを増やす | → | ↓ | バリアンスが統計的に安定 |
アンサンブル (Bagging) | → | ↓ | 複数モデルの平均でばらつきを打ち消す |
クロスバリデーション | 観測 | 観測 | 汎化性能を見積もり最適複雑度を選択 |
💡 モデル調整のコツ
過学習に悩む時は「データ増量」と「正則化」の両方を試してみよう!
📋 6. 実務でのチェックリスト
学習曲線を描く
データ量 vs 精度で"バリアンス優勢"か"バイアス優勢"か判断
データ量 vs 精度で"バリアンス優勢"か"バイアス優勢"か判断
正則化パラメータ λ をグリッドサーチ
λ 大 → バイアス↑/バリアンス↓、λ 小 → 逆
λ 大 → バイアス↑/バリアンス↓、λ 小 → 逆
特徴量の質を高める
重要変数を増やすとバイアス↓; ただし過剰だとバリアンス↑
重要変数を増やすとバイアス↓; ただし過剰だとバリアンス↑
可視化で直感を補強
残差グラフ、部分依存プロットで偏りを目視
残差グラフ、部分依存プロットで偏りを目視
💡 覚えておこう
実務では「手を動かしながら考える」のが最短ルート!
実験→考察→再実験のサイクルを回そう
📝 7. まとめ
モデル誤差は Bias² + Variance + ノイズ に分解できる
高バイアス=学習不足、高バリアンス=学習しすぎ
最適複雑度 は実験・可視化・正則化で探る
「データを増やす」はバリアンス低減に効く"万能薬"
迷ったら クロスバリデーション + 学習曲線 で状況を定量化しよう
📢 キーフレーズ
「シンプルすぎは鈍感、複雑すぎは神経質。
ちょうどよい"気の利いたモデル"を目指そう。」
ちょうどよい"気の利いたモデル"を目指そう。」