今回は線形回帰の実装(コード)をまとめていきます。
##■ 線形回帰の手順
次の6つのSTEPで進めます。
- モジュールの用意
- データの準備
- モデルの作成
- 予測値の算出
- 残差プロット
- モデルの評価
##1. モジュールの用意
最初に、必要なモジュールをインポートしておきます。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットを読み込むモジュール
from sklearn.datasets import load_boston
# 訓練データとテストデータを分割するモジュール
from sklearn.model_selection import train_test_split
# 線形回帰(最小二乗法)を行うモジュール
from sklearn.linear_model import LinearRegression
# 平均二乗誤差(MSE)で評価するモジュール
from sklearn.metrics import mean_squared_error
# 決定係数(r2_score)で評価するモジュール
from sklearn.metrics import r2_score
##2. データの準備 データの取得をした後、処理しやすいように分割を行います。
# Bostonデータセットの読み込み
boston = load_boston()
# 目的変数と説明変数に分ける
X, y = boston.data, boston.target
# 訓練データとテストデータに分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
##3. モデルの作成 最初に線形回帰の実行関数(インスタンス)を作成し、訓練データに当てはめます。 そうすると、最小二乗法によりモデル式(回帰式)の各重みを求めることができます。
# 線形回帰のインスタンスを作成
lr = LinearRegression()
# 最小二乗法により、各重みを求める
lr.fit(X_train, y_train)
# 切片を出力
print(lr.intercept_)
# 回帰係数(傾き)を出力
print(lr.coef_)
<出力結果>
lr.intercept_: 22.38235838998073
lr.coef_: [-1.30942592e-01 3.93397530e-02 3.34152241e-02 2.69312969e+00
-1.77337676e+01 3.95093181e+00 -1.16396424e-03 -1.51204896e+00
3.36066399e-01 -1.37052283e-02 -9.54346277e-01 8.23484120e-03
-5.17616471e-01]
lr.intercept_:切片(重み $w_0$)
lr.coef_:回帰係数・傾き(重み $w_1$ ~ $w_{13}$)
よって、下記のモデル式(回帰式)における具体的な数値が求まりました。
$ y = w_0 + w_1x_1+w_2x_2+ \cdots + w_{12}x_{12} + w_{13}x_{13}$
##4. 予測値の算出
先ほど作成したモデル式にテストデータ(X_test)を入れて、予測値(y_pred)を出します。
y_pred = lr.predict(X_test)
y_pred
<出力結果>
y_pred: [34.21868721 14.30330361 18.5687412 19.17046762 22.60218908 31.75197222
13.56424899 19.9953213 36.91942317 ..... 25.08561495, 13.68910956]
##5. 残差プロット モデルの評価をする前に、残差のプロットを見ておきます。 残差:予測値と正解値の差(y_pred - y_test)
# 描画オブジェクトとサブプロットの作成
fig, ax = plt.subplots()
# 残差のプロット
ax.scatter(y_pred, y_pred - y_test, marker = 'o')
# y = 0 の赤い直線をプロット
ax.hlines(y = 0, xmin = -10, xmax = 50, linewidth = 2, color = 'red')
# 軸ラベルを設定する
ax.set_xlabel('y_pred')
ax.set_ylabel('y_pred - y_test')
# グラフのタイトルを追加
ax.set_title('Residual Plot')
plt.show()
<出力結果>
赤い線(y_pred - y_test = 0)の上と下で、バランス良くデータが散らばっているので
予測値の出力に大きな偏りはないことが確認できます。
##6. モデルの評価
線形回帰では、下記2つの指標で評価を行います。
・平均二乗誤差(MSE)
・決定係数(r2_score)
# 平均二乗誤差(MSE)
print(mean_squared_error(y_test, y_pred))
# 決定係数
print(r2_score(y_test, y_pred))
<出力結果>
MSE: 19.858434053618794
r2_score: 0.7579111486552739
以上より、2つの指標で評価することができました。
##■ 最後に
線形回帰では上記1~6の手順をもとに、モデルの作成・評価を行っていきます。
今回は初学者の方向けに、実装(コード)のみまとめさせていただきましたが
今後タイミングを見て、理論(数式)についても記事を作成していければと思います。
ご精読いただき、ありがとうございました。
参考文献:Pythonによるあたらしいデータ分析の教科書
(Python 3 エンジニア認定データ分析試験 主教材)