月影

日々の雑感

【図解】Ridge, Lasso, Elastic Netの違いと使い分けをやさしく解説|機械学習の正則化

 

Ridge / Lasso / Elastic Net — 正則化の論点をやさしくまとめる

機械学習過学習(オーバーフィッティング)を避け、モデルを安定化させるための代表的な手法について、直感と実践のポイントを整理します。図を見ながらイメージすると理解が早いです。

なぜ正則化するのか

モデルが訓練データに過度に適合すると、ノイズまで学習して新しいデータで性能が落ちます。正則化は「係数に罰則を与える」ことで過度の振れ幅を抑え、汎化性能(未知データでの性能)を改善します。

代表的な考え方:

目的
誤差(RSS)を小さくすることに加え、係数の大きさにもペナルティを課す。

Lasso(L1)の直感 — 特徴量選択ができる

コスト関数の形RSS + λ * Σ |βj|

ポイント:

  • 係数の絶対値の和を罰則にする(L1ノルム)。
  • 幾何的に見ると、罰則の許容領域が「ひし形」のようになり、最適解がその角(頂点)で決まりやすく、結果としていくつかの係数がちょうどゼロになる
  • → 不要な説明変数を自動で選択(ゼロにする)ので、変数選択を同時に行いたい場面で有効。

注意点:相関の強い説明変数が複数あると、Lassoはそのうちのどれか一つだけを選びがち(選ばれる変数が不安定になることがある)。

Ridge(L2)の直感 — 全体を安定化する

コスト関数の形RSS + λ * Σ βj2

ポイント:

  • L2ノルム(係数の二乗和)を罰則にする。
  • 幾何的に罰則の領域は「円形」になり、最適解は軸に張り付かず、係数はゼロになりにくい。
  • → 相関の高い特徴量がある場合でも、それらをまとめて小さくする性質があり、推定が安定する。

注意点:変数選択は行わない(係数はゼロにならず、ただし小さくなる)。

Elastic Net — Lasso と Ridge の“いいとこ取り”

コスト関数の形(代表的表記):

RSS + λ ( α Σ |βj| + (1-α) Σ βj2 )

ここで α(0〜1)は L1 と L2 の重みのバランス。

特徴:

  • α = 1 なら Lasso、α = 0 なら Ridge。
  • 0 < α < 1 のとき、Elastic Net は一部の係数をゼロにできる一方で、相関の高い説明変数群はまとめて残す傾向がある。
  • → 多くの説明変数があり、かつ相関の強い変数群が存在する実データで特に有効。
画像が生成されました
制約領域イメージ:Ridge(円)・Lasso(ひし形)・Elastic Net(丸みを帯びたひし形)。最適解は等誤差(RSS)の輪郭が領域に触れる点。

どの手法を選ぶか(実務上の指針)

  1. 特徴量が少ない/相関が弱い:Ridge もしくは Lasso、どちらでも状況次第。モデル解釈(変数選択)を優先するなら Lasso。
  2. 特徴量が多く、相関の高い群がある:Elastic Net を優先。Lasso 単体より安定する。
  3. 単純に予測性能を最大化したい:クロスバリデーションで λ(と α)をチューニングして比較するのが最も確実。
  4. 解釈性(どの変数を採用するか)が必要:Lasso / Elastic Net(小さい α ほど Ridge 寄り)で調整。

scikit-learn の例(Python

簡単なコード例:Elastic Net を使ってハイパーパラメータをグリッドサーチする例。

from sklearn.linear_model import ElasticNet
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

# パイプライン(標準化 → ElasticNet)
pipe = make_pipeline(StandardScaler(), ElasticNet(max_iter=5000))

param_grid = {
    "elasticnet__alpha": [0.01, 0.1, 1.0],      # 正則化強さ(λに相当)
    "elasticnet__l1_ratio": [0.1, 0.5, 0.9],    # α(L1とL2のバランス)
}

gs = GridSearchCV(pipe, param_grid, cv=5, scoring="neg_mean_squared_error")
gs.fit(X_train, y_train)

print("best params:", gs.best_params_)
print("best CV score:", gs.best_score_)

ポイント:

  • alpha(scikit-learn) = 正則化の全体強さ(大きいほど係数は小さくなり過学習しにくい)。
  • l1_ratio = L1 vs L2 の比率(1.0 が Lasso、0.0 が Ridge)。
  • データは標準化(平均0、分散1)してから使うとよい(正則化は係数のスケールに敏感)。

実務的な小技・注意点

  • カテゴリ変数はワンホット/エンコーディング後に必ず標準化する。
  • スパースな解(Lasso)を期待するなら、データのスケールと相関構造を先に確認する。
  • 多重共線性が強ければ、Ridge や Elastic Net のほうが安定する。
  • 重要な変数をゼロにしたくない場合は、該当変数に低いペナルティを与える手法(例:係数ごとに重み付けする正則化)を検討する。

まとめ

正則化は「誤差を抑えつつ係数に罰則を課す」ことで汎化を改善します。Lasso(L1)はゼロにして特徴量選択ができ、Ridge(L2)は全体を安定化します。Elastic Net は両者のバランスをとり、実務で最も汎用性が高いことが多いです。最終的にはクロスバリデーションでハイパーパラメータを探索して選択しましょう。