ここでは 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]