目次


  • リッジ回帰とは

  • リッジ回帰の実装

  • 制約の強さを変化させる

  • おまけ


参考文献


リッジ回帰とは

リッジ回帰は、線形モデルによる回帰の一つ。


通常最小二乗法と同じ点


  • 予測に用いられる式


通常最小二乗法との異なる点


  • 係数($w$)は、訓点データへの予測だけでなく、他の制約へも最適化する

  • 個々の特徴量の影響度を小さくしたいため、正則化をする


正則化とは

正則化とは、過剰適合(過学習)を防ぐために、モデルが複雑になりすぎないように制約すること。

下の図でいうと、正則化をすることで、左に移動する。

リッジ回帰では、L2正則化が用いられる。


準備

$ pip install scikit-learn

$ pip install mglearn


実装

import mglearn

from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

ridge = Ridge().fit(X_train, y_train)
print(f"training dataに対しての精度: {ridge.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.89
# => test set scoreに対しての精度: 0.75


ちなみに同じでデータセットで線形回帰(通常最小二乗法)

from sklearn.linear_model import LinearRegression

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)
print(f"training dataに対しての精度: {lr.score(X_train, y_train):.2}")
print(f"test dataに対しての精度: {lr.score(X_test, y_test):.2}")
# => training dataに対しての精度: 0.95
# => test dataに対しての精度: 0.61


考察


  • リッジ回帰の方がtraining dataへの精度が低い

  • リッジ回帰の方がtest dataへの精度が高い

  • 過剰適合を防ぎ、モデルの複雑さを軽減できている


    • 予想通り、上の図の左側に遷移したといえる



僕らが目指すのは、test dataに対する精度なので、リッジ回帰の方が良いといえる。


制約の強さを変化させる

上のリッジ回帰の実装では、正則化の強さは、デフォルト値のままである。

正則化の強弱、つまり、モデルの複雑さは、alphaの値を変化させることにより、僕ら(モデルを構築する側)が決められる。


  • alphaを増やす -> 正則化が強くなる -> モデルは簡潔になる

  • alphaを減らす -> 正則化が弱くなる -> モデルは複雑になる


alphaを増やす

「alpha=10」にする。

ridge10 = Ridge(alpha=10).fit(X_train, y_train)

print(f"training dataに対しての精度: {ridge10.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge10.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.79
# => test set scoreに対しての精度: 0.64


考察

仮説通り、上の図の左側に遷移し、おそらく「スイートスポット」を超えて、精度が下がった。


aplhaを減らす

「alpha=0.01」にする。

ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)

print(f"training dataに対しての精度: {ridge01.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge01.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.93
# => test set scoreに対しての精度: 0.77


考察

仮説通り、上の図の右側に遷移し、おそらく「alpha=1.0」の際より「スイートスポット」に近づき、精度は向上した。

alphaパラメータのモデルへの影響を定量的に知るには、alphaを変化させて、それらのモデルの coef_ 属性を確認するとよいだろう。

だが、本記事ではここまでで、終了して、それらの内容は参考文献で学習してみてください。


おまけ

分析結果とグラフとの対応を確認しながら学習すると、理解度が深まると思う。参考書にグラフが出てきた際は、その解説を読む前に、そのグラフを自分なりに読み解いてみると良いかもしれません。

次の記事では、L1正則化を使うLassoを書きます。