Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

目次

  • リッジ回帰とは
  • リッジ回帰の実装
  • 制約の強さを変化させる
  • おまけ

参考文献

リッジ回帰とは

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

通常最小二乗法と同じ点

  • 予測に用いられる式

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

  • 係数($w$)は、訓点データへの予測だけでなく、他の制約へも最適化する
  • 個々の特徴量の影響度を小さくしたいため、正則化をする

正則化とは

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

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

width=70

リッジ回帰では、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を書きます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
21
Help us understand the problem. What are the problem?