正則化を用いた線形回帰:リッジ回帰とLasso回帰の実装

正則化の基礎概念

正則化は過学習を防ぐための手法であり、損失関数にパラメータ制約項を追加します。線形回帰モデルでは主に2種類の正則化項が使用されます:

  • L1ノルム(パラメータの絶対値和):Lasso回帰
  • L2ノルムの二乗(パラメータの二乗和):リッジ回帰

コスト関数の可視化

単純な線形回帰を例に、正則化の効果を考察します。仮定するモデルとコスト関数:

# サンプルデータ
import numpy as np
X_sample = np.array([[1]])
y_sample = np.array([[1]])

# パラメータ空間
theta0 = np.linspace(-2, 2, 100)
theta1 = np.linspace(-2, 2, 100)
Theta0, Theta1 = np.meshgrid(theta0, theta1)
J = (Theta0 + Theta1 - 1)**2  # MSEコスト関数

正則化項の影響

L1正則化項(λ=1)を追加した場合:

J_reg = J + np.abs(Theta1)  # L1正則化追加

正則化によりコスト関数の最小値位置が原点方向に移動し、パラメータ値が抑制されます。

リッジ回帰の実装

リッジ回帰のコスト関数:

J(θ) = \frac{1}{2m} \sum_{i=1}^m (y^{(i)} - (wx^{(i)} + b))^2 + \frac{\lambda}{2} \sum_{j=1}^n w_j^2

数値解法

正規方程式による解法:

# リッジ回帰パラメータ推定
def ridge_regression(X, y, lamb):
    I_matrix = np.eye(X.shape[1])
    return np.linalg.inv(X.T @ X + lamb * I_matrix) @ X.T @ y

勾配降下法による実装例:

def gradient_descent(X, y, learning_rate, lamb, iterations):
    weights = np.zeros(X.shape[1])
    m = len(y)
    
    for _ in range(iterations):
        residuals = X @ weights - y
        grad = (X.T @ residuals) / m + lamb * weights
        weights -= learning_rate * grad
    
    return weights

実践例

from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures

# 多項式特徴量作成
poly_trans = PolynomialFeatures(degree=10)
X_poly = poly_trans.fit_transform(X_data)

# リッジ回帰モデル訓練
ridge_model = Ridge(alpha=0.5)
ridge_model.fit(X_poly, y_data)

Lasso回帰の実装

Lasso回帰のコスト関数:

J(θ) = \frac{1}{2m} \sum_{i=1}^m (y^{(i)} - (wx^{(i)} + b))^2 + \lambda \sum_{j=1}^n |w_j|

スパース性の特徴

Lasso回帰は特徴選択効果を持ちます:

from sklearn.linear_model import Lasso

lasso_model = Lasso(alpha=0.01)
lasso_model.fit(X_poly, y_data)
print(lasso_model.coef_)  # 多数の係数が0に

手法の比較

リッジとLassoの主な差異:

特性リッジ回帰Lasso回帰
正則化項L2ノルムL1ノルム
パラメータ全パラメータ縮小スパース解生成
特徴選択不可可能

ハイパーパラメータ調整

正則化係数λの選択手順:

  1. λ値の候補リスト作成(例: 0.001, 0.01, 0.1, 1, 10)
  2. 各λ値でモデル訓練
  3. 検証セットで評価
  4. 最適λ値選択
  5. テストセットで最終評価

タグ: リッジ回帰 Lasso回帰 正則化 線形回帰 sklearn

5月19日 14:45 投稿