前回
の続き。
今回は、学習データとテストデータの準備について説明する。
下記に、解説対象のプログラムの実装例とその出力例を示しておく。
実装例
# モジュールのインポート
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」をダウンロードしてプログラムの保存先に保存すること。
4. 学習データとテストデータの準備
コード説明に入る前に、学習データとテストデータってそもそも何かという話から。
学習データとは、モデルの学習時に使われるデータである。
今回の例で言うと、回帰分析によって
\begin{align}
Y=A_{s}X_{s}+A_{t}X_{t}+A_{o}X_{o}+B \tag{1}\label{juukaiki1}
\end{align}
における、回帰係数\(A_{s},A_{t},A_{o}\)と切片\(B\)を求める際に使われるデータが学習データである。
これに対してテストデータとは、学習データを使って得られたモデルが適切か(今回の回帰分析でいえば、求められた回帰係数と切片が妥当な値か)を、その名の通りテストするためのデータである。
ゆえに、テストデータはモデルの学習時には使用されない。
では改めてコードを見てみる。
# 説明変数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)
変数1, 変数2=sklearn.model_selection.train_test_split(データセット)
で、データセットの内学習データを変数1、テストデータを変数2に格納される。
分割したいデータセットが複数ある場合は
変数1-1, 変数1-2, 変数2-1, 変数2-2=sklearn.model_selection.train_test_split(データセット1, データセット2)
としてデータセット名を並べて必要な変数を追加すればよい。
変数1-1と1-2にそれぞれデータセット1の学習データとテストデータ、変数2-1と2-2にそれぞれデータセット2の学習データとテストデータが格納され、データが分割される。
他にも引数を指定することもできるが、今回用いている引数は下記の2つ。
・test_size:テストデータの割合を0~1の間で指定する。
・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)
⇒説明変数Xのデータを説明変数の学習データX_trainとテストデータX_testに、目的変数Yのデータを目的変数の学習データY_trainとテストデータY_testに分割するためのコード。
ただし、学習データとテストデータの比率は8:2であり、計算のたびにデータがランダムに変わらないようにしている。
print('分割の確認:',X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)
⇒分割後のデータX_train、X_test、Y_train、Y_testのデータ構造を確認するためのコード。
今回は100個のデータを8:2に分割しているため、出力は下記のようになる。
分割の確認: (80, 3) (20, 3) (80,) (20,)
次回予告
ようやく半分に差し掛かった。
次回は実装例の肝、回帰分析の実行コードの解説に入る。
END
※追記
回帰分析の実行コードについて執筆。
コメント