Python入門トップページ


目次

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

リッジ回帰をしてみよう

scikit-learnでリッジ回帰をしてみよう

ここでは sklearn.linear_model.Ridge を使ったリッジ回帰を行ってみよう.

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

モジュールのインポート
import pandas as pd
import numpy as np
from sklearn import linear_model

次に GitHub のリポジトリから CSV ファイルを読み込んで,中身を確認します.

データファイルの読み込み
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]

モデルを定義して,当てはめを行います.このとき,linear_model.Ridge(alpha=0.1) の引数 alpha=0.1 は省略することができ,その場合は alpha=1.0 となります.scikit-learn では非常に短いコードで分析できることがわかります.


model = linear_model.Ridge(alpha=0.1)
results = model.fit(x_data, y_data)
print(results)
Ridge(alpha=0.1)

最適化された重みパラメータ(切片および係数)を確認します.前のページで計算した結果とよく似た結果が得られました.


print(model.intercept_)
print(model.coef_)
11.368089615105305
[5.78630237 6.99435477]

決定係数についても確認します.


print(model.score(x_data,y_data))
0.9997138688251579

さらにテスト用のデータファイルを GitHub のリポジトリから読み込みます.


url_test = "https://github.com/rinsaka/sample-data-sets/blob/master/ridge-test.csv?raw=true"
df_test = pd.read_csv(url_test)
x_test = df_test.loc[:,['x1', 'x2']].values
y_test = df_test.loc[:, 'y'].values
print(x_test)
print(y_test)
[[ 1.355  2.785]
 [ 1.152  2.366]
 [ 8.749 17.502]
 [ 8.427 16.897]
 [ 4.03   8.04 ]
 [ 3.664  7.279]
 [ 2.465  4.931]
 [ 6.278 12.654]
 [ 4.681  9.28 ]
 [ 2.877  5.808]]
[ 35.317  34.319 185.192 177.654  89.94   81.448  58.196 134.889 105.517
  70.136]

テストデータに対する精度も簡単に計算可能です.


print(model.score(x_test, y_test))
0.9988522145649757

最後に,テストデータの \(y\) とテストデータの \(x\) から得られる予測値を比較します.


print(y_test)
print(model.predict(x_test))
[ 35.317  34.319 185.192 177.654  89.94   81.448  58.196 134.889 105.517
  70.136]
[ 38.68780737  34.58255334 184.4076463  178.31287229  90.92150054
  83.48100989  60.12048835 136.2010612  103.36138331  68.63849406]

目次に戻る