【AI】機械学習 by Python:回帰分析編⑦~回帰係数・切片・モデルの精度の確認~

AI・機械学習

 前回

の続き。

 今回は、回帰分析の実行結果およびその精度を確認するコードについて説明する。
 下記に、解説対象のプログラムの実装例とその出力例を示しておく。

 

実装例

# モジュールのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn
from sklearn.linear_model import LinearRegression

# データセットのインポート
file=pd.read_csv('apartment.csv',encoding='cp932')
#データセットのサイズ確認
print('データセットのサイズ:',file.shape)

# 説明変数
X=file.iloc[:,1:]
# 目的変数
Y=file.iloc[:,0]

# 説明変数Xと目的変数を、学習データ(8割)とテストデータ(2割)に分割(random_stateは0)
X_train, X_test, Y_train, Y_test = sklearn.model_selection.train_test_split(X, Y, test_size=0.2, random_state=0)
# 分割の確認
print('分割の確認:',X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

# 回帰分析実行
# インスタンスの作成
model = LinearRegression()
# モデルの作成
model.fit(X_train, Y_train)

# 回帰直線の確認
# 切片
print('切片の値 = ', model.intercept_)
# 係数
print('係数の値 = ', model.coef_)

# 学習データからの予測値
pred_train = model.predict(X_train)
# テストデータからの予測値
pred_test = model.predict(X_test)

# 結果確認
print('学習データの平均二乗誤差: ', np.mean((Y_train - pred_train) ** 2))
print('テストデータの平均二乗誤差: ', np.mean((Y_test - pred_test) ** 2))
print('決定係数:',model.score(X_test,Y_test))

# モデルを使った計算
Xs=35 # 部屋の広さ[m^2]
Xt=10 # 駅から建物までの所要時間[min]
Xo=5 # 築年数[year]
price=model.intercept_+model.coef_[0]*Xs+model.coef_[1]*Xt+model.coef_[2]*Xo
print('部屋の広さ',Xs,'m^2、徒歩',Xt,'分、築',Xo,'年の建物の部屋の家賃は約',round(price,1),'万円である。')

出力例

データセットのサイズ: (100, 4)
分割の確認: (80, 3) (20, 3) (80,) (20,)
切片の値 =  7.506892589329363
係数の値 =  [ 0.15930654 -0.10031788 -0.14080724]
学習データの平均二乗誤差:  0.0006406930013219009
テストデータの平均二乗誤差:  0.0009590840329186921
決定係数: 0.999959366829125
部屋の広さ 35 m^2、徒歩 10 分、築 5 年の建物の部屋の家賃は約 11.4 万円である。

 実際にプログラムを実行したい場合は、下記ボタンよりcsvファイル「apartment.csv」をダウンロードしてプログラムの保存先に保存すること。

環境は下記を想定。
OS:Windows10(64bit版)
Pythonインストール環境:Anaconda3
Pythonバージョン:3.7
エディタ:Jupyter Notebook


6. 回帰係数・切片・モデルの精度の確認

 回帰分析(学習)が終了したところで、次に学習結果を確認する。

# 回帰直線の確認
# 切片
print('切片の値 = ', model.intercept_)
# 係数
print('係数の値 = ', model.coef_)

# 学習データからの予測値
pred_train = model.predict(X_train)
# テストデータからの予測値
pred_test = model.predict(X_test)

# 結果確認
print('学習データの平均二乗誤差: ', np.mean((Y_train - pred_train) ** 2))
print('テストデータの平均二乗誤差: ', np.mean((Y_test - pred_test) ** 2))
print('決定係数:',model.score(X_test,Y_test))

 

回帰係数:インスタンス名.coef_
切片:インスタンス名.intercept_

はそれぞれ、fit関数の実行で得られた回帰係数と切片を呼び出すコードである。

 

インスタンス名.predict(説明変数)

は前回にも登場した、モデルの目的変数(予測値)を呼び出すコードである。

 

np.mean(引数)

は対象となるデータセットの平均値を求めるコードである。

 

インスタンス名.score(説明変数,目的変数)

は決定係数を計算するコードである。
 決定係数とは回帰式の精度を表す指標の1つであり、0~1までの値をとる。
 回帰式上にすべてのデータが乗れば値は1、回帰式で全く説明できなければ値は0になる。

 

 以上を踏まえて、例のコードを詳しく見ていくと次のようになる。

print('切片の値 = ', model.intercept_)

⇒先の重回帰分析で求められた切片をprint関数で表示するためのコード。
 出力は下記のようになる。

切片の値 =  7.506892589329363

 

print('係数の値 = ', model.coef_)

⇒先の重回帰分析で求められた回帰係数をprint関数で表示するためのコード。
 今回は3変数の重回帰分析であるため、回帰係数も3つ求められ、出力は下記のようになる。

係数の値 =  [ 0.15930654 -0.10031788 -0.14080724]

 左から順に、部屋の面積、駅からの所要時間、築年数に掛かる回帰係数である。

 

pred_train = model.predict(X_train)
pred_test = model.predict(X_test)

⇒変数pred_trainおよびpred_testに、学習データおよびテストデータの説明変数を使って求めた予測値を代入するコード。

 

print('学習データの平均二乗誤差: ', np.mean((Y_train - pred_train) ** 2))
print('テストデータの平均二乗誤差: ', np.mean((Y_test - pred_test) ** 2))

⇒学習データおよびテストデータそれぞれにおいて、目的変数の教師データと予測値の残差の二乗の平均値(平均二乗誤差)を計算し、print関数で出力するコード。
 出力例としては下記のようになる。

学習データの平均二乗誤差:  0.0006406930013219009
テストデータの平均二乗誤差:  0.0009590840329186921

 教師データと予測値の差の二乗の平均であるため、基本的には小さい値であればあるほどモデルの精度が良いといえる。
 特に今回は、学習時に利用していないテストデータの平均二乗誤差が、テストデータのそれと遜色ないことからも、良い予測ができていると言える。
 もちろん、すべての場合において平均二乗誤差が小さければよいということはなく、モデルの種類によっては闇雲に信じるのは危険な場合があるため注意は必要だ。

 

print('決定係数:',model.score(X_test,Y_test))

⇒テストデータを使って決定係数を算出し、print関数で出力するコード。
 出力例としては下記にようになる。

決定係数: 0.999959366829125

 上の例では決定係数は0.9と高い値であり、今回のモデルであれば高い精度でデータが回帰式上に乗ると考えられる。

次回予告

 次回で回帰分析の実装例の詳説は最後。

 最後は、今回の学習で得られたモデルで家賃の予測計算を実行する。

 

 END

 

 ※追記
 作ったモデルを利用して家賃を計算させてみた。


コメント

タイトルとURLをコピーしました