重回帰分析の計算
以下の数式で、重回帰分析の計算を行うことができる。$w$は重みベクトルといい、各説明変数の影響度を表す。これは、予測したい情報に対して、与えられる各変数がその予測結果にどの程度の大きさの影響を与えるのかを判断するための値となる。
$$w = (X^TX)^{-1}X^Ty$$
この数式を計算していくためには、以下のステップに則って、計算していく必要がある。試しにやってみればわかるが、手で計算することもできるが、非常に計算が面倒であることがわかると思う。
$$ステップ1: X^TX $$
$$ステップ2: (X^TX)^{-1} $$
$$ステップ3: X^Ty $$
$$ステップ4: w = (X^TX)^{-1}X^Ty $$
$$ステップ5: \hat{y} = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b$$
入力値(サンプル)
X = np.array([
[1,2,3],
[1,2,5],
[1,3,4],
[1,5,9]
])
X
y = np.array([
[1],
[5],
[6],
[8]
])
y
numpyをインストール
試す事前に、numpyをインストールしておく。
import numpy as np
ステップ1
XtX = np.dot(X.T, X)
XtX
array([[ 4, 12, 21],
[ 12, 42, 73],
[ 21, 73, 131]])
ステップ2
XtX_inv = np.linalg.inv(XtX)
XtX_inv
array([[ 1.76530612, -0.39795918, -0.06122449],
[-0.39795918, 0.84693878, -0.40816327],
[-0.06122449, -0.40816327, 0.24489796]])
ステップ3
Xty = np.dot(X.T, y)
Xty
array([[ 20],
[ 70],
[124]])
ステップ4
w = np.dot(XtX_inv, Xty)
w
array([[-0.14285714],
[ 0.71428571],
[ 0.57142857]])
ステップ5
以上のステップを踏むことで、各変数の重み$w$(各変数がどの程度の大きさの影響を受けるか)が出せるようになり、最終的に予測モデルを次のように求めることができるようになる。
$$\hat{y} = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b$$
ここまでのステップを踏むことで、重み$w$をもとに、モデルを学習をさせたり、予測することができるようになる。つまり、それらを独自に実装しようとすると、先ほどの計算ステップを見てもわかる通り、非常に面倒な作業が必要となってくる。それらを簡単に済ませるようにするためのライブラリが、Scikt-learnとしてPythonで提供されている。
Scikit-learn
幅広い機械学習モデルをカバーしてしているライブラリ。ステップ1〜5を実施してみてもわかる通り、計算が面倒かつ時間が掛かってしまう。さらに、そこから予測値を推測するための計算も行わなければならないので、このライブラリを使用することが一般的となっている。
ここでやっていることとしては、LinearRegressionのインスタンス化(どういったアルゴリズムで予測モデルを構築するか)、選択したアルゴリズムで予測モデルを構築する、予測してみる。(実際には、他にも色々とやるべきことがあるらしいが、ここではこの3つのみ)
Scikit-learnのインストール & バージョン確認
import sklearn
sklearn.__version__
1.2.2
学習&重みベクトルの算出
この操作によって、生のデータをもとに学習が行われ、モデルを作ることができる。
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=False) #モデルの宣言
model.fit(X, y) #モデルの学習
model.coef_ #調整後のパラメータwの確認
array([[-0.14285714, 0.71428571, 0.57142857]])
この結果は、ステップ4の重みベクトル$w$と同じ結果となっている。sklearnを用いれば、ステップ1〜4を簡単に処理することができ、簡単にモデルを構築することができるようになる。
予測
x_new = np.array([[1, 3, 6]]) #入力値
y_pred = model.predict(x_new) #予測
y_pred
array([[5.42857143]])
学習済のモデルをもとに、予測することが可能となる。
補足事項
ベクトル
x = np.array([[1],[2],[3]])
x
array([[1],
[2],
[3]])
x.shape
(3, 1) ・・・・ 3行1列
行列
X = np.array([[1, 2],[3, 4]])
array([[1, 2],
[3, 4]])
転置
Xt = X.T
Xt
array([[1, 3],
[2, 4]])
逆行列
X_inv = np.linalg.inv(X)
X_inv
array([[-2. , 1. ],
[ 1.5, -0.5]])
行列積
XX_inv = np.dot(X, X_inv)
XX_inv
array([[1.0000000e+00, 0.0000000e+00],
[8.8817842e-16, 1.0000000e+00]])
その他
B = np.array([
[1, 2, 3],
[2, 3, 4]
])
row, col = B.shape
2行
3列
for b in B:
print(b)
print('-------')
[1 2 3]
-------
[2 3 4]
-------