正則化の基礎概念
正則化は過学習を防ぐための手法であり、損失関数にパラメータ制約項を追加します。線形回帰モデルでは主に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ノルム |
| パラメータ | 全パラメータ縮小 | スパース解生成 |
| 特徴選択 | 不可 | 可能 |
ハイパーパラメータ調整
正則化係数λの選択手順:
- λ値の候補リスト作成(例: 0.001, 0.01, 0.1, 1, 10)
- 各λ値でモデル訓練
- 検証セットで評価
- 最適λ値選択
- テストセットで最終評価