Python入門トップページ


目次

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

リッジ回帰をしてみよう

重回帰分析

ここでは,前のページで眺めたデータについて重回帰分析を行い,パラメータの推定値が大きくなってしまうことを確認しよう.

まず,必要なモジュールをインポートする.ここでは後ほど 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

このページでは重回帰分析によって得られる重みパラメータの推定値が極端に大きくなってしまう場合があることを確認しました.次のページではパラメータを大きくさせないように正則化を行うリッジ回帰について説明します.

目次に戻る