【AI】機械学習 by Python:回帰分析編①~実装例と概説~

AI・機械学習

 前回

にて、機械学習で用いるプログラミング言語「Python」をインストールした。

 早速今回から、実際に機械学習のプログラムをPythonコードで書き、それを1つずつ詳しく見ていく。

 まずは教師あり学習の1つである、回帰分析から。

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


実装例

 実際に、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

 

 ※追記
 回帰分析のプログラムの詳説。まずは「モジュールのインポート」から。


コメント

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