RidgeとLasso

RidgeとLasso

過学習と正則化

機械学習で回帰分析する場合、多くの説明変数を使ってしまいがちです。しかし、大量の説明変数を使用すると隔たった学習用データに必要以上に対応してしまう「過学習」の状態になる場合があります。
そこで過学習になるのを防ぐために、極端な重みのデータに対してペナルティを与えるという正則化の方法があります。

正則化のポイント

  • パラメーターの絶対値を小さくすると過学習を防ぐことに繋がる
  • パラメーターの絶対値を小さくする正則化には、L1正則化とL2正則化がある

LassoとRidgeを文学的に表現

  • L1正則化: 特定のデータの重みを0にする事で、不要なデータを削除する。この仕組みを使った回帰がLasso回帰
  • L2正則化: データの大きさに応じて0に近づけて、滑らかなモデルとする。この仕組みを使った回帰がRidge回帰

L1正則化(Lasso)はパラメーターのスパース推定を行うことができるのが嬉しいところです。
スパース推定とはパラメータに0が多くなるように推定することです。

LassoとRidgeを数学的に考察

最小二乗法は「予測と実際の値の二乗誤差」を最小とするような係数を決定する方法です。
$$
\min_w∑(y−f(w,x))^2
$$

LASSO回帰は「予測と実際の値の二乗誤差」を小さくしつつ、「モデルが複雑になりすぎないように w の大きさ(L1ノルム)も小さくする」仕組みのものです。
$$
\min_w ∑(y−f(w,x))^2+λ‖w‖_1\\
ただし,1ノルムとは、各成分の絶対値の和:\\
‖w‖_1=|w1|+⋯+|w_n|
$$
Ridge回帰は「予測と実際の値の二乗誤差」を小さくしつつ、「モデルが複雑になりすぎないように w の大きさ(L2ノルム)も小さくする」仕組みのものです。
$$
\min_w ∑(y−f(w,x))^2+λ‖w‖^2_2\\
ただし,L2ノルムとは、各成分の二乗和のルート:\\
‖w‖_2=\sqrt {w^2_1+⋯+w^2_n}
$$

ノルムの考え方

ノルムとはベクトルの大きさを表すものです。

L1ノルム

L1ノルムはベクトルの要素の絶対値の総和です。
これはすなわち、マンハッタン距離になります。
L1ノルムはベクトル空間の大きさをマンハッタン距離を使って測定します。

数式的には、ベクトル L1_x1 をn次元として、L1_x1 = (x1,⋯,xn) とします。
L1ノルムは次のように定義されます。

$$
\|L1_{x1}\| = |x_1|+|x_2|+⋯+|x_n|
$$

L1ノルムのPythonサンプル

L1ノルムがマンハッタン距離であることを端的に表すサンプルです。
X軸方向のベクトルL1_x1とY軸方向のベクトルL1_x2を作成します。
2つのベクトルは、それぞれが持つ各要素の値の絶対値を合計したら1になるような要素があります。
X軸方向のベクトルL1_x1とY軸方向のベクトルL1_x2のベクトルはマンハッタン距離になります。
それをグラフにすると次のようになります。

L1_x1 = [1, 0.5, 0, -0.5, -1, -0.5, 0, 0.5, 1]
L1_x2 = [0, 0.5, 1, 0.5, 0, -0.5, -1, -0.5, 0]
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.plot(L1_x1,L1_x2)

結果

* マンハッタン距離とは、碁盤の目のように縦横垂直な道路しかないので、縦or横移動のみ可、斜めに移動できない、という世界の距離をあらわしているものです。

L2ノルム

L2ノルムはベクトルの大きさをユークリッド距離で求めるものです。
ユークリッド距離とはx軸のある点とy軸のある点を最短距離で測定した大きさです。
その求め方ですが、次の式の通りです。つまり三平方の定理で求めることができます。

$$ 1=\sqrt{x_1^2 + x_2^2} $$

この様な値になるL2_x1とL2_x2を作成してグラフに表示します。
結果下の様なグラフになります。これはデータの数を増やせば円になります。

L2_x1 = [1, 0.7071, 0, -0.7071, -1, -0.7071, 0, 0.7071, 1]
L2_x2 = [0, 0.7071, 1, 0.7071, 0, -0.7071, -1, -0.7071, 0]
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.plot(L2_x1,L2_x2)

結果

もともとは、マイナスを絶対値か二乗することでプラスに変更して誤差の総和を求めたかったのですが、絶対値を使用するとマンハッタン距離が使われ、二乗を使用するとユークリッド距離が使われます。それぞれ特有の挙動をするところから正則化したときのの挙動も変わってきます。