ここでリッジ回帰によって分析を試みるダミーデータを眺めてみよう.
まずは必要なモジュールをインポートします.
モジュールのインポート
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()
上の結果から,\(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つのパラメータの推定値が大きくなってしまうことを確認します.さらに,正則化によってパラメータの二乗和が小さく推定されるようなリッジ回帰を行ってみよう.