【回帰③】正則化(Lasso, Ridge)を用いたモデルチューニング

はじめに

前回は多項式回帰を通じて、モデルが複雑すぎると「過学習(Overfitting)」が起きやすくなることを学びました。

今回はその対策として有効な手法「正則化(Regularization)」について解説します。正則化を導入することで、モデルの複雑さを抑え、汎化性能(未知データへの対応力)を高めることができます。

具体的には、次の2つの手法を扱います:

  • リッジ回帰(Ridge Regression):重みの大きさにペナルティを課す
  • ラッソ回帰(Lasso Regression):一部の重みをゼロにすることで特徴量選択の効果もある

これらの違いと実装例を、わかりやすく丁寧に解説します。


正則化とは?

基本の考え方

正則化とは、モデルの重み(パラメータ)に制約を加えることで、過学習を防ぎ、汎化性能を高めるテクニックです。

通常の線形回帰では、次のような目的関数(損失関数)を最小化します:

J = Σ(yi – yi”)²

yiは予測値 yi”は実測値

これは、すべての観測データに対して、予測値と実測値の差(二乗誤差)を合計して評価するものです。このままでは、モデルは学習データに過度に適合してしまい、テストデータでの精度が低下するリスクがあります(=過学習)。

正則化ではこの損失関数に「重みの大きさに対するペナルティ」を追加します。これにより、重みが極端に大きくなるのを防ぎ、より滑らかなモデルが得られます。

このペナルティ項の追加が、リッジ回帰やラッソ回帰の違いとなります。


リッジ回帰(Ridge Regression)

数式的な違い

リッジ回帰では、目的関数に「重みの二乗和(L2ノルム)」を加えます:

    J = Σ(y-y”)² + αΣw²

  • α:正則化の強さ(大きいほど罰則が厳しくなる)
  • w:重みの値

特徴

  • すべての重みを少しずつ小さくする(ゼロにはならない)
  • 全ての特徴量を活かしながら、過学習を抑える
  • 重みの滑らかさを保ちながら予測性能を維持できる

ラッソ回帰(Lasso Regression)

数式的な違い

ラッソ回帰では、目的関数に「重みの絶対値の和(L1ノルム)」を加えます:

     J = Σ(y-y”)² + αΣ|w|

特徴

  • 一部の重みを完全にゼロにする(不要な特徴を排除)
  • 結果として、特徴量の選択(Feature Selection)が行われる
  • 高次元データや多数の特徴があるデータに特に有効

実装:多項式回帰との組み合わせ

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.metrics import r2_score

# データ作成
np.random.seed(42)
x = np.linspace(0, 6, 100)
y = np.sin(x) + np.random.normal(0, 0.2, len(x))
X = x.reshape(-1, 1)

# リッジ回帰(15次多項式)
model_ridge = make_pipeline(PolynomialFeatures(degree=15), Ridge(alpha=1.0))
model_ridge.fit(X, y)
y_pred_ridge = model_ridge.predict(X)

# ラッソ回帰(15次多項式)
model_lasso = make_pipeline(PolynomialFeatures(degree=15), Lasso(alpha=0.01, max_iter=10000))
model_lasso.fit(X, y)
y_pred_lasso = model_lasso.predict(X)

比較と可視化

plt.figure(figsize=(10, 5))
plt.scatter(x, y, label="実測値", color="black")
plt.plot(x, y_pred_ridge, label="Ridge回帰", color="blue")
plt.plot(x, y_pred_lasso, label="Lasso回帰", color="red")
plt.title("リッジ vs ラッソ 回帰")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

評価指標

print("R²(Ridge):", r2_score(y, y_pred_ridge))
print("R²(Lasso):", r2_score(y, y_pred_lasso))

ハイパーパラメータ α の調整

  • 小さいと通常の線形回帰に近づく(正則化が弱い)
  • 大きすぎるとモデルが単純になりすぎて「過少適合(Underfitting)」になる
  • 最適なαを見つけるには グリッドサーチやクロスバリデーションが有効(次回以降で紹介)

おわりに

正則化は、機械学習の中でも非常に重要な考え方です。特に高次元・高複雑なモデルにおいては、過学習を防ぎ、モデルの性能を安定させるために不可欠な手法です。

本記事では、リッジ回帰とラッソ回帰の違いと、それぞれの役割を丁寧に紹介しました。

次回は、ハイパーパラメータを最適化する方法として「グリッドサーチ」「クロスバリデーション」などを取り上げます。


練習問題

Q1. リッジ回帰の目的は?

  • A. 重みをゼロにして特徴量を削減する
  • B. 重みを滑らかに抑えて過学習を防ぐ
  • C. ラベルを二値に分類する

Q2. ラッソ回帰の特徴は?

  • A. モデルの精度を無視する
  • B. 一部の重みを0にして、不要な特徴を削除する
  • C. データを標準化しないと使えない

Q3. 正則化パラメータ α を大きくするとどうなる?

  • A. モデルが複雑になる
  • B. モデルが単純になりすぎる
  • C. モデルの精度が常に上がる

🔗 機械学習シリーズ 関連リンク

▶ 入門〜分類編

▶ 回帰編

▶ 応用編


コメント

タイトルとURLをコピーしました