回帰とは
回帰とは得られたデータxを \({\bf y}=f({\bf x})\)という関数に当てはめることを言います。
この関数のことをモデルとも言います。
例えば、以下のようなデータがあった場合、
以下のように\({\bf y}=f({\bf x})\)に当てはめることです。
そして作成したモデル\({\bf y}=f({\bf x})\)を用いて、
新しいデータ\(x_{new}\)が出た時の予測値\(y_{new}\)を算出します。
重回帰とは
入力データが多次元の場合の回帰のことを言います。
つまり入力データ\({\bf x}\)が以下のように多次元のときです。
逆に入力データが一次元の場合、単回帰と言います。
重回帰を試してみる(sklearnを用いて)
今回は入力が2つ\(x_0, x_1\)のシンプルなモデルを仮定します。
\begin{aligned}
y = a x_0+ b x_1 + c
\end{aligned}
$$
まず、必要なライブラリ等をimportします。
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model
シンプルなデータの作成
テスト用のデータはこのモデルから出力された値に
一様乱数を加えた値とします。
\begin{aligned}
y = 0.2 x_0+ 0.5 x_1 + 1.0
\end{aligned}
$$
コードとしては以下のようになります。
tx0 = np.arange(-5,5,0.2) tx1 = np.arange(-5,5,0.2) x0 = tx0 + np.random.randn(len(tx0)) x1 = tx1 + np.random.randn(len(tx1)) y = 0.2*x0 + 0.5*x1 + 1.0 + np.random.randn(len(x0))
どのようなデータになるかplotしてみます。
plt.figure(figsize=(6,5)) from mpl_toolkits.mplot3d import axes3d, Axes3D plt.legend() ax = plt.subplot(1,1,1,projection="3d") ax.set_xlabel("x0") ax.set_ylabel("x1") ax.set_zlabel("y") ax.scatter(x0, x1, y, label="datas")
重回帰の実行
scikit-learnを用いるの重回帰自体は非常に簡単に実行できます。
# データの結合。[[x0_0, x1_0], [x0_1, x1_1], ...] x0_x1 = np.c_[x0, x1] # 回帰モデルの作成と実行 model = linear_model.LinearRegression() reg = model.fit(x0_x1, y) a = reg.coef_[0] b = reg.coef_[1] c = reg.intercept_ print("a:", a) print("b:", b) print("c:", c)
得られたパラメータはcoef_とintercept_に格納されています。出力してみます。
a: 0.15718402291219993 b: 0.5663712446368052 c: 0.8816472811124664
各変数にノイズを加えているので、元々のモデルのパラメータとは完璧に一致していませんが、けっこう良い線いっています。
まぁ得られたパラメータによって、どんな回帰直線を引けるかプロットしてましょう。
y_hat = a*tx0+b*tx1+c ax.plot(tx0, tx1, y_hat, c="r", label="result")
うまくデータに対する回帰直線が引けていますね!
ソースコードの全体像
重回帰のパラメータの解析解を最小二乗法によってもとめる
最小二乗法とは
解析的(数学的)にパラメータを求めてみましょう。
最小二乗法とは、データ群とモデル(関数)の二乗誤差を最小にするパラメータを求める手法で、回帰問題等でよく用いられる手法です。
少し数式が多くなりますが丁寧に解説していきます。
二乗誤差
まず最小化したい二乗誤差ですが、
これは重回帰モデル(関数)と実際のデータと差(誤差)を二乗した誤差です。
数式で表すと、
二乗誤差の最小化するパラメータ
では、先程の二乗誤差を最小化するパラメータを求めてみましょう。
手順としては、以下のようになります。
- 二乗誤差をパラメータ𝑎, 𝑏によって微分(偏微分)し、勾配が0となる2つの方程式を得る
- 各パラメータを微分したことによって得られた方程式を解いて、パラメータを求める
では、最小二乗法によってパラメータを求めてみましょう。
二乗誤差の微分
まず、二乗誤差を各パラメータ\(w_i\)によって偏微分します。
各パラメータによって偏微分して得られた方程式を1つの式で表現すると、
勾配が最小となる\({\bf w}\)を求める
得られた方程式を展開して、
勾配が0となる\({\bf w}\)を求めます。
丁寧に展開していきます。
中々長かったですが、
最小二乗法によってパラメータを求めることができました。