scikit-learnを使って線形回帰

scikit-learnを使って線形回帰を試してみました。

インストール

scikit-learnはpython用の機械学習ライブラリです。
pipでインストールします。

# pip install 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

f:id:pppurple:20160222154321j:plain:w500

2回目

# python linear_model.py
Coefficients:
 [ 96.59440538]
Intercept:
 -0.724090720802
score : 0.965655265098

f:id:pppurple:20160222154332j:plain:w500

1回目と2回目のスコアの値を見ると、
・1回目:0.63621451029
・2回目:0.965655265098
となっており、2回目のほうが数値が高いです。
スコアは重相関係数Rの2乗で寄与率もしくは決定係数と呼ばれます。
0 < R^{2} < 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

f:id:pppurple:20160222164307j:plain:w500

スコアが 0.472575447982 となっており、
図を見てもあまりフィットしてないことがわかります。

終わり。


【参考】