scikit-learnによる線形回帰

scikit-learnによる線形回帰

概要

サンプルデータセットに対し、scikit-learnの線形回帰(LinearRegression)を用いて回帰分析を行う。

環境

Python 3.6.3
scikit-learn 0.20.2

線形回帰

  • データセット:make_regression()を使用
  • データは訓練用データとテスト用データに分けて使用する
  • 結果(学習結果)は、係数および切片となる
import numpy as np
import matplotlib.pyplot as plt

from sklearn import linear_model
from sklearn.datasets import make_regression

# 回帰に使用するデータセットを生成
X, y = make_regression(
    n_samples=100,
    n_features=1,
    n_informative=1,
    bias=0.0,
    noise=20.0)

# 訓練用データとテスト用データに分割
X_train, X_test = X[:80], X[-20:]
y_train, y_test = y[:80], y[-20:]

# LinearRegressionによる回帰
regr = linear_model.LinearRegression()
regr.fit(X_train, y_train) # 重みを学習
print('Coefficients = ', regr.coef_) # 係数
print('Intercept = ', regr.intercept_) # 切片
X_pred = sorted(X_train)
y_pred = regr.predict(X_pred) # モデルから予測

結果の出力(例)

Coefficients =  [91.0507764]
Intercept =  -0.975756104957139

f:id:storikai:20190221004454p:plain
LinearRegression1
※train:訓練用データ
※test:テスト用データ
※predict:回帰直線(推測データ)

結果の評価

  • 以下の評価尺度を算出する
    • 決定係数
    • 残差
    • 平均二乗誤差
# 結果の評価
score_train = regr.score(X_train, y_train) # 決定係数
score_test = regr.score(X_test, y_test)
print("Score train = ", score_train)
print("Score test = ", score_test)

y_test_pred = regr.predict(X_test)
residual = y_test_pred - y_test # 残差
y_train_pred = regr.predict(X_train)
mse_train = mean_squared_error(y_train, y_train_pred) # 平均二乗誤差
mse_test = mean_squared_error(y_test, y_test_pred)
print('MSE train = ', mse_train)
print('MSE test = ', mse_test)

r2train = r2_score(y_train, y_train_pred)
r2test = r2_score(y_test, y_test_pred)
print('r^2 train = ', r2train)
print('r^2 test = ', r2test)

結果の出力

Score train =  0.9411563698788179
Score test =  0.9547668252932158
MSE train =  383.8400680151228
MSE test =  285.09263899485285
r^2 train =  0.9411563698788179
r^2 test =  0.9547668252932158

f:id:storikai:20190221004604p:plain
LinearRegression2