はじめに
前回は多項式回帰を通じて、モデルが複雑すぎると「過学習(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. モデルの精度が常に上がる
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント