Python入門トップページ


目次

  1. データを眺める
  2. 重回帰分析
  3. 重回帰分析とリッジ回帰
  4. リッジ回帰を自作してみよう
  5. scikit-learnでリッジ回帰をしてみよう

リッジ回帰をしてみよう

データを眺める

ここでリッジ回帰によって分析を試みるダミーデータを眺めてみよう.

データの読み込み

まずは必要なモジュールをインポートします.

モジュールのインポート
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 高解像度ディスプレイ用
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')

次に CSV ファイルを読み込んで表示してみます.ここで利用するデータは GitHub のリポジトリで公開しているので,プログラムの中で読み込むことができます.このデータは \(x_1\)\(x_2\) から \(y\) が決まるようなデータです.

データの読み込み
url = "https://github.com/rinsaka/sample-data-sets/blob/master/ridge-train.csv?raw=true"
df = pd.read_csv(url)
print(df)
   no     x1      x2        y
0   0  9.852  19.712  205.060
1   1  8.516  16.936  179.572
2   2  0.416   0.816   20.035
3   3  7.852  15.671  168.983
4   4  5.855  11.800  127.056
5   5  4.463   8.936   99.450
6   6  0.623   1.342   22.804
7   7  8.490  17.023  178.753
8   8  4.143   8.298   93.451
9   9  0.800   1.531   27.555

相関係数と散布図行列

分析を行う前に,変数間の相関係数を計算し,散布図行列も描いて確認してみよう.まずは,相関係数を計算します.これには Pandas のデータフレームを NumPy 配列に変換し,これを転置して np.corrcoef 関数に与えると良いでしょう.

相関係数の計算
# x1, x2, y 列だけとりだして NumPy 配列に変換
xy = df.loc[:,['x1','x2','y']].values
# NumPy配列を転置して相関係数を求める
print(np.corrcoef(xy.T))
[[1.         0.9999631  0.99990917]
 [0.9999631  1.         0.99982451]
 [0.99990917 0.99982451 1.        ]]

次に,変数ごとの散布図を描いて変数間の関連を確認します.複数の散布図をまとめた散布図行列を描くには seaborn パッケージを使うと良いでしょう.このとき Pandas のデータフレームには no 列が含まれているので,この列を削除してから散布図を描きます.なお,df.drop でデータフレームの行や列を削除できるが,axis=1とすると列を削除し,axis=0や省略すると行を削除します.

散布図行列を描く
# no列を削除したデータフレームについて, x1, x2, y それぞれの組み合わせで散布図行列を描く
sns.pairplot(df.drop('no', axis=1))
plt.show()
ridge-sns

上の結果から,\(x_1\)\(x_2\)\(y\) はそれぞれに非常に高い正の相関関係があることがわかります.

データの関連

再びデータを表示してデータの関連を確認しよう.実は \(x_2\)\(x_1\) を2倍した値に一様乱数によって最大 \(\pm 0.1\) の誤差を加えた値になっています.さらに,\(y\)\(10 + 10x_1 + 5x_2\) に最大 \(\pm 2.5\) の乱数による誤差を加えた値です.例えば先頭の \(x_2 = 19.712\)\( 2x_1 = 2 \times 9.852 = 19.704 \) と僅かな誤差の和であり,\(y = 205.060\)\( 10 + 10x_1 + 5x_2 = 10 + 10 \times 9.852 + 5 \times 19.712 = 207.08 \) に誤差を加えたものです.

データの確認
print(df)
   no     x1      x2        y
0   0  9.852  19.712  205.060
1   1  8.516  16.936  179.572
2   2  0.416   0.816   20.035
3   3  7.852  15.671  168.983
4   4  5.855  11.800  127.056
5   5  4.463   8.936   99.450
6   6  0.623   1.342   22.804
7   7  8.490  17.023  178.753
8   8  4.143   8.298   93.451
9   9  0.800   1.531   27.555

このように \(x_1\)\(x_2\) の相関が非常に高い場合,つまり多重共線性がある場合は重回帰分析において予測精度が低下したり,一部の重みパラメータの推定値が極端に大きくなったりする場合があります.次のページ以降ではこのデータに対して重回帰分析を行い,1つのパラメータの推定値が大きくなってしまうことを確認します.さらに,正則化によってパラメータの二乗和が小さく推定されるようなリッジ回帰を行ってみよう.

目次に戻る