ここでは,前のページで眺めたデータについて重回帰分析を行い,パラメータの推定値が大きくなってしまうことを確認しよう.
まず,必要なモジュールをインポートします.ここでは後ほど sklearn.linear_model.Ridge を使ったリッジ回帰を行いたいので,重回帰分析も sklearn.linear_model.LinearRegression を使って行うことにします.
モジュールのインポート
import pandas as pd
import numpy as np
from sklearn import linear_model
GitHub のリポジトリ から CSV ファイルを読み込んで表示してみます.このデータは \(x_1\) と \(x_1\) をほぼ2倍した \(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 配列を作成します.
NumPy 配列へ変換
x_data = df.loc[:,['x1', 'x2']].values
y_data = df.loc[:, 'y'].values
print(x_data)
print(y_data)
[[ 9.852 19.712] [ 8.516 16.936] [ 0.416 0.816] [ 7.852 15.671] [ 5.855 11.8 ] [ 4.463 8.936] [ 0.623 1.342] [ 8.49 17.023] [ 4.143 8.298] [ 0.8 1.531]] [205.06 179.572 20.035 168.983 127.056 99.45 22.804 178.753 93.451 27.555]
重回帰モデルを定義し,モデルの当てはめを行います.
モデルの定義と当てはめ
model = linear_model.LinearRegression()
results = model.fit(x_data, y_data)
results
LinearRegression()
切片の推定値を確認します.想定した 10 に近い値が得られました.
切片の推定値
model.intercept_
11.546456422815808
次に,\(x_1\) と \(x_2\) の重みパラメータの推定値を確認します.想定した値は 10 と 5 ですが,\(x_1\) に対する重み推定値が極端に大きな値となってしまっており,これとバランスを取るように \(x_2\) に対する重み推定値が小さな値になってしまっています.
重みパラメータの推定値
model.coef_
array([32.55806264, -6.40309939])
念の為,決定係数によって当てはめの良さを確認すると,決定係数は非常に高い値になっていることがわかりました.
決定係数
model.score(x_data,y_data)
0.999849270227403
さらにテスト用のデータファイルを GitHub のリポジトリから読み込みます.
テストデータの読み込み
url_test = "https://github.com/rinsaka/sample-data-sets/blob/master/ridge-test.csv?raw=true"
df_test = pd.read_csv(url_test)
print(df_test)
no x1 x2 y 0 10 1.355 2.785 35.317 1 11 1.152 2.366 34.319 2 12 8.749 17.502 185.192 3 13 8.427 16.897 177.654 4 14 4.030 8.040 89.940 5 15 3.664 7.279 81.448 6 16 2.465 4.931 58.196 7 17 6.278 12.654 134.889 8 18 4.681 9.280 105.517 9 19 2.877 5.808 70.136
このテストデータも学習用のデータと同じ関連性を持つデータです.テストデータへの当てはめの良さも確認しておきます.
x_test = df_test.loc[:,['x1', 'x2']].values
y_test = df_test.loc[:, 'y'].values
model.score(x_test,y_test)
0.9989895178444262
このページでは重回帰分析によって得られる重みパラメータの推定値が極端に大きくなってしまう場合があることを確認しました.次のページではパラメータを大きくさせないように正則化を行うリッジ回帰について説明します.