scikit-learnを使って線形回帰
scikit-learnを使って線形回帰を試してみました。
ランダム値の線形回帰
100個のランダム値を生成し、線形回帰を行います。
linear_model.py
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model, datasets # ランダム値を生成 np.random regdata = datasets.make_regression(100, 1, noise=20.0) # 学習 lin = linear_model.LinearRegression() lin.fit(regdata[0], regdata[1]) # 係数 print('Coefficients: \n', lin.coef_) # 切片 print('Intercept: \n', lin.intercept_) # スコア print("score :", lin.score(regdata[0], regdata[1])) # グラフ表示 xr = [-2.5, 2.5] plt.plot(xr, lin.coef_ * xr + lin.intercept_) plt.scatter(regdata[0], regdata[1]) plt.show()
1回目
# python linear_model.py Coefficients: [ 28.77344809] Intercept: 1.17104056235 score : 0.63621451029
2回目
# python linear_model.py Coefficients: [ 96.59440538] Intercept: -0.724090720802 score : 0.965655265098
1回目と2回目のスコアの値を見ると、
・1回目:0.63621451029
・2回目:0.965655265098
となっており、2回目のほうが数値が高いです。
スコアは重相関係数Rの2乗で寄与率もしくは決定係数と呼ばれます。
0 < < 1 の値を取ります。
数値が高いほどうまく当てはまっている事を表しているので、
図を見ると確かに2回目のほうがうまく当てはまっていることがわかります。
datasetsを使用した線形回帰
scikit-learnに入っているデータセットを使って線形回帰をしてみます。
diabetes(糖尿病)データセットを使ってみます。
diabetesデータセットは10次元のデータになっており、
その中のbmiの数値を使用します。
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model, datasets from pprint import pprint diabetes = datasets.load_diabetes() # BMIのデータを取得 diabetes_bmi = diabetes.data[:, np.newaxis, 2] # トレーニング用データとテスト用データに分割 data_train = diabetes_bmi[:-20] target_train = diabetes.target[:-20] data_test = diabetes_bmi[-20:] target_test = diabetes.target[-20:] # 線形回帰オブジェクト生成 lin = linear_model.LinearRegression() # 学習 lin.fit(data_train, target_train) # 係数 print('Coefficients: \n', lin.coef_) # 切片 print('Intercept: \n', lin.intercept_) # 平均二乗誤差(標準偏差) print("Residual sum of squares: %.2f" % np.mean((lin.predict(data_test) - target_test) ** 2)) # スコア print("Variance score :", lin.score(data_test, target_test)) # 散布図 plt.scatter(data_test, target_test, color='black') # 線図 plt.plot(data_test, lin.predict(data_test), color='blue') plt.show()
実行してみます。
# python diabetes.py Coefficients: [ 938.23786125] Intercept: 152.918861826 Residual sum of squares: 2548.07 Variance score : 0.472575447982
スコアが 0.472575447982 となっており、
図を見てもあまりフィットしてないことがわかります。
終わり。
【参考】