前回
にて、機械学習で用いるプログラミング言語「Python」をインストールした。
早速今回から、実際に機械学習のプログラムをPythonコードで書き、それを1つずつ詳しく見ていく。
まずは教師あり学習の1つである、回帰分析から。
実装例
実際に、Pythonで回帰分析のプログラムを実装した場合にどうなるか。
下に例を示す。
# モジュールのインポート
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と目的変数Yを、学習データ(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 万円である。
上記プログラムは何をしているかというと、
① モデルの設定
アパートの部屋の家賃\(Y\)円が、部屋の広さ\(X_{s}\,\text{m}^2\)、駅から建物までの所要時間\(X_{t}\)分、築年数\(X_{o}\)年の関数であり、
\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\)は切片)。
② 学習(回帰分析の実行)
アパートの部屋の家賃、広さ、駅から建物までの所要時間、築年数を集積したデータセット「apartment.csv」を使って、(\ref{juukaiki1})の係数と切片を求める。
③ 予測
求めた係数\(A_{s},A_{t},A_{o}\)と切片\(B\)を使って、部屋の家賃を予測する。
といったことをしている。
(データの分割やモデルの評価などこまごましたこともやっているが、それらのついては追々詳しく見ていく。)
実際にプログラムを実行したい場合は、下記ボタンよりcsvファイル「apartment.csv」をダウンロードしてプログラムの保存先に保存すること。
回帰分析概説
回帰分析とは上で見てきたように、
① 予測したい値\(Y\)がある変数\(X\)の関数になっていると仮定し、
② その関数の形を予想した上で、\(Y\)と\(X\)のデータ群から係数\(A\)と切片\(B\)を求めること。
と、今のうちは思っていればよい。
(というか正確には、私自身がこの程度の認識しか持ち合わせていない。)
係数と切片の決定にデータセットを用いることから、回帰分析は教師あり学習に該当する。
上で見てきた例では、3変数の一次関数を仮定している。
このような一次の変化を仮定した回帰を線形回帰と呼び、特に変数が一種類だけのものを単回帰分析、変数が複数種存在するものを重回帰分析と呼ぶ。
上の例は3変数であるため、重回帰分析に該当する。
もちろん、扱う関数は一次関数だけである必要はなく、二次関数や三角関数でも構わない。
このような、一次以外の変化も含めた回帰を非線形回帰と呼ぶ。
実際にデータセットから散布図を作成してデータの分布を確認すれば、どの関数が最適かあらかた見当をつけることも可能だ。
次回予告
次回から、上で示したプログラムのコード一文一文を詳しく見ていく。
それぞれのコードが何を意味し、何の役割を果たしているのか、自分の勉強も兼ねながらまとめていくつもりだ。
END
※追記
回帰分析のプログラムの詳説。まずは「モジュールのインポート」から。
コメント