【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


5. 回帰分析の実行

 目的変数、説明変数の準備が完了したら、いよいよ回帰分析を実行(教師データを用いて学習)する。

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

 

 最初に記述されているのはクラスからインスタンスを作成するためのコードである。

インスタンス名=クラス名()

 モジュールのインポートでの解説

でも触れたが、「クラス」とは仕様書(設計図)のようなものであり、そして仕様書の形では関数を呼び出すなどして中身を利用することができない。

 インスタンスとは、いわばクラスをモジュールのようなものに作り変えたものであり、インスタンスから関数を呼び出して使用することができる。

 

LinearRegressionのインスタンス名.fit(説明変数,目的変数)

は説明変数と目的変数(教師データ)を使って線形回帰(学習)を実行する関数であり、クラス「LinearRegression」内で定義されている。
 単回帰分析だけでなく、重回帰分析にも対応している。

 具体的には下記のような流れで計算が実行される。

① 教師データを取り込む。

目的変数説明変数1説明変数2・・・説明変数\(j\)
\(Y_{\text{data},1}\)\(X_{\text{data},1,1}\)\(X_{\text{data},1,2}\)・・・\(X_{\text{data},1,j}\)
\(Y_{\text{data},2}\)\(X_{\text{data},2,1}\)\(X_{\text{data},2,2}\)・・・\(X_{\text{data},2,j}\)










\(Y_{\text{data},i}\)\(X_{\text{data},i,1}\)\(X_{\text{data},i,2}\)・・・\(X_{\text{data},i,j}\)

 

② 線形モデルを仮定し、モデルの目的変数(予測値)\(Y_{\text{model},i}\)を定義する。

\begin{align}
\begin{cases}
\displaystyle{Y_{\text{model},1}=B+\sum_{k=1}^{j}A_{k}X_{\text{data},1,k}}\\
\displaystyle{Y_{\text{model},2}=B+\sum_{k=1}^{j}A_{k}X_{\text{data},2,k}}\\
        \vdots\\
\displaystyle{Y_{\text{model},i}=B+\sum_{k=1}^{j}A_{k}X_{\text{data},i,k}}
\end{cases}
\end{align}

 

③ 教師データの目的変数\(Y_{\text{data},i}\)とモデルの目的変数(予測値)\(Y_{\text{model},i\)の差を取って二乗したものの和\(S\)(残差の二乗和)をとる。

\begin{align}
S=\sum_{k=1}^{i}(Y_{\text{data},i}-Y_{\text{model},i})^{2}=\sum_{k=1}^{i}\left\{Y_{\text{data},i}-\left(B+\sum_{k=1}^{j}A_{k}X_{\text{data},i,k}\right)\right\}^{2}
\end{align}

 

④ 残差の二乗和\(S\)が最小値を取るように、回帰係数\(A_{j}\)と切片\(B\)を決定する。

 この方法は最小二乗法と呼ばれ、推論の世界ではメジャーな手法の1つである。

 

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

model = LinearRegression()

⇒「LinearRegression」というクラスを、「model」という名前のインスタンスに作り変えるコード。

 

model.fit(X_train, Y_train)

⇒インスタンス「model」から関数「fit」を呼び出し、X_trainを説明変数、Y_trainを目的変数として重回帰分析を実行するコード。

次回予告

 最小二乗法の詳細な手法については、気が向いたら別記事にでも書こうと思う。

 次回から、学習から得られた結果を吟味、利用する段階に入る。

 

 END

 

 ※追記
 モデルの精度を確認するコードの解説。


コメント

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