3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ridge回帰(load_boston)

Last updated at Posted at 2020-10-09

今回は Ridge 回帰の実装(コード)をまとめていきます。

##■ Ridge回帰の手順

次の7つのSTEPで進めます。

  1. モジュールの用意
  2. データの準備
  3. パラメータの探索
  4. モデルの作成
  5. 予測値の算出
  6. 残差プロット
  7. モデルの評価

##1. モジュールの用意
最初に、必要なモジュールをインポートしておきます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# データセットを読み込むモジュール
from sklearn.datasets import load_boston

# 訓練データとテストデータを分割するモジュール
from sklearn.model_selection import train_test_split

# 標準化(分散正規化)を行うモジュール
from sklearn.preprocessing import StandardScaler

# パラメータ(alpha)を探索するモジュール
from sklearn.linear_model import RidgeCV

# パラメータ(alpha)をプロットするモジュール
from yellowbrick.regressor import AlphaSelection

# Ridge 回帰を実行するモジュール(最小二乗法+L2正則化項)
from sklearn.linear_model import Ridge

##2. データの準備 データの取得をした後、処理しやすいように分割を行います。

# Bostonデータセットの読み込み
boston = load_boston()

# 目的変数と説明変数に分ける
X, y = boston.data, boston.target

# 標準化(分散正規化)
SS = StandardScaler()
X = SS.fit_transform(X)

# 訓練データとテストデータに分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=123)

標準化は、例えば2桁と4桁の特徴量(説明変数)があった際に、後者の影響が大きくなってしまうため
全ての特徴量に対して平均を0・分散を1にして、スケールを揃えています。

random_state では、データの分割結果が毎回同じになるようにシード値を固定しています。


##3. パラメータの探索
Ridge 回帰では過学習を避けるために、最小二乗法の式に正則化項が追加されています。
alpha を大きくすると正則化が強くなり、小さくすると弱くなります。

最適な alpha を求めるため、訓練データに対してグリッドサーチと交差検証を行います。


# パラメータ(alpha)の探索区間を設定
alphas = np.logspace(-10, 1, 500)

# 訓練データを交差検証し、最適な alpha を求める
ridgeCV = RidgeCV(alphas = alphas)

# alpha をプロットする
visualizer = AlphaSelection(ridgeCV)
visualizer.fit(X_train, y_train)

visualizer.show()
plt.show()

<出力結果>
image.png
以上より、最適な alpha = 8.588 が求まりました。


##4. モデルの作成
先ほど求めたパラメータ(alpha)を用いて、Ridge 回帰のモデルを作成していきます。


# Ridge回帰のインスタンスを作成
ridge = Ridge(alpha = 8.588)

# 訓練データからモデルを生成(最小二乗法+正則化項)
ridge.fit(X_train, y_train)

# 切片を出力
print(ridge.intercept_)

# 回帰係数(傾き)を出力
print(ridge.coef_)

<出力結果>


lr.intercept_: 22.564747201001634

lr.coef_: [-0.80818323  0.81261982  0.24268597  0.10593523 -1.39093785  3.4266411
 -0.23114806 -2.53519513  1.7685398  -1.62416829 -1.99056814  0.57450373
 -3.35123162]

lr.intercept_:切片(重み $w_0$)
lr.coef_:回帰係数・傾き(重み $w_1$ ~ $w_{13}$)

よって、モデル式(回帰式)における具体的な数値が求まりました。

$ y = w_0 + w_1x_1+w_2x_2+ \cdots + w_{12}x_{12} + w_{13}x_{13}$


##5. 予測値の算出
作成したモデル式にテストデータ(X_test)を入れ、予測値(y_pred)を求めます。


y_pred = lr.predict(X_test)
y_pred

<出力結果>


y_pred: [15.25513373 27.80625237 39.25737057 17.59408487 30.55171547 37.48819278
 25.35202855 ..... 17.59870574 27.10848827 19.12778747 16.60377079 22.13542152]

##6. 残差プロット モデルの評価をする前に、残差のプロットを見ておきます。

残差:予測値と正解値の差(y_pred - y_test)

# 描画オブジェクトとサブプロットの作成
fig, ax = plt.subplots()

# 残差のプロット
ax.scatter(y_pred, y_pred - y_test, marker = 'o')

# y = 0 の赤い直線をプロット
ax.hlines(y = 0, xmin = -10, xmax = 50, linewidth = 2, color = 'red')
 
# 軸ラベルを設定する
ax.set_xlabel('y_pred')
ax.set_ylabel('y_pred - y_test')

# グラフのタイトルを追加
ax.set_title('Residual Plot')

plt.show()

<出力結果>
image.png

赤い線(y_pred - y_test = 0)の上と下で、バランス良くデータが散らばっているので
予測値の出力に大きな偏りはないことが確認できます。


##7. モデルの評価
今回は、決定係数を用いて評価をしていきます。


# 訓練データに対するスコア
print(ridge.score(X_train, y_train))

# テストデータに対するスコア
print(ridge.score(X_test, y_test))

<出力結果>


Train Score: 0.763674626990198
Test Score: 0.6462122981958535

##■ 最後に 以上、上記1~7の手順に沿って、Ridge 回帰を行いました。

今回は初学者の方向けに、実装(コード)のみまとめさせていただきましたが
今後タイミングを見て、理論(数式)についても記事を作成していければと思います。

ご精読いただき、ありがとうございました。

参考文献:Pythonによるあたらしいデータ分析の教科書
    (Python 3 エンジニア認定データ分析試験 主教材)

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?